選択を回避する方法のいくつかの例
Dim
'd変数を使用する
Dim rng as Range
Set
必要な範囲への変数。単一セル範囲を参照するには多くの方法があります
Set rng = Range("A1")
Set rng = Cells(1,1)
Set rng = Range("NamedRange")
またはマルチセル範囲
Set rng = Range("A1:B10")
Set rng = Range("A1", "B10")
Set rng = Range(Cells(1,1), Cells(10,2))
Set rng = Range("AnotherNamedRange")
Set rng = Range("A1").Resize(10,2)
あなたは可能にショートカットを使用Evaluate
する方法が、これはあまり効率的であると一般的に生産コードでは避けるべきです。
Set rng = [A1]
Set rng = [A1:B10]
上記の例はすべて、アクティブシートのセルを参照しています。特にアクティブシートのみで作業するWorksheet
場合を除き、変数も暗くすることをお勧めします
Dim ws As Worksheet
Set ws = Worksheets("Sheet1")
Set rng = ws.Cells(1,1)
With ws
Set rng = .Range(.Cells(1,1), .Cells(2,10))
End With
を使用する場合は、明確にするために明示的にすることをお勧めしますActiveSheet
。ただし、一部のWorksheet
方法ではアクティブシートが変更されるため、注意してください。
Set rng = ActiveSheet.Range("A1")
繰り返しますが、これはアクティブなワークブックを指します。具体的には、ActiveWorkbook
またはのみを使用したい場合ThisWorkbook
を除き、Workbook
変数を暗くすることをお勧めします。
Dim wb As Workbook
Set wb = Application.Workbooks("Book1")
Set rng = wb.Worksheets("Sheet1").Range("A1")
を使用する場合は、明確にするために明示的にすることをお勧めしますActiveWorkbook
。しかし、多くのWorkBook
方法がアクティブな本を変更するので、注意してください。
Set rng = ActiveWorkbook.Worksheets("Sheet1").Range("A1")
ThisWorkbook
オブジェクトを使用して、実行中のコードを含む本を参照することもできます。
Set rng = ThisWorkbook.Worksheets("Sheet1").Range("A1")
一般的な(悪い)コードは、本を開いてデータを取得し、再度閉じることです。
これは悪いです:
Sub foo()
Dim v as Variant
Workbooks("Book1.xlsx").Sheets(1).Range("A1").Clear
Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = ActiveWorkbook.Sheets(1).Range("A1").Value
Workbooks("SomeAlreadyOpenBook.xlsx").Activate
ActiveWorkbook.Sheets("SomeSheet").Range("A1").Value = v
Workbooks(2).Activate
ActiveWorkbook.Close()
End Sub
そして、より良いでしょう:
Sub foo()
Dim v as Variant
Dim wb1 as Workbook
Dim wb2 as Workbook
Set wb1 = Workbooks("SomeAlreadyOpenBook.xlsx")
Set wb2 = Workbooks.Open("C:\Path\To\SomeClosedBook.xlsx")
v = wb2.Sheets("SomeSheet").Range("A1").Value
wb1.Sheets("SomeOtherSheet").Range("A1").Value = v
wb2.Close()
End Sub
範囲変数としてSub
sとFunction
sに範囲を渡します
Sub ClearRange(r as Range)
r.ClearContents
'....
End Sub
Sub MyMacro()
Dim rng as Range
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:B10")
ClearRange rng
End Sub
また、メソッド(Find
およびなどCopy
)を変数に適用する必要があります。
Dim rng1 As Range
Dim rng2 As Range
Set rng1 = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10")
Set rng2 = ThisWorkbook.Worksheets("SomeSheet").Range("B1:B10")
rng1.Copy rng2
セルの範囲をループしている場合、最初に範囲の値をバリアント配列にコピーし、それをループする方が良い(速い)ことがよくあります。
Dim dat As Variant
Dim rng As Range
Dim i As Long
Set rng = ThisWorkbook.Worksheets("SomeSheet").Range("A1:A10000")
dat = rng.Value ' dat is now array (1 to 10000, 1 to 1)
for i = LBound(dat, 1) to UBound(dat, 1)
dat(i,1) = dat(i,1) * 10 'or whatever operation you need to perform
next
rng.Value = dat ' put new values back on sheet
これは、何ができるかを知るための小さな味見人です。
Select
および/またはActiveSheet
などを使用することが完全に避けられない場合があることに注意することが重要です。ここでの例では、私が見つけたということだ:stackoverflow.com/questions/22796286/...