パソコンサポート Q & A

パソコン講習会で寄せられた質問を解説しております。

Rangeプロパティ と Cellsプロパティの違い

2013年04月26日 | VBA

RangeプロパティとCellsプロパティの違いについて質問をいただきました。


VBAでExcelを操作するにあたっては、セルやセル範囲をどのように扱うかが重要なポイントになります。


ExcelVBAでは、セルやセル範囲はRangeオブジェクトとして表されます。
Rangeオブジェクトを取得する方法はいろいろとありますが、なかでもよく使われるのがRangeプロパティとCellsプロパティです。
どちらも指定したセルのオブジェクトを扱えます。


Rangeプロパティの書式は、
Range(セル番地
のように、文字列でセル番地を指定します。


Cellsプロパティの書式は
Cells(行、列)
であるように、セルの指定方法は[行]と[列」で指定します。
[行]と[列]には数値を指定します。
[行]と[列」を指定することで、目的のセルのオブジェクトを扱えるのです。
この点がCellsプロパティの特徴であり、文字列でセル番地を指定するRangeプロパティとの大きな違いです。
[行]は、ワークシートの行番号と同じ数値を指定します。
[列]は、ワークシートの列番号「A」を「1」とする数値で指定します。
したがって、C列なら「3」になります。よってC4セルは、「Cells(4,3)」と記述することになります。
また、Cellsプロパティは変数も使えます。そのため、Cellsプロパティを用いれば、行や列の指定にループのカウンタ変数を使って、複数のセルに対して同じような処理を繰り返し実行できるのです。
さらに、Cellsプロパティは、指定したオブジェクトを基点として、そこから相対的に行と列を指定することでセルを指定することもできます。

書式は
オブジェクト名.Cells(行、列)


例:
B3セルを基点とし、そこから3行、2列離れたセルを指定するとします。
B3セルのオブジェクトは「Range(”B3")ですから、次のように記述します。
Range("B3").Cells(3,2)
このように記述すると、B3セルから見た3行目、2列目のセルということで、C5セルを示すことになります。

なお、Cellsプロパティは基点となるオブジェクトの記述を省略することができます。
省略すると、自動的に現在のワークシートのA1セルが基点となります。

Cellsプロパティで注意する点は、セル範囲は指定できないことです。単一のセルか、ワークシート上のセルすべてしか指定できません。
RangeオブジェクトとCellsプロパティの両者の違い、得意/不得意を把握し、目的に応じて使い分けてください。

さらに、VBAではほかにも行/列を数値または変数で指定できる方法としてOffset」プロパティ」が用意されています。
これは、アクティブセルから相対的にセル番地を返します

書式は
基点となるオブジェクト.Offset(行方向への移動,列方向への移動)

「行列方向への移動」は数値で指定します。
ただし、行列の指定で注意しなければならないのが、基点セルが「0」になることです。

これらを使って、「E4」セルから「E8」にかけてセルの値をクリアし、文字の色を黒に設定するというプロシージャを記述すると以下のようになります。

Cellsプロパティを使って記述すると、次のようになります。

Sub サンプル1()
    For i = 4 To 8
        Cells(i, 5).ClearContents
        Cells(i, 5).Font.Color = vbBlack
    Next i
End Sub
__________________________________________

E4」セルを基点としてCellsプロパティを用いて記述すると、次のようになります。

Sub サンプル2()
    For i = 4 To 8
        Range("E4").Cells(i, 1).ClearContents
        Range("E4").Cells(i, 1).Font.Color = vbBlack
    Next i
End Sub    
___________________________________________

「サンプル1」をCellsプロパティではなく、Offsetプロパティで記述すると次のようになります。

Sub サンプル3()
    For i = 4 To 8
        Range("E4").Offset(i, 0).ClearContents
        Range("E4").Offset(i, 0).Font.Color.vbBlack
    Next i
End Sub
___________________________________________
Rangeオブジェクトでも記述できます。

Sub サンプル4()
    For i = 4 To 8
        Range("E" & i).ClearContents
        Range("E" & i).Font.Color = vbBlack
    Next i
End Sub

このようにVBAでは、同じ機能を実現するのに複数の方法が使えるケースがあります。
コードの見やすさや後々の仕様の追加・変更への対応のしやすさなどを考慮して選びましょう。

 

よろしかったら・・・応援クリック・・・お願いします。励みになります。

    
人気ブログランキングへ


MsgBox関数で( )を使う時と使わない時

2013年04月24日 | VBA

MsgBox関数で括弧を使う時と使わない時の違いはなにかとの質問をいただきました。

MsgBox関数は、ダイアログボックスにメッセージとボタンを表示し、どのボタンが押されたかを示す整数型の数値を返します。

VBAで括弧が必要かどうかは、戻り値を使うかどうかで決まります。
戻り値とは、ある命令が、その結果として返す値のことです。
例えばワークシート関数のSUM関数を思い浮かべてみましょう。
SUM関数は、引数として渡されたデータを計算した結果を返します。
このようにある命令が、その結果として返す値のことを戻り値といいます。

たとえば次のようなマクロがあったとします。

Sub sample()
    Dim Rei As String
     Rei = MsgBox("合格ですか?", vbYesNo)
     If Rei = vbYes Then
        MsgBox "おめでとうヽ(^。^)ノ"
    End If
End Sub

このマクロでは、2つのMsgBox関数が使われています。
しかし、最初のMsgBox関数は括弧を使っているのに対し、2つ目のMsgBox関数は括弧を使っていません。

MsgBox関数は、関数であるからには、何らかの結果を返します。
では、MsgBoxは何を返す関数なのでしょうか?
実は、MsgBox関数は、「ユーザーがどのボタンを押したか」という結果を返します。


最初の
Rei = MsgBox("合格ですか?", vbYesNo)


は、ユーザーがどのボタンを押したかという戻り値を、変数「Rei」に格納しています。
これは、その後のIfステートメントで判定するためです。
このようにMsgBoxの戻り値を使っていますから、引数は括弧で囲まなければなりません。

それに対して、2つ目の
MsgBox "おめでとうヽ(^。^)ノ"


は、ユーザーがどのボタンを押したかという戻り値は使っていません。
そもそも「OK」ボタンしか表示していないので、どのボタンが押されたかを判定する必要はありませんね。押されたのは「OK」ボタンに決まっています。
これはただユーザーにメッセージを表示しただけです。
つまり、戻り値を使っていませんから、引数を括弧で囲ってはいけないのです。

このように、関数の戻り値を何かに使うときは、引数を括弧で囲まなければならないのです。

 

よろしかったら・・・応援クリック・・・お願いします。励みになります。

    
人気ブログランキングへ