Excel 2016 打破了之前工作的 VBA 宏

Excel 2016 breaks previously working VBA macro

我在 Excel 中开发了一个小的 VBA 宏,它应该在工作簿更改期间将第 15 行中的单元格值添加到第 6 行中的单元格值(在我的例子中输入第 15 行中的数字并按 Tab 键)。

最初,我在 Excel 2013 年开发并使用了它,然后我切换到 Mac 并从那以后在 Excel 和 Mac 2011 年使用它。现在,我已经为 Mac 2016 安装了 Excel,突然之间,宏不再起作用了。

这是脚本:

Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("C15:H15")) > 0 Then
            Call copySub
    End If
End Sub

Sub copySub()
    Sheets("sheet1").Protect , UserInterFaceOnly:=True
    For i = 3 To 8
        Cells(6, i).Value = Cells(6, i).Value + Cells(15, i).Value
        Cells(15, i).Value = 0
    Next i
End Sub

当我在 Excel 2016 年输入一个值并按 Tab 键时,出现运行时错误 91 "Object variable or With block variable not set"。错误似乎出现在行中:

Cells(6, i).Value = Cells(6, i).Value + Cells(15, i).Value

我也曾尝试将总和存储在变量中,然后再将其分配给 Cells(6, i).Value,但这也无济于事。

Microsoft 是否更改了 sheet 保护的逻辑,尤其是将参数 UserInterFaceOnly 设置为 true?或者这里发生了什么?

希望你能帮助我。

谢谢, 矮胖的

您确定您已正确复制此代码吗?它不可能在 Excel.

的任何版本中工作

您的问题是:

  1. Intersect returns 一个 Range 对象,因此您的代码会抛出 91 错误。
  2. 您的行 Sheets("sheet1").Protect ... 中很可能存在大小写错误,因为它可能被称为 "Sheet1"。如果是这样,这将引发 91 错误。
  3. 如果您将作品sheet 的名称从"sheet1" 更改为其他名称,则会抛出 91 错误。
  4. 为什么你只保护 Worksheet_Change 的 sheet。这真的应该在 Workbook_Open 中完成吗?如果这样做,用户如何在特定单元格不受保护的情况下更改单元格?

不清楚您指的是哪个作品sheet,以及copySub例程在哪里举行。我已经更新了您的代码,因为它是为了删除主要错误并以提名您的工作的身份编写sheet - 您必须根据需要进行调整。祝你好运。

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim ws As Worksheet

    Set ws = Target.Worksheet
    If Not Intersect(Target, ws.Range("C15:H15")) Is Nothing Then
        Call copySub(ws)
    End If
End Sub

Sub copySub(ws As Worksheet)
    ws.Protect , UserInterFaceOnly:=True
    Application.EnableEvents = False
    For i = 3 To 8
        ws.Cells(6, i).Value = ws.Cells(6, i).Value + ws.Cells(15, i).Value
        ws.Cells(15, i).Value = 0
    Next i
    Application.EnableEvents = True
End Sub