サーチ…
構文
- Set - Rangeなどのオブジェクトへの参照を設定するために使用される演算子
- For Each - コレクション内のすべてのアイテムをループするために使用された演算子
備考
変数名r
、 cell
などは名前を付けても構いませんが、適切な名前を付けることで、コードがわかりやすくなります。
範囲を作成する
文字列と同じ方法でRangeを作成したり、入力したりすることはできません。
Sub RangeTest()
Dim s As String
Dim r As Range 'Specific Type of Object, with members like Address, WrapText, AutoFill, etc.
' This is how we fill a String:
s = "Hello World!"
' But we cannot do this for a Range:
r = Range("A1") '//Run. Err.: 91 Object variable or With block variable not set//
' We have to use the Object approach, using keyword Set:
Set r = Range("A1")
End Sub
参照を修飾するのがベストプラクティスと考えられますので、ここからは同じアプローチを使用します。
MSDNのオブジェクト変数(例:Range)の作成の詳細MSDNのSetステートメントの詳細
同じ範囲を作成するさまざまな方法があります:
Sub SetRangeVariable()
Dim ws As Worksheet
Dim r As Range
Set ws = ThisWorkbook.Worksheets(1) ' The first Worksheet in Workbook with this code in it
' These are all equivalent:
Set r = ws.Range("A2")
Set r = ws.Range("A" & 2)
Set r = ws.Cells(2, 1) ' The cell in row number 2, column number 1
Set r = ws.[A2] 'Shorthand notation of Range.
Set r = Range("NamedRangeInA2") 'If the cell A2 is named NamedRangeInA2. Note, that this is Sheet independent.
Set r = ws.Range("A1").Offset(1, 0) ' The cell that is 1 row and 0 columns away from A1
Set r = ws.Range("A1").Cells(2,1) ' Similar to Offset. You can "go outside" the original Range.
Set r = ws.Range("A1:A5").Cells(2) 'Second cell in bigger Range.
Set r = ws.Range("A1:A5").Item(2) 'Second cell in bigger Range.
Set r = ws.Range("A1:A5")(2) 'Second cell in bigger Range.
End Sub
Cell(2,1)がRange( "A2")と同等であることに注意してください。これは、CellがRangeオブジェクトを返すためです。
いくつかの情報源: 範囲内のチップピアソン - 細胞 ; MSDN-Rangeオブジェクト 。 John Walkenback - あなたのVBAコードの範囲を参照してください 。
また、範囲の宣言で数値が使用され、数値自体がRange( "A"&2)のように引用符で囲まれていない場合は、その数値を整数/ロング。例えば:
Sub RangeIteration()
Dim wb As Workbook, ws As Worksheet
Dim r As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
For i = 1 To 10
Set r = ws.Range("A" & i)
' When i = 1, the result will be Range("A1")
' When i = 2, the result will be Range("A2")
' etc.
' Proof:
Debug.Print r.Address
Next i
End Sub
ダブルループを使用している場合は、セルが優れています。
Sub RangeIteration2()
Dim wb As Workbook, ws As Worksheet
Dim r As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
For i = 1 To 10
For j = 1 To 10
Set r = ws.Cells(i, j)
' When i = 1 and j = 1, the result will be Range("A1")
' When i = 2 and j = 1, the result will be Range("A2")
' When i = 1 and j = 2, the result will be Range("B1")
' etc.
' Proof:
Debug.Print r.Address
Next j
Next i
End Sub
単一のセルを参照する方法
現在のExcelワークシート上の単一のセルを参照する最も簡単な方法は、参照のA1形式を角括弧で囲むだけです。
[a3] = "Hello!"
角括弧は、 Application
オブジェクトのEvaluate
メソッドの便利な構文的砂糖に過ぎないことに注意してください。技術的には、これは次のコードと同じです。
Application.Evaluate("a3") = "Hello!"
行と列を取り、セル参照を返すCells
メソッドを呼び出すこともできます。
Cells(3, 1).Formula = "=A1+A2"
VBAから行と列をExcelに渡すたびに、その行が常に最初に表示され、列が最初に表示されます。これは、列が最初に表示される共通のA1
表記法の反対であるため混乱します。
これらの例では、ワークシートを指定していないため、Excelはアクティブシート(ユーザーインターフェイスの前面にあるシート)を使用します。アクティブなシートを明示的に指定することができます:
ActiveSheet.Cells(3, 1).Formula = "=SUM(A1:A2)"
または、特定のシートの名前を指定することもできます。
Sheets("Sheet2").Cells(3, 1).Formula = "=SUM(A1:A2)"
ある範囲から別の範囲に到達するために使用できるさまざまな方法があります。たとえば、 Rows
メソッドを使用して任意の範囲の個々の行を取得し、 Cells
メソッドを使用して行または列の個々のセルに移動することができます。したがって、次のコードはセルC1を参照します。
ActiveSheet.Rows(1).Cells(3).Formula = "hi!"
変数へのセルへの参照の保存
変数内のセルへの参照を保存するには、 Set
構文を使用する必要があります。次に例を示します。
Dim R as Range
Set R = ActiveSheet.Cells(3, 1)
後...
R.Font.Color = RGB(255, 0, 0)
Set
キーワードが必要な理由Set
は、 =
右側の値がオブジェクトであることをVisual Basicに指示します。
オフセットプロパティ
- Offset(Rows、Columns) - 演算子は、現在のセルから別の点を静的に参照するために使用されました。多くの場合、ループで使用されます。行セクションの正の数は右に移動し、負の値は左に移動します。列の部分ではポジティブが下に移動し、ネガは上に移動します。
すなわち、
Private Sub this()
ThisWorkbook.Sheets("Sheet1").Range("A1").Offset(1, 1).Select
ThisWorkbook.Sheets("Sheet1").Range("A1").Offset(1, 1).Value = "New Value"
ActiveCell.Offset(-1, -1).Value = ActiveCell.Value
ActiveCell.Value = vbNullString
End Sub
このコードはB2を選択し、そこに新しい文字列を置き、その後B2をクリアした後にその文字列をA1に戻します。
範囲をトランスポーズする方法(水平方向と垂直方向、またはその逆)
Sub TransposeRangeValues()
Dim TmpArray() As Variant, FromRange as Range, ToRange as Range
set FromRange = Sheets("Sheet1").Range("a1:a12") 'Worksheets(1).Range("a1:p1")
set ToRange = ThisWorkbook.Sheets("Sheet1").Range("a1") 'ThisWorkbook.Sheets("Sheet1").Range("a1")
TmpArray = Application.Transpose(FromRange.Value)
FromRange.Clear
ToRange.Resize(FromRange.Columns.Count,FromRange.Rows.Count).Value2 = TmpArray
End Sub
注:Copy / PasteSpecialには、転置セルの式も同様に更新する「転置貼り付け」オプションがあります。