2017-07-03 44 views
0

我在20個工作表上有Private Sub組合框。我正嘗試在組合框中預加載一年中的幾個月,但我似乎無法使其工作。我現在的代碼有什麼問題?它只是增加了12個月一樣,120次進入第一個組合框:VBA - 循環工作表將年份添加到組合框

Sub WorkBook_Open() 
Dim ws As Worksheet 
For Each ws In ThisWorkbook.Worksheets 
     ActiveSheet.ComboBox1.AddItem "January" 
     ActiveSheet.ComboBox1.AddItem "February" 
     ActiveSheet.ComboBox1.AddItem "March" 
     ActiveSheet.ComboBox1.AddItem "April" 
     ActiveSheet.ComboBox1.AddItem "May" 
     ActiveSheet.ComboBox1.AddItem "June" 
     ActiveSheet.ComboBox1.AddItem "July" 
     ActiveSheet.ComboBox1.AddItem "August" 
     ActiveSheet.ComboBox1.AddItem "September" 
     ActiveSheet.ComboBox1.AddItem "October" 
     ActiveSheet.ComboBox1.AddItem "November" 
     ActiveSheet.ComboBox1.AddItem "December" 
Next ws 
End Sub 
+0

嘗試'ws.ComboBox1.AddItem「January」'等 –

+0

給我「未找到方法或數據成員」錯誤 –

+0

您沒有每個工作表上的ComboBox1,至少不是在該名稱下。 –

回答

3

這是因爲你通過使用ws可變你的牀單循環,但對於每個工作表要添加的幾個月你目前ActiveSheet。您可以在第一ActiveSheet.Combobox...線之前做了ws.Activate,但是 - 這只是普通的不好的做法(見how to avoid Select/Activate

錯誤的例子:

Sub WorkBook_Open() 
Dim ws As Worksheet 
For Each ws In ThisWorkbook.Worksheets 
    ws.Activate 
    ActiveSheet.ComboBox1.AddItem "January" 
    ActiveSheet.ComboBox1.AddItem "February" 
    '.... 
Next ws 
End Sub 

這是更好地使用ws變量,然後通過訪問控制在OLEObjects收集

很好的例子:

Option Explicit 
Private Sub Workbook_Open() 
Dim ws As Worksheet 
Dim i As Integer 

For Each ws In ThisWorkbook.Worksheets 
    With ws.OLEObjects("Combobox1").Object 
     For i = 1 To 12 
      .AddItem Format(DateSerial(2017, i, 1), "mmmm") 'as per comment! 
     Next i 
    End With 
Next ws 
End Sub 
+0

就是這樣。驚人! –

+0

不客氣。 B.t.w.請記住,沒有「ComboBox1」對象的工作表會出錯,所以您可能需要添加一些檢查和/或錯誤處理。 –