excel VBA代码无法正常工作

时间:2013-10-07 10:16:54

标签: excel excel-vba excel-2010 vba

我有一张带有VBA代码的excel表格如下

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Row = 1 And Target.Column = 5 Then
        Dim iRet As Integer
        If Not IsEmpty(Range("AZ1").Value) Then
            iRet = MsgBox("You have already selectd a Size Template", _
                          vbOKOnly, "Select Size Template")
            Exit Sub
        End If

        Dim arr As Variant
        arr = Split(Target, ",")
        Range("R14:AZ14").ClearContents
        Range("R14:AZ14").NumberFormat = "@"
        Range("R14", Cells(14, UBound(arr) + 18)) = WorksheetFunction.Transpose( _
                                        WorksheetFunction.Transpose(arr))
        Range("AZ1").Value2 = Target
    End If
End Sub

我将excel文件保存为.xlsm(启用宏的excel文件)并在另一个文件中打开。这个代码在我的机器上工作正常。不在任何其他机器上。我启用了marco并允许Trust访问VBA ojbect模型。任何人都可以在这里找出问题所在。两个mahcines中的Excel版本也相同 enter image description here

1 个答案:

答案 0 :(得分:2)

我想详细说明我的评论,这是正确的建议。

首先,让我再说一遍 - 你需要以这种方式开启事件

Application.EnableEvents = true

您可以在VBA / IDE编辑器的立即窗口中运行一次。现在我们知道就是这样!

第二,如果您决定使用任何其他子程序(或事件,但这很奇怪)打开事件,请记住可能有一些其他子程序,函数或加载项要求关闭事件。只要您不确定为什么事件不起作用,您应该在宏不再需要它们之后让它们不能正常工作。因此,我的建议是每次关闭文件时关闭事件。因此,您可以将此事件添加到ThisWorkbook module

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = False
End Sub

额外提示。最好的选择是在开始时读取事件状态,保留此信息直到您关闭文件。您可以按以下步骤执行此操作:

A)在您的文件中声明公共变量

Public boEventsStatus as Boolean

B)打开文件时读取状态(你需要弄清楚这行代码的位置)

boEventsStatus = Application.EnableEvents

C)按开头所述开启事件

D)使用此BeforeClose事件:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.EnableEvents = boEventsStatus
End Sub