今まで、Withステートメントを使う、使わないは、結果に全く影響しないと思っていた。感覚的には、この等式が成り立つのと同じぐらい、当然だと思っていた。
ところで本日、色々あってユーザーフォームにListViewコントロールを設置した。ListViewコントロールの設置方法などについては、こちらを参照されたし。
(いつもお世話になり、ありがとうございます)。
Office TANAKA - Excel VBA Tips[ListViewコントロールの使い方]
これに倣い、UserFormを配置してみる。
ここまで、特に問題は無い。
次いで、教科書に倣って列の見出しを設定してみる。
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
こんな感じに仕上がる。
次に、データ登録ボタンを設けてみる。
コードは、例えばこんな感じだ。
Private Sub CommandButton1_Click() ListView1.ListItems.Add.Text = "りんご" ListView1.ListItems.Add.SubItems(1) = 5 ListView1.ListItems.Add.SubItems(2) = 100 End Sub
実行してみると、こうなった。おや、データが階段状にずれている?
Withステートメントを用いて記述してみる。
Private Sub CommandButton1_Click() With ListView1.ListItems.Add .Text = "りんご" .SubItems(1) = 5 .SubItems(2) = 100 End With End Sub
期待通りの結果になった。
何となくの理由は思い浮かんでいるが、うまく言葉にできない。また、それが正しいかどうか、正直自信が無い。しかし少なくとも今日、このような現象が起こるということは分かった。以後、注意するとしよう。
参考まで。
~公開後の追記~
詳しい方からご教示いただき、Withステートメントではなく、Addメソッドに問題のあることが分かりました。
Addメソッドはコレクションにアイテムを追加するメソッドであることを理解せずに使った場合に起こりうる失敗ですね。
有り難いことにAddがIListItemオブジェクトを返してくれるから、ついつい続けて書いてしまうっていう。
いつもありがとうございます(^^)