2017-07-03 84 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”对象的工作表会出错,所以您可能需要添加一些检查和/或错误处理。 –