VBA: 在工作表而非用户窗体上填充 ListBox ActiveX 控件
VBA: Populating ListBox ActiveX control, on worksheet and not user form
我正在尝试填充列表框(ActiveX 控件)。此列表框位于我工作簿的 sheet 标签 "Dashboard" 上,而不是用户表单。我想用标记为 "Data".
的 sheet 范围填充它
我的问题是,如果我在工作簿打开事件过程中填充它,当工作簿打开时我会收到一个错误 "Can't execute in break mode." 但是,根本没有断点处于活动状态。
如果我在 "Dashboard" worksheet 活动事件过程中填充它,它不会在工作簿打开时填充。只有当我点击另一项工作sheet,然后返回到仪表板工作sheet,它才会出现,然后它就会出现。
是否有更好的方法来填充列表框以使其始终填充并准备就绪?我有很多与列表框关联的 vLookup 函数,如果没有填充列表框,那么我的其余代码将无法工作。
我将 post 我目前拥有的代码。第一个是当我尝试通过 workbook_open 偶数过程填充列表框时。第二种是通过"Dashboard"工作sheet激活程序。
Private Sub Workbook_Open()
Dim strName As String
Dim blDone As Boolean
Dim cPlanets As MSForms.ListBox
Dim vArray As Variant
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets
vArray = shtData.Range("Planets").value
cPlanets.List = vArray
cPlanets.ListIndex = 3
'input box message for user when workbook opens up
strName = InputBox("Hello! Please enter your name", "Welcome!")
'check if there is a name entered via loop and if statement
Do
If Len(strName) = 0 Then
'if no name entered, ask user again
MsgBox ("Please enter a valid name to continue"), vbCritical, "Valid Name Required"
'ask user to type in name again
strName = InputBox("Hello! Please enter your name", "Welcome!")
Else
'display message with information for user
MsgBox ("Hello, " & strName)
blDone = True
End If
'finish loop statement
Loop Until blDone = True
下一个代码是我在 Sheet3 代码工作中的代码sheet激活程序
Private Sub Worksheet_Activate()
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")
lstPlanets.List = shtData.Range("Planets").value
lstPlanets.ListIndex = 3
End Sub
您将 cPlanets 声明为 MSForms.ListBox,但在您的问题中您说您正在 sheet 上使用 ActiveX 列表框。所以你应该将 cPlanets 声明为一个对象,比如:
Dim cPlanets As Object
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets
我在另一台计算机上试过这段代码,它有效。看来这是导致问题的计算机配置。该代码在多台不同的计算机上运行正常。
我正在尝试填充列表框(ActiveX 控件)。此列表框位于我工作簿的 sheet 标签 "Dashboard" 上,而不是用户表单。我想用标记为 "Data".
的 sheet 范围填充它我的问题是,如果我在工作簿打开事件过程中填充它,当工作簿打开时我会收到一个错误 "Can't execute in break mode." 但是,根本没有断点处于活动状态。
如果我在 "Dashboard" worksheet 活动事件过程中填充它,它不会在工作簿打开时填充。只有当我点击另一项工作sheet,然后返回到仪表板工作sheet,它才会出现,然后它就会出现。
是否有更好的方法来填充列表框以使其始终填充并准备就绪?我有很多与列表框关联的 vLookup 函数,如果没有填充列表框,那么我的其余代码将无法工作。
我将 post 我目前拥有的代码。第一个是当我尝试通过 workbook_open 偶数过程填充列表框时。第二种是通过"Dashboard"工作sheet激活程序。
Private Sub Workbook_Open()
Dim strName As String
Dim blDone As Boolean
Dim cPlanets As MSForms.ListBox
Dim vArray As Variant
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets
vArray = shtData.Range("Planets").value
cPlanets.List = vArray
cPlanets.ListIndex = 3
'input box message for user when workbook opens up
strName = InputBox("Hello! Please enter your name", "Welcome!")
'check if there is a name entered via loop and if statement
Do
If Len(strName) = 0 Then
'if no name entered, ask user again
MsgBox ("Please enter a valid name to continue"), vbCritical, "Valid Name Required"
'ask user to type in name again
strName = InputBox("Hello! Please enter your name", "Welcome!")
Else
'display message with information for user
MsgBox ("Hello, " & strName)
blDone = True
End If
'finish loop statement
Loop Until blDone = True
下一个代码是我在 Sheet3 代码工作中的代码sheet激活程序
Private Sub Worksheet_Activate()
Dim shtData As Worksheet
Dim wkbSolarSystem As Workbook
Set wkbSolarSystem = Application.Workbooks("workbookname.xlsm")
Set shtData = wkbSolarSystem.Worksheets("Data")
lstPlanets.List = shtData.Range("Planets").value
lstPlanets.ListIndex = 3
End Sub
您将 cPlanets 声明为 MSForms.ListBox,但在您的问题中您说您正在 sheet 上使用 ActiveX 列表框。所以你应该将 cPlanets 声明为一个对象,比如:
Dim cPlanets As Object
Set cPlanets = wkbSolarSystem.Worksheets("Dashboard").lstPlanets
我在另一台计算机上试过这段代码,它有效。看来这是导致问题的计算机配置。该代码在多台不同的计算机上运行正常。