VBA iactivate工作表userform

时间:2014-04-01 21:43:43

标签: excel-vba vba excel

尝试在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,我不想要。

问题:为什么?我是否以某种不正确/破旧的方式填充ListBox?

感谢您的帮助!

3 个答案:

答案 0 :(得分:2)

使用:

TagString = "'Sheet2'!A1:A" & NumTags
UserForm1.ListBox1.RowSource = TagString

UserForm1.ListBox1.List = Worksheets("Sheet2").Range("A1:A" & NumTags).Value

否则,在您的代码中,您始终会从活动表

引用范围"A1:A" & NumTags

注意,该行UserForm1.Show应该在UserForm1.ListBox1.RowSource = TagString之后(或UserForm1.ListBox1.List = ...),否则直到您再次运行代码,您的ListBox1将为空(或包含以前的值) )。


我还建议你仔细看看@ SiddharthRout的答案 - 他对重构你的代码有一个非常好的观点。

答案 1 :(得分:1)

  

我是否以某种不正确/破旧的方式填充ListBox?

是的。您可以将整个代码放在UserForm_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

答案 2 :(得分:1)

尝试在对象中引用您的工作表,尝试从最低使用范围进行搜索以进行优化。

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