4

3 つの異なるコンボ ボックスに同じデータを入力する VBA コードを書いています。私が今していることよりも効率的な書き方があるかどうか疑問に思っていましたか?

' 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

お時間を割いていただきありがとうございます。

4

4 に答える 4

8

さらに一歩、おそらく:

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
于 2012-10-10T22:32:25.867 に答える
3

なんでできないの?:

' 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

これにより、ワークシート範囲をループするのに必要な時間が 2/3 減少します。通常、Excel VBA コードで最も時間がかかるのは、実際の Excel ワークシート オブジェクトの読み取りと書き込みです。

于 2012-10-10T22:25:05.323 に答える
2

これははるかに高速です (「fac」が列であるという前提で)。

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
于 2012-10-11T08:42:29.030 に答える
1

With個人的にはこのケースは嫌いです。コードの行数が 2 倍になり、メリットはほとんどありません。これを次のように縮小できます。

' 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
于 2012-10-10T22:27:30.677 に答える