With・VBA With |
||||
| わずかな知識で VBA! |
With
|
|||
WithステートメントエクセルのVBAでの Withステートメントとは、 同じオブジェクトに多数の処理を連続して行う時に使用します。 でも、必ず、使用しなければならないというものではありません。 ですが、ソースコードを簡略化し、実行速度も高速化するそうですが、 実感したことはありません(笑) 下の例を見てみましょう。 setcell.Offset(0, 0).Value = strkohdo setcell.Offset(0, 1).Value = strnamae setcell.Offset(0, 2).Value = lokazu setcell.Offset(0, 3).Value = strtanka setcell.Offset(0, 4).Value = "=RC[-2]*RC[-1]" setcell.Offset(0, 4).Style = "Comma [0]" これは、参照セル(Setcell)近辺のセルに、 Offsetプロパティを用いてデータを入力するプロシージャです。 毎回、オブジェクトであるsetcellを記述しなければなりません。 これを、参照セル(Setcell)にWithステートメントを用いて記述すると 下記の様になります。 With setcell .Offset(0, 0).Value = strkohdo .Offset(0, 1).Value = strnamae .Offset(0, 2).Value = lokazu .Offset(0, 3).Value = strtanka .Offset(0, 4).Value = "=RC[-2]*RC[-1]" .Offset(0, 4).Style = "Comma [0]" End With オブジェクトのsetcellを、省略することができるのです。 知らなければ、上の例でも気になりませんが、 Withステートメントを知ってしまうと オブジェクトを一々記述するのも面倒くさいし、 デバッグ時にも分かりやすくなるので多用するようになります。 |
わずかな知識で VBA! 更新情報 VBAの勉強に疲れたらちょっと休憩! YouTube動画ページ YouTubeの部屋 | |||
Withステートメントは、「With オブジェクト」で始まり、「End With」で終わります。 「With」と「End With」の間に記述するソースコードで、「setcell」に対するものである場合には、 オブジェクト名を省略して、そのことを表す「.」(ドット)を必ず付けます。 つまり、 setcell.Offset(0, 0).Value = strkohdo から、オブジェクト名の「setcell」を取った形の .Offset(0, 0).Value = strkohdo という具合です。 まあ、忘れた場合でも、「VBAProjectのコンパイル」による構文エラーチェックには引っ掛かるので、 すぐに見つけることができます。 その時のエラーメッセージが次の図です。 「.」(ドットを忘れると、subかFunctionだとExcelは判断してしまうということです。 Withステートメントの中でも、他のステートメントも使用できますし、指定したオブジェクトの操作も可能です。 With 入力.kohdo .ColumnCount = 2 Set setcell = Worksheets("製品単価").Range("C7") 'RowSourceの入力 Do Until setcell.Value = "" .AddItem .List(cntA, 0) = setcell.Offset(0, 0).Value .List(cntA, 1) = setcell.Offset(0, 1).Value Set setcell = setcell.Offset(1, 0) cntA = cntA + 1 Loop End With この例は、ユーザーインターフェースで説明したプロシージャですが、 Withステートメントのなかで、Do Loopステートメント、Setステートメントを使用しています。 次のように、入れ子にすることもできます。 With Range("A1") セルA1に対するWithステートメント .Value = "Withステートメントの説明" With .Font セルA1のフォントに対するWithステートメント .Name = "MS 明朝" .Bold = True .Size = 14 End With End With 「End With」の記述を忘れるとエラーになります。 「VBAProjectのコンパイル」による構文エラーチェックには引っ掛かりますが、Ifステートメントと 同時に使用した場合などは、下の図のようなメッセージが表示されるので注意が必要です。 If Range("A1").Value = "" Then With Range("A1") .Value = "" .Value = "Withステートメントの説明" With .Font .Name = "MS 明朝" .Bold = True .Size = 14 ここに「End With」が無い End With End If 上のように、Ifステートメントの中で、 「End With」の記述を一つ忘れて「VBAProjectのコンパイル」を実行すると と、エラーの原因を想像しにくいメッセージが表示されます。 また、ある参照セルに対し、Withステートメントを使用した場合に、Withステートメントのなかで、 その参照セルの位置を変更しても、反映されず、元の位置のままとなります。 Sub muridesu() Dim setcell As Object Dim i As Integer Set setcell = Range("C5") For i = 1 To 5 With setcell .Value = "Withステートメントの説明" Set setcell = setcell.Offset(1, 0) .Value = "できません" End With Next End Sub 上は、無理やり作った例ですが、setcellのWithステートメントのなかで、setcellを1つ下に送っています。 このような場合は、構文エラーにはなりませんが、Set setcell = setcell.Offset(1, 0)は無効となり、 最初に宣言した、セル("C5")に「できません」が入力されます。 Withステートメントを宣言したオブジェクトを変更する場合は、End Withでステートメントを終了させ、 変更後に再び、宣言する必要があります。 このような落とし穴的なものがエクセルに限らずVBAには結構あるので、注意が必要です。 |
||||
わずかな知識でVBA! TOP マクロで何ができる? ユーザーインターフェース マクロの記録 マクロの登録 イベントについて マクロの編集とデバッグ ゲームで覚えるVBAプログラミング オブジェクトの操作 セルの操作 MsgBox関数・InputBox関数 変数の型 ヘルプの活用 イミディエイトウィンドウ Withステートメント Setステートメント 条件分岐のステートメント If Then Else,Select Case 繰り返しのステートメント Do Loop 繰り返しのステートメント For Next ダイアログボックスを作ってみよう1 ダイアログボックスを作ってみよう2 【実践編】 ActiveXコントロール 各コントロールのプロパティ 文字列の操作 Endプロパティ リンク・検索 相互リンク マイプロフィール YouTubeの部屋 |
||||
Copyright (C) わずかな知識でVBA! All Rights Reserved