繁体   English   中英

VBA iactivate工作表用户表单

[英]VBA iactivate worksheet userform

尝试在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时调用此子项,它将不会正确填充列表框,或者至少不是每次都填充列表框。 如果我取消注释Worksheets(“ Sheet2”)。Activate行,则一切正常,但当然它将激活切换到Sheet2,这是我所不希望的。

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

谢谢你的帮助!

使用以下任一方法:

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的答案-他对重构您的代码非常有帮助。

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

是的。 您可以将整个代码放在UserForm_Initialize事件中。

所以你上面的代码看起来像这样

Public Sub Test()
    UserForm1.Show
End Sub

然后在用户表单代码区域

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM