VBA中每个语句的快速写法

我正在写VBA代码来填充三个不同的combobox与相同的数据。 我只是想知道是否有一个更有效的方式来写,然后我现在在做什么?

' Create fac1 cbo For Each c_fac In ws_misc.Range("fac") With Me.cbo_fac1 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With Next c_fac ' Create fac2 cbo For Each c_fac In ws_misc.Range("fac") With Me.cbo_fac2 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With Next c_fac ' Create fac3 cbo For Each c_fac In ws_misc.Range("fac") With Me.cbo_fac3 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With Next c_fac 

感谢您抽出宝贵的时间!

更进一步,可能是:

 dim lLoop as long ' Create fac1 cbo For Each c_fac In ws_misc.Range("fac") For lLoop=1 to 3 Me.controls("cbo_fac" & lLoop).AddItem c_fac.Value Me.controls("cbo_fac" & lLoop).List(Me.controls("cbo_fac" & lLoop).ListCount - 1, 1) = c_fac.Offset(0, 1).Value next lLoop Next c_fac 

你为什么不能这样做? :

 ' Create fac1 cbo For Each c_fac In ws_misc.Range("fac") With Me.cbo_fac1 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With With Me.cbo_fac2 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With With Me.cbo_fac3 .AddItem c_fac.Value .List(.ListCount - 1, 1) = c_fac.Offset(0, 1).Value End With Next c_fac 

这减less了需要通过工作表范围循环2 / 3rds的时间。 通常从Excel VBA代码中读取和写入实际的Excel工作表对象是需要最多的时间。

这会更快(假设“fac”是一个列),.AddItem对于5个条目非常缓慢:

 Dim rng rng = ws_misc.Range("fac").resize(,2).value Me.cbo_fac1.List = rng Me.cbo_fac2.List = rng Me.cbo_fac3.List = rng 

我个人不喜欢在这种情况下。 它使代码的行数倍增,几乎没有任何好处。 你可以把它缩小到:

 ' Create fac1 cbo For Each c_fac In ws_misc.Range("fac") Me.cbo_fac1.AddItem c_fac.Value Me.cbo_fac1.List(Me.cbo_fac1.ListCount - 1, 1) = c_fac.Offset(0, 1).Value Me.cbo_fac2.AddItem c_fac.Value Me.cbo_fac2.List(Me.cbo_fac2.ListCount - 1, 1) = c_fac.Offset(0, 1).Value Me.cbo_fac3.AddItem c_fac.Value Me.cbo_fac3.List(Me.cbo_fac3.ListCount - 1, 1) = c_fac.Offset(0, 1).Value Next c_fac