在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
有没有人遇到过这个?任何帮助将不胜感激。
预先感谢
答案 0 :(得分:1)
ListIndex=0
分配触发一个OnChanged
事件,就像用户选择一个项目一样。我能够通过以下方式在Excel 2013中重现此内容:
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
因此您可以尝试以下两种方法之一:
请勿设置ListIndex
。如果我注释掉该行,则Change
事件不会触发(我在“即时”窗口中没有收到“已更改”消息)。
使用@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