1

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

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

这是脚本:

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“对象变量或未设置块变量”。该错误似乎发生在该行中:

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

在将总和分配给之前,我还尝试将总和存储在变量中Cells(6, i).Value,但这也无济于事。

Microsoft 是否更改了工作表保护的逻辑,尤其是在参数UserInterFaceOnly设置为 的情况下true?或者这里发生了什么?

我希望你能帮助我。

谢谢,胖乎乎的

4

1 回答 1

2

您确定您已正确复制此代码吗?它不可能在任何版本的 Excel 中工作。

你的问题是这些:

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

目前尚不清楚您指的是哪些工作表以及copySub例程所在的位置。我已经更新了您的代码,因为它是为了删除主要错误并写入以提名您的工作表的能力 - 您必须根据需要进行调整。祝你好运。

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
于 2015-10-24T09:35:07.303 回答