我在Excel中开发了一个小的VBA宏,它应该在第15行中将单元格的值添加到工作簿更改期间第6行中单元格的值(在我的情况下输入第15行中的数字并按Tab键)。 / p>
最初,我在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
?或者这里发生了什么?
我希望你能帮助我。
谢谢, chuky
答案 0 :(得分:2)
您确定已正确复制此代码吗?在任何版本的Excel中都无法使用它。
你的问题是这些:
Intersect
会返回Range
个对象,因此您的代码会抛出91错误。Sheets("sheet1").Protect ...
中最有可能出现错误,因为它可能被称为" Sheet1"。如果是这样,这将导致91错误。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