Excel VBA iactivate工作表用户表单
尝试在Excel环境中学习VBA。我想在Sheet2(列中的一些文本字符串)上从a列中的一个范围填充一个列表框,如下代码所示Excel VBA iactivate工作表用户表单,excel,vba,Excel,Vba,尝试在Excel环境中学习VBA。我想在Sheet2(列中的一些文本字符串)上从a列中的一个范围填充一个列表框,如下代码所示 Public Sub Test() Dim NumTags As Integer Dim TagString As String NumTags = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row UserForm1.Show TagString = "A1:A" & NumTags 'Worksh
Public Sub Test()
Dim NumTags As Integer
Dim TagString As String
NumTags = Worksheets("Sheet2").Cells(Rows.Count, 1).End(xlUp).Row
UserForm1.Show
TagString = "A1:A" & NumTags
'Worksheets("Sheet2").Activate
UserForm1.ListBox1.RowSource = TagString
End Sub
如果在Sheet1激活时调用此sub,它将不会正确填充列表框,或者至少不会每次都正确填充列表框。如果我取消注释该工作表(“Sheet2”)。激活行,一切正常,但它当然会将激活切换到Sheet2,这是我不想要的
问题:为什么?我是否以某种不正确/简陋的方式填充列表框
谢谢你的帮助 使用以下任一选项:
TagString = "'Sheet2'!A1:A" & NumTags
UserForm1.ListBox1.RowSource = TagString
或
否则,在代码中,您总是从活动工作表中引用范围“A1:A”&NumTags
请注意,该行UserForm1.Show
应位于UserForm1.ListBox1.RowSource=TagString
(或UserForm1.ListBox1.List=…
)之后,否则在再次运行代码之前,ListBox1
将为空(或包含以前的值)
我还建议你仔细看看@SiddharthRout的答案——他在重构代码方面有很好的观点。使用以下任一方法:
TagString = "'Sheet2'!A1:A" & NumTags
UserForm1.ListBox1.RowSource = TagString
或
否则,在代码中,您总是从活动工作表中引用范围“A1:A”&NumTags
请注意,该行UserForm1.Show
应位于UserForm1.ListBox1.RowSource=TagString
(或UserForm1.ListBox1.List=…
)之后,否则在再次运行代码之前,ListBox1
将为空(或包含以前的值)
我还建议你仔细看看@SiddharthRout的答案——他在重构代码方面有很好的观点 我是否以某种不正确/简陋的方式填充列表框 是的,有点。您可以将整个代码放入
UserForm\u Initialize
事件中
上面的代码如下所示
Public Sub Test()
UserForm1.Show
End Sub
然后在Userform代码区域中
Private Sub UserForm_Initialize()
Dim NumTags As Long
Dim TagString As String
With ThisWorkbook.Sheets("Sheet2")
NumTags = .Range("A" & .Rows.Count).End(xlUp).Row
TagString = "A1:A" & NumTags
ListBox1.RowSource = .Name & "!" & TagString
End With
End Sub
我是否以某种不正确/简陋的方式填充列表框
是的,有点。您可以将整个代码放入UserForm\u Initialize
事件中
上面的代码如下所示
Public Sub Test()
UserForm1.Show
End Sub
然后在Userform代码区域中
Private Sub UserForm_Initialize()
Dim NumTags As Long
Dim TagString As String
With ThisWorkbook.Sheets("Sheet2")
NumTags = .Range("A" & .Rows.Count).End(xlUp).Row
TagString = "A1:A" & NumTags
ListBox1.RowSource = .Name & "!" & TagString
End With
End Sub
尝试在对象中引用工作表,尝试从最低使用范围进行搜索以进行优化
Public Sub Test()
Dim NumTags As Integer
With Worksheets("Sheet2")
NumTags = .Cells(.Usedrange.Rows.Count, 1).End(xlUp).Row
UserForm1.ListBox1.RowSource = .Name & "!A1:A" & NumTags
.Activate
End With
UserForm1.Show
End Sub
尝试在对象中引用工作表,尝试从最低使用范围进行搜索以进行优化
Public Sub Test()
Dim NumTags As Integer
With Worksheets("Sheet2")
NumTags = .Cells(.Usedrange.Rows.Count, 1).End(xlUp).Row
UserForm1.ListBox1.RowSource = .Name & "!A1:A" & NumTags
.Activate
End With
UserForm1.Show
End Sub
这种方法有一个问题。
UserForm1.Show
后面的三行在卸载userform之前不会运行,因为userform将以模式模式打开;)因此,使用UserForm\u Initialize()
方法是很好的,正如我在下面提到的那样。如果需要更改顺序,我建议也使用Initialize,但根据情况,这是可以接受的解决方案。:+事实上,现在您已经移动了UserForm1。Show
到结尾:)呃,很抱歉,这让您很痛苦,但您需要在用户表单1.ListBox1.RowSource
之前移动。激活。否则,如果其他工作表被激活,您将得到意外的结果:)或像我一样使用.Name
。事实上,一旦我进入引用工作表2的块,这将不会是一个问题。此方法存在问题。UserForm1.Show
后面的三行在卸载userform之前不会运行,因为userform将以模式模式打开;)因此,使用UserForm\u Initialize()
方法是很好的,正如我在下面提到的那样。如果需要更改顺序,我建议也使用Initialize,但根据情况,这是可以接受的解决方案。:+事实上,现在您已经移动了UserForm1。Show
到结尾:)呃,很抱歉,这让您很痛苦,但您需要在UserForm1.ListBox1.RowSource
之前移动。激活。否则,如果其他工作表被激活,您将得到意外的结果:)或者像我一样使用.Name
。事实上,一旦我进入一个引用工作表的块2,就不会有问题了。上面的行在UserForm1.Show
在卸载userform之前不会运行,因为userform将以模式模式打开;)因此,使用UserForm\u Initialize()
方法是很好的,正如我在下面提到的那样。我知道,我在回答中没有提到它,因为你在回答中已经有了这些信息。我专注于RowSource
property:)我在你之后11秒发了帖子;)是的,但我集中讨论了答案的另一部分,在看到你的答案中已经有了这一点之后,我不想复制你的答案+1现在就完全有意义了:)上面UserForm1.Show
后面的行在卸载userform之前不会运行,因为userform将以模式打开;)因此,使用UserForm\u Initialize()
方法是很好的,正如我在下面提到的那样。我知道,我在回答中没有提到它,因为你在回答中已经有了这些信息。我专注于RowSource
property:)我在你之后11秒发了帖子;)是的,但我专注于答案的另一部分,在看到你的答案中已经有了这一点之后,我不想复制你的答案+1现在完全有意义了:)