Excel 2016打破以前工作的VBA宏

时间:2015-10-23 20:58:39

标签: excel macos excel-vba excel-2016 vba

我在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

1 个答案:

答案 0 :(得分:2)

您确定已正确复制此代码吗?在任何版本的Excel中都无法使用它。

你的问题是这些:

  1. Intersect会返回Range个对象,因此您的代码会抛出91错误。
  2. 您的行Sheets("sheet1").Protect ...中最有可能出现错误,因为它可能被称为" Sheet1"。如果是这样,这将导致91错误。
  3. 如果您从" sheet1"更改了该工作表名称,则会引发91错误。
  4. 为什么您只在Worksheet_Change保护工作表。这应该在Workbook_Open中完成吗?如果你这样做,用户如何在没有特定细胞免于保护的情况下更换细胞?
  5. 不清楚您指的是哪些工作表以及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