2014-04-01 22 views
0

嘗試在Excel上下文中學習VBA。我想從A列中的一系列填充列表框,在Sheet2上(在列一些文本字符串),如下面的代碼VBA iactivate工作表用戶表單

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的同時被激活,也不會正確填充列表框,或者至少不是每次。如果我取消註釋該工作表(「Sheet2」)。激活行,一切正常,但它當然切換激活到Sheet2,我不想。

問題:爲什麼?我是否以不正確/破舊的方式填充ListBox?

感謝您的幫助!

回答

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 
+0

這種方法存在問題。 UserForm1之後的三行。Show'不會運行,直到userform被卸載,因爲userform將以模態模式打開;)因此,使用'UserForm_Initialize()'方法是很好的,正如我在下面提到的 –

+0

的確會改變順序,I會建議使用initiallze也取決於circusntances這是可以接受的解決方案。 :) –

+0

+ 1事實上,現在你已經將UserForm1.Show'移動到了末尾:) –

2

二者必選其一:

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

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

,否則在你的代碼中總是referce從活動工作表

音符範圍"A1:A" & NumTags,該行UserForm1.Show應該是UserForm1.ListBox1.RowSource = TagString後(或UserForm1.ListBox1.List = ...),否則直到你運行鱈魚再次,你的ListBox1將是空的(或包含以前的值)。


我也suggets你拿在@ SiddharthRout的回答定睛一看 - 他擁有約重構你的代碼一個非常好的問題。

+0

後'UserForm1.Show'將不會運行,直到作爲用戶窗體將在模態模式打開用戶窗體被卸載時的上面的行),並因此它是很好的使用'UserForm_Initialize()'方法正如我在下面提到的 –

+0

我知道這一點,我沒有在我的答案中提到它,因爲你的答案中已經有了這些信息。我專注於'RowSource'屬性:) –

+0

我在11秒後發佈;) –

1

我是否以不正確的/破舊的方式填充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