With・VBA 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