Excel VBA iactivate工作表用户表单

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

尝试在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
'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现在完全有意义了:)