excel VBA运行时错误“-2147417848(80010108)”:对象“Worksheet”的方法“Range”失败

1aaf6o9v  于 2022-12-27  发布在  其他
关注(0)|答案(1)|浏览(882)

每当C15中的值发生更改时,我都想将C15的值复制到D15。单元格C15有一个基于同一工作表中另一个单元格的简单"if函数"。每当我尝试使用代码时,它最初都能工作(值被复制到单元格D15)。然而,一秒钟后,我收到以下错误:VBA运行时错误"-2147417848(80010108)":对象"Worksheet"的方法"Range"失败。
这是我的代码:

Private Sub Worksheet_Calculate()
    Dim Xrg As Range
    Set Xrg = Sheets("Calculator").Range("C15")
    If Not Intersect(Xrg, Sheets("Calculator").Range("C15")) Is Nothing Then
        Range("C15").Copy
        Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    End If
End Sub

如果我尝试调试它,它会告诉我错误在这里:

Set Xrg = Sheets("Calculator").Range("C15")

注意:"Calculator"是工作表的正确名称

bttbmeg0

bttbmeg01#

我无法重现您的错误,我可以猜测它与C15中的"IF"公式有关
但我给你点建议
1.不必要的SetIf Not...检查
设置Xrg,然后检查同一范围是否为Nothing是无用的,因为它永远不会是Nothing
所以你可以直接去

Private Sub Worksheet_Calculate()
    Range("C15").Copy
    Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
End Sub

1.清除剪贴板
Copy方法之后使用Range对象的PasteSpecial方法,将使剪贴板被后者的结果占据(正如您所看到的,复制的单元格保持高亮显示),这可能会影响以下操作
那么好习惯是使用以下命令释放剪贴板:

Application.CutCopyMode = False

因此:

Private Sub Worksheet_Calculate()
    Range("C15").Copy
    Range("D15").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
End Sub

1.由于您只对复制/粘贴值感兴趣,因此使用Range对象的Value属性

Private Sub Worksheet_Calculate()
   Range("D15").Value = Range("C15").Value
End Sub
    • 编辑**

再详细说明一下:
每次C15中的值改变时,我想将C15的值复制到D15。
我的理解是您不能使用Worksheet_Change()事件,因为C15更改值时不会将其作为计算结果触发
为了仅在C15更改其值 * 时将C15值复制到D15 *,您可以使用Static变量,该变量在后续宏运行中保存其值:

Option Explicit    

Private Sub Worksheet_Calculate()    
    Static lastC15Value As Variant 
    
    With Range("C15")
        If lastC15Value <> .Value2 Then
            Range("D15").Value = .Value
            lastC15Value = .Value2
        End If
    End With
End Sub

如果工作表计算也可以由不影响C15的单元格触发,并且计算非常耗时,则此选项非常有用
而如果工作表计算总是影响单元格C15的值,则可以坚持使用前面的代码

相关问题