| 
    
     |  | ▼tomo さん: こんばんは。
 >Withステートメントの適切な使用方法を教えて下さい。
 >
 ><その1>
 >Sub test1()
 >With Application
 >   :
 >   :
 >   :
 >End With
 >End Sub
 >
 ><その2>
 >Sub test2()
 >With Application
 >   :
 >End With
 >   :
 >With Application
 >   :
 >End With
 >   :
 >End Sub
 >
 >どちらを使う方が良いのでしょうか?
 >やはり,Withステートメントの中に別のWithステートメントがあったりする可能性もあるため,その2の方が見やすいのでしょうか?
 
 With Application と記述すれば、
 それ以降(End Withまでは)のApplicationオブジェクトの
 プロパティやメソッドの記述時に
 「.」で済むので入力は簡単になりますけどね!!
 
 見やすいからという理由なら、記述にインデントを付けても足りますよね!!
 
 With ステートメントというのは、この記述により、例えば、
 
 With Application とすると、Applicationオブジェクトがアドレッシングされ、
 End Withまで保持されます。
 よって、その間のプロパティの取得等がこれをしない時と比べると速いとされています。
 
 Withステートメントって、これによる入力の簡素化も魅力ですが、
 処理速度を少しでも上げるという観点からも有効な手法です。
 
 私がWithステートメントを記述する時は、この処理速度のことをかなり
 意識して記述しています。
 
 例えば、新規ブックを3つ用意してください。
 
 Book1.Xls Book2.Xls Book3.Xls とします。
 
 Book1.XlsのThisworkbookのモジュールに
 '================================
 Sub test1() 'アドレッシングなし
 Dim idx As Long
 For idx = 1 To 20000
 Worksheets("sheet1").Range("a1").Value = Worksheets("sheet1").Range("a1").Value + 1
 Next idx
 End Sub
 
 Book2.XlsのThisworkbookのモジュールに
 '===========================
 Sub test1() 'withによるアドレッシング
 Dim idx As Long
 With Worksheets("sheet1").Range("a1")
 For idx = 1 To 20000
 .Value = .Value + 1
 Next idx
 End With
 End Sub
 
 Book3.XlsのThisworkbookのモジュールに
 '===========================
 Sub test1() '変数を使ったアドレッシング
 Dim rng As Range
 Dim idx As Long
 Set rng = Worksheets("sheet1").Range("a1")
 For idx = 1 To 20000
 rng.Value = rng.Value + 1
 Next idx
 Set rng = Nothing
 End Sub
 
 として、全て同じフォルダに保存してください。
 
 さらにもうひとつ新規ブックを作成し、標準モジュールに
 '============================================================
 Sub main()
 Dim idx As Long
 Dim jdx As Long
 Dim bk As Workbook
 Dim st As Double
 Dim bknmarray As Variant
 bknmarray = Array("book1.xls", "book2.xls", "book3.xls")
 ThisWorkbook.Worksheets("sheet1").Range("a1:c1").Value = bknmarray
 For idx = LBound(bknmarray) To UBound(bknmarray)
 Set bk = Workbooks.Open(ThisWorkbook.Path & "\" & bknmarray(idx))
 For jdx = 1 To 10
 ActiveSheet.Cells.ClearContents
 st = Timer
 bk.test1
 ThisWorkbook.Worksheets("sheet1").Cells(jdx + 1, idx + 1).Value = Timer - st
 Next
 bk.Close False
 DoEvents
 Next
 End Sub
 
 
 このブックも先の三つのブックと同じフォルダに保存してみてください。
 (仮に速度テスト.xlsとしましょう)
 
 
 一度、Excelを終了し、再度、速度テスト.xlsだけを開いてください。
 ここで、main実行してみてください。
 これは、それぞれのブックに記述した同じ動作を行うtest1
 (セルA1に20000回 1を足す)を10回実行し、
 その処理時間を測るプログラムです。
 
 
 私の環境では
 
 book1.xls  book2.xls  book3.xls
 27.73    20.339   20.018
 27.519    20.289   20.029
 27.38    20.329   19.989
 27.349    20.259   20.049
 27.339    20.46    19.978
 27.37    20.309   20.059
 27.329    20.299   19.979
 27.329    20.5    20.069
 27.53    20.339   20.029
 27.309    20.319   20.019
 
 上記の結果が得られました(単位は秒です)。
 アドレッシングした時としない時の時間差は明らかになっています。
 
 Withはこの処理速度の短縮を意識して使うものだと思いますよ!!
 
 |  |