excel 每当C15中的值发生更改时,将C15的值复制到D15:运行时错误“-2147417848(80010108)”:对象“Worksheet”的方法“Range”失败

c0vxltue  于 2023-08-08  发布在  其他
关注(0)|答案(1)|浏览(133)

每次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")


注意:“计算器”是工作表的正确名称

6mzjoqzu

6mzjoqzu1#

我不能重现你的错误,我猜它与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.清除剪贴板
如果在Range对象的Copy对象之后使用PasteSpecial对象的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的值,那么您可以坚持使用前面的代码

相关问题