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.
的任何版本中工作
您的问题是:
Intersect
returns 一个 Range
对象,因此您的代码会抛出 91 错误。
- 您的行
Sheets("sheet1").Protect ...
中很可能存在大小写错误,因为它可能被称为 "Sheet1"。如果是这样,这将引发 91 错误。
- 如果您将作品sheet 的名称从"sheet1" 更改为其他名称,则会抛出 91 错误。
- 为什么你只保护
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
我在 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.
的任何版本中工作您的问题是:
Intersect
returns 一个Range
对象,因此您的代码会抛出 91 错误。- 您的行
Sheets("sheet1").Protect ...
中很可能存在大小写错误,因为它可能被称为 "Sheet1"。如果是这样,这将引发 91 错误。 - 如果您将作品sheet 的名称从"sheet1" 更改为其他名称,则会抛出 91 错误。
- 为什么你只保护
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