Range Object - Excel 97

Value
Formula
Range
Cells
Rows
Columns
Excel
VBA
Tips to set value into Range Objects using Excel VBA.
本文を折り畳む 本文を開く

はじめに

Range Object の値を扱うプロパティは複数あります。Excel のセル自身が、単なるテキストボックスではなく、計算機能を持つものなので、目的に応じてプロパティを使い分ける必要があります。

実例

単一セルの値を読み書きする

  1. 最初に、Sheet1 のセルが次の状態になっているものとします。
    セルの見た目(計算結果および書式設定)
     ABCDEFG
    145,123おはよう2001年03月10日Satおはよう451232124/9/24 22:15TRUE 
    セルの内容
     ABCDEFG
    145123おはよう2001/3/10 22:15:00=B1 & A1=$A1 + $C1TRUE 
    • G1 セルには何も入力されていません。
    • 以下のサンプルコードは、上の状況を前提として説明します。
    • サンプルコードを実行する時は、ローカルウィンドウを開いて、変数 a b c の値の変化を直接確認してみましょう。
  2. 値を読み書きするプロパティの代表格は Value プロパティです。
    Sub Range1()
        Dim a As Double, b As String, i As Long
        On Error Resume Next
        For i = 0 To 6
            a = Sheet1.Range("A1").Offset(0, i).Value
            b = Sheet1.Range("A1").Offset(0, i).Value
            Stop
        Next i
    End Sub
    
    Value プロパティは、セルの計算済みの値を取得する時に、最も一般的な手段です。セルに格納されている値が数字でもテキストでも日付でも、各々の型の変数に格納するのに最も適した形で値を返します。ただし、上のコードのように何でもかんでも Double 型のような特定の型に代入しようとすれば、型変換のエラーが発生する場合があります。On Error Resume Next 行をコメントアウトすれば、B1 および D1 の内容を変数 a に格納するときにエラーが発生することを確認できます。
  3. Value に近い動きをする Value2 プロパティでも値を取得できます。
    Sub Range2()
        Dim a As Double, b As String, i As Long
        For i = 0 To 6
            a = Val(Sheet1.Range("A1").Offset(0, i).Value2)
            b = Sheet1.Range("A1").Offset(0, i).Value2
            Stop
        Next i
    End Sub
    
    Value2 プロパティは、型による解釈を抑止した動きをします。その結果、C1 E1 F1 セルで返される値が、 Value の場合と異なります。まず、日付を格納している C と E の場合、Value の場合と違い、内部が持つ日付シリアルの数値そのものが Double 型で返されます。また、Boolean 型の F セルの場合、Value では受け手が Double 型 a の場合には数値解釈した値が返されていましたが、Value2 では、常に解釈しない文字列としてのみ返されます。なお、ここでは Val 関数を利用して、セルから文字列が返された時のエラーを回避しています。
  4. Text プロパティは、書式通りの文字列として値を取得できます。
    Sub Range3()
        Dim a As Double, b As String, i As Long
        On Error Resume Next
        For i = 0 To rMax - 1
            a = Val(Sheet1.Range("A1").Offset(0, i).Text)
            b = Sheet1.Range("A1").Offset(0, i).Text
            Stop
        Next i
    End Sub
    
    A1 セルも、セル内部では数値データであるにもかかわらず、書式設定通りに , を含む文字列として返されます。その結果、Double 型 a への格納は正しく行われません。また、日付を持つ C1 セルも、日本語を含む文字列として返されます。
  5. これまでは、計算済みの値を取得していましたが、セルに格納された数式そのものを取得したい場合もあります。それには Formula プロパティや FormulaR1C1 プロパティを利用します。
    Sub Range4()
        Dim b As String, c As String, i As Long
        For i = 0 To rMax - 1
            b = Sheet1.Range("A1").Offset(0, i).Formula
            c = Sheet1.Range("A1").Offset(0, i).FormulaR1C1
            Stop
        Next i
    End Sub
    
    Formula も FormulaR1C1 も、式をそのまま取得しますが、Excel のセル参照式の記述方法には、A1 方式と R1C1 方式の2通りがあるため、それぞれに対応する式が取得できるように、2 つのプロパティが用意されています。利用しているシートの設定に依存せず、どちらのプロパティも混在して利用できます。 これらと似たものに、FormulaLocal および FormulaR1C1Local があります。これは、国際版の Excel (基本的にはヨーロッパ版を指す)で、英語以外の言語(たとえばドイツ語)によって式を記述しているような場合に利用するものです。
  6. 今度は、値や式をセルに代入してみましょう。 上で紹介したうち、Text プロパティ以外はセルへの入力にも使えます。Value2 は入力にはあまり意味が無いため、実質的には、値入力なら Value 、式なら Formula FormulaR1C1 を使うことになります。Formula 系で値を入れることもできます。
    Sub Range5()
        Sheet1.Range("A2").Value = 789
        Sheet1.Range("B2").Value = "おやすみ"
        Sheet1.Range("C2").Value = "01234"
        Sheet1.Range("D2").Value = "'01234"
        Sheet1.Range("E2").Value = "2001/3/20"
        Sheet1.Range("A3").Formula = "=$C$1"
        Sheet1.Range("B3").Formula = "=C1"
        Sheet1.Range("C3").FormulaR1C1 = "=R2C1 + 1000"
        Sheet1.Range("D3").FormulaR1C1 = "=R[-2]C[1]"
        Sheet1.Range("E3").FormulaR1C1 = "=""01234"""
    End Sub
    
    実行後のセルの見た目
     ABCDEFG
    145,123おはよう2001年03月10日Satおはよう451232124/9/24 22:15TRUE 
    2789おやすみ1234012342001/3/20  
    32001年03月10日Sat2001年03月10日Sat17892124/9/24 22:1501234  
    C2 および E2 セルの結果に注意して欲しいのが、セル入力時には必ず、Excel によって値が評価されて、型をどうするかという解釈がされるということです。文字列のつもりで入れた 01234 は、数値として解釈され、先頭の 0 は消えました。また、日付として解釈可能な文字列なら、日付型に変換されます。 D2 や E3 セルは、先頭に 0 を持つような数字を、文字列としてセルに格納したい場合の手法です。

複数セルの値を読み書きする

  1. Variant 型の変数を用意して、複数セルから成る Range Object の値を一括して取得することができます。
    Sub Range6()
        Dim a As Variant
        a = Sheet1.Range("A1:C2").Value
        Stop
    End Sub
    
    実行後の変数 a は配列のようになり、a(1,2) というように添字をつけて、B1 セルの値を読み出すことができます。
  2. 複雑な範囲の場合、先頭の Area だけが取得できます。2つ目以降の Area の値を取得するには、Areas の番号を指定します。
    Sub Range7()
        Dim a As Variant, b As Variant
        a = Sheet1.Range("A1:C2,E1:F1").Value
        b = Sheet1.Range("A1:C2,E1:F1").Areas(2).Value
        Stop
    End Sub
    
    この場合、変数 a には、A1:C2 セルの値が、変数 b には、E1:F1 セルの値が格納されます。
  3. 次のようにして、複数のセルに単一の値を代入できます。
    Sub Range8()
        Sheet1.Range("B5:C6").Value = 101
    End Sub
    
    この場合、B5:C6 セルの値がすべて、101 となります。
  4. 次のようにして、複数のセルに配列の値を代入できます。
    Sub Range9()
        Dim a(2) As Long
        a(0) = 1
        a(1) = 2
        a(2) = 3
        Sheet1.Range("B5:C6").Value = a
    End Sub
    
    1次元配列は、Column 方向に解釈され、次のようになります。Range 内に収まらない添字は無視されます。
    実行後のセル
     BCDEF
    512   
    612   
  5. Range に対して、配列の添字が足りない場合には、N/A 値がセルに入ります。
    Sub Range10()
        Dim a(2) As Long
        a(0) = 1
        a(1) = 2
        a(2) = 3
        Sheet1.Range("B5:E6").Value = a
    End Sub
    
    実行後のセル
     BCDEF
    5123#N/A 
    6123#N/A 
  6. 2次元配列を利用すれば、各セルの値を個別に指定できます。
    Sub Range11()
        Dim a(1, 3) As Long
        a(0, 0) = 1
        a(0, 1) = 2
        a(0, 2) = 3
        a(0, 3) = 4
        a(1, 0) = 11
        a(1, 1) = 12
        a(1, 2) = 13
        a(1, 3) = 14
        Sheet1.Range("B5:E6").Value = a
    End Sub
    
    実行後のセル
     BCDEF
    51234 
    611121314 
  7. Array Object を、1次元配列のように利用して、セルに代入することもできます。
    Sub Range12()
        Sheet1.Range("B5:E6").Value = _
            Array(21, 22, 23, 24, 25)
    End Sub
    
    実行後のセル
     BCDEF
    521222324 
    621222324 
    Excel の Range は、Column 方向の1次元、ないし ( Row, Column ) という2次元の配列に対応します。Array 関数を重ねるような配列の配列では、2次元の値を格納することはできません。
  8. セルに式を入れたい場合は、Value プロパティのかわりに FormulaR1C1 等を用いて、数式を文字列として代入すれば、上記の方法がいずれも、そのまま利用できます。

Download a Sample Code

上記の解説で用いたサンプルコードは、以下のリンクからダウンロードできます。テキストファイルとして用意しているので、保存して Excel の Visual Basic Editor にインポートしてください。
  1. Save a program source (sample-vbaxlra1-1.bas) on your local disk.
  2. Start Microsoft Excel with a blank(new) book.
  3. Open the Visual Basic Editor. (Tool/Macro/Visual Basic Editor)
  4. Import the downloaded program source. (File/Import Files)

History

2002/3/24
URL移転
2001/3/11
sample-vbaxlra1-1.bas put
2001/3/11
初版
本文を折り畳む back to home index of VBA