サーチ…


構文

  • Set - Rangeなどのオブジェクトへの参照を設定するために使用される演算子
  • For Each - コレクション内のすべてのアイテムをループするために使用された演算子

備考

変数名rcellなどは名前を付けても構いませんが、適切な名前を付けることで、コードがわかりやすくなります。

範囲を作成する

文字列と同じ方法で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には、転置セルの式も同様に更新する「転置貼り付け」オプションがあります。



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow