With ステートメントで初めて知ったこと(失敗談)

今まで、Withステートメントを使う、使わないは、結果に全く影響しないと思っていた。感覚的には、この等式が成り立つのと同じぐらい、当然だと思っていた。
f:id:Infoment:20181016220640p:plain

ところで本日、色々あってユーザーフォームにListViewコントロールを設置した。ListViewコントロールの設置方法などについては、こちらを参照されたし。
(いつもお世話になり、ありがとうございます)。

Office TANAKA - Excel VBA Tips[ListViewコントロールの使い方]

これに倣い、UserFormを配置してみる。
f:id:Infoment:20181016221143p:plain

ここまで、特に問題は無い。
次いで、教科書に倣って列の見出しを設定してみる。

Option Explicit

Private Sub UserForm_Initialize()
    With ListView1
        .View = lvwReport
        .LabelEdit = lvwManual
        .HideSelection = False
        .AllowColumnReorder = True
        .FullRowSelect = True
        .Gridlines = True
        
        .ColumnHeaders.Add , "_Name", "名前"
        .ColumnHeaders.Add , "_Qty", "数量"
        .ColumnHeaders.Add , "_Price", "価格"
    End With
End Sub

こんな感じに仕上がる。
f:id:Infoment:20181016221724p:plain


次に、データ登録ボタンを設けてみる。
f:id:Infoment:20181016221905p:plain


コードは、例えばこんな感じだ。

Private Sub CommandButton1_Click()
        ListView1.ListItems.Add.Text = "りんご"
        ListView1.ListItems.Add.SubItems(1) = 5
        ListView1.ListItems.Add.SubItems(2) = 100
End Sub


実行してみると、こうなった。おや、データが階段状にずれている?

f:id:Infoment:20181016222348p:plain


Withステートメントを用いて記述してみる。

Private Sub CommandButton1_Click()
    With ListView1.ListItems.Add
        .Text = "りんご"
        .SubItems(1) = 5
        .SubItems(2) = 100
    End With
End Sub


期待通りの結果になった。

f:id:Infoment:20181016222803p:plain


何となくの理由は思い浮かんでいるが、うまく言葉にできない。また、それが正しいかどうか、正直自信が無い。しかし少なくとも今日、このような現象が起こるということは分かった。以後、注意するとしよう。

参考まで。

~公開後の追記~
詳しい方からご教示いただき、Withステートメントではなく、Addメソッドに問題のあることが分かりました。

Addメソッドはコレクションにアイテムを追加するメソッドであることを理解せずに使った場合に起こりうる失敗ですね。
有り難いことにAddがIListItemオブジェクトを返してくれるから、ついつい続けて書いてしまうっていう。

いつもありがとうございます(^^)