尝试在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,它将无法正确填充列表框,或者至少不是每次都填充列表框。如果我取消注释该工作表("工作表 2")。激活行,一切正常,但当然它会将激活切换到 Sheet2,这是我不想要的。
问:这是为什么?我是否以某种不正确/破旧的方式填充列表框?
感谢您的帮助!
使用以下任一:
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的答案 - 他对重构你的代码有一个非常好的观点。
尝试在对象中引用工作表,尝试从最低使用范围进行搜索以进行优化。
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
我是否以某种不正确/破旧的方式填充列表框?
是的。可以将整个代码放在 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