VBA宏从工作簿打开时触发了不同的宏

时间:2018-09-06 12:07:37

标签: vba excel-vba events userform

在VBA的ThisWorkbook工作表中,我有一段相当简单的代码。如您所见,此代码将使用服务器名称填充组合框。想法是,用户将在打开工作簿后选择此服务器,然后这将激活基于server变量的宏,以使用数据库列表填充第二个组合框。

为了填充此组合框,名为CB_Server_Change的宏使用ADODB连接来访问服务器并拉回数据库名称以供用户选择。

但是,在打开此工作簿时,该工作簿会冻结并最终在调试时出现无法连接服务器的错误。这不足为奇,因为在打开工作簿时,用户没有机会选择任何变量。

在尝试调试此代码时,我发现在逐步通过.AddItem“ M01-SQL-P09-DB2”移至.ListIndex = 0行时,它只是跳至工作表上的宏(“控制菜单”),组合框位于并尝试运行CB_Server_Change宏?

我无法弄清为什么它不只是按要求填充组合框,我根本没有引用Control Menu工作表,也没有引用ThisWorkbook Workbook_Open()宏中的CB_Server_Change宏。

    Private Sub Workbook_Open()

    With Application
        .Calculation = xlManual
        .EnableEvents = False
        .ScreenUpdating = False
    End With

        With Worksheets("Control Menu").CB_Server
            .Clear
            .AddItem "Select Server"
            .AddItem "M01-SQL-P09-DB2"
            .ListIndex = 0
        End With

    'Restore the settings.
    With Application
        .Calculation = xlAutomatic
        .EnableEvents = True
        .ScreenUpdating = True
    End With

End Sub

有没有人遇到过这个?任何帮助将不胜感激。

预先感谢

2 个答案:

答案 0 :(得分:1)

ListIndex=0分配触发一个OnChanged事件,就像用户选择一个项目一样。我能够通过以下方式在Excel 2013中重现此内容:

  • 创建一个空的XLSM
  • 将ActiveX组合框添加到Sheet1
  • 选择Developer | View Code,从而在ComboBox1_Change中创建了Sheet1函数。
  • Debug.Print "Changed"添加到ComboBox1_Change
  • ThisWorkbook中,添加一个子项:

    Private Sub Workbook_Open()
        Debug.Print "Opening"
        With Sheet1.ComboBox1
            .Clear
            .AddItem "foo"
            .AddItem "bar"
            .ListIndex = 0
        End With
        Debug.Print "done opening"
    End Sub
    
  • 保存,关闭和重新打开。结果(在立即窗口中):

    Opening
    Changed
    done opening
    

因此您可以尝试以下两种方法之一:

  1. 请勿设置ListIndex。如果我注释掉该行,则Change事件不会触发(我在“即时”窗口中没有收到“已更改”消息)。

  2. 使用@Nathan_Sav的想法:手动告诉组合框Change代码不执行任何操作。

第二个想法的示例:

ThisWorkbook中,添加一个变量:

Option Explicit

Public Initialized As Boolean     ' <--- new

Private Sub Workbook_Open()
    Debug.Print "Opening"
    Initialized = False           ' <---
    With Sheet1.ComboBox1
        .Clear
        .AddItem "foo"
        .AddItem "bar"
        .ListIndex = 0
    End With
    Initialized = True            ' <---
    Debug.Print "done opening"
End Sub

Sheet1中,添加:

Option Explicit

Private Sub ComboBox1_Change()
    If ThisWorkbook.Initialized Then  ' <--- test the variable
        Debug.Print "Changed"
    End If
End Sub

这样,如果您仍在初始化(仍在Workbook_Open中),则可以跳过不想运行的代码。当我使用上述代码打开工作簿时,在“立即”窗口中没有收到“已更改”消息,表明Initialized的测试正在按预期进行。

答案 1 :(得分:1)

我认为您可能在填充时触发了change事件。尝试添加名为blnSetup或类似名称的公共变量。填充时将其设置为true,之后再设置为false,然后在change事件中检查此变量。

blnSetup=True
With Worksheets("Control Menu").CB_Server
     .Clear
     .AddItem "Select Server"
     .AddItem "M01-SQL-P09-DB2"
     .ListIndex = 0
End With
blnSetup=false

然后在组合更改事件中

if not blnSetup then
     ......
end if