2020年6月10日水曜日

[VBA] 07. セルの操作

ワークシートのセルの操作について。出来ることが多すぎるので基本的な操作を中心に記載する。



セルの指定
Range("セルの位置または範囲")
Range("A1")     'セルA1を指定
Range("A1:B3")  'セルA1~B3を指定

Cells(行番号, 列番号)
Cells(3, 2)                      'セルB3を指定
Cells(3, "B")                    'セルB3を指定
Range(Cells(1, 1), Cells(3, 2))  'セルA1~B3を指定
Cells                            '全てのセルを選択

行や列を指定したい場合は Rows, Columns を使用する。
Rows(2)                        '2行目 (単一行)
Rows("2:4")                    '2~4行目

Columns("B")                   '2列目 (単一行)
Columns(2)                     '2列目 (単一行)
Columns("B:D")                 '2~4列目
Range(Columns(2), Columns(4))  '2~4列目
Range("2:4"), Range("B:D")とする方法もあるらしい。


セルの選択
セルの選択は Select メソッドを使用する。
アクティブセルを指定する場合は Activate メソッドを使用する。

基準のセルから移動するセル数を指定して選択する場合は Offset を使用する。
Offset(1, 1) は基準セルから下方向に1, 右方向に1ズレた位置を選択する。上方向や左方向にズレた位置を選択したい場合は値をマイナスにすればOK。
基準セル.Offset(行, 列).Select

基準のセルからの範囲(基準セルも含む)を指定して選択する場合は Resize を使用する。
Resize(1, 1) は基準セルのみ選択と同じ。マイナスは使えない為、下方向(行)と右方向(列)のみ指定可能。
基準セル.Resize(行, 列).Select

基準のセルから各方向に値の入力されているセルの端を見つけて選択する場合は End を使用する。(空白の手前で止まる)Excelの Ctrl+矢印キー と同じ処理。
上方向 xlUp
下方向 xlDown
左方向 xlToLeft
右方向 xlToRight
基準セル.End(方向).Select

基準セル周辺の値が入力されている範囲を選択する場合は CurrentRegion を使用する。Excelの Ctrl+a と同じ処理。
基準セル.CurrentRegion.Select


セルに値を代入/セルの値を取得
Value プロパティを使用する。省略されることが多い。
Range("A1").Value = 100   'セルA1に100を代入
Debug.Print Range("A1").Value  'セルA1の値を取得
実行結果
 100 

表示形式によって値に付加されている記号や文字(\や%など)を含めて取得する場合は Text プロパティを使用する。取得する際に変数に代入する場合は String や Variant 型の変数に代入する。
Dim num As String
num = Range("A1").Text  'セルA1の値を表示形式も含めて取得

数式を代入/取得する場合は Formula を使用する。取得する際に変数に代入する場合は String や Variant 型の変数に代入する。
Dim num As String

Range("A1").Formula = "=B2*2"  'セルA1に数式(=セルB2 * 2)を代入
num = Range("A1").Formula      'セルA1の数式を取得
Debug.Print num
実行結果
=B2*2


セルのコピー&ペースト
値のみをコピー&ペーストしたい場合であれば、前述した値の代入の要領で可能。複数セルの値をコピーする場合は、右辺の Value を省略できないので注意。
'セルA1 の値を セルB2 に代入
Range("B1") = Range("A1")

'セル"A1:A3" の値を セル"B1:B3" に代入 (右辺のValueは省略不可)
Range("B1:B3") = Range("A1:A3").Value

書式や数式も含めてコピー&ペーストしたい場合は Range オブジェクトの Copy メソッドを使用する。"Destination:=" は省略可能だが、書いた方が「宛先を指定してるんだな」と分かりやすい気がする。
'セルA1 を セルB2 にコピー&ペースト
'Range("A1").Copy Destination:=Range("B1")

'セル"A1:A3" を セル"B1:B3" にコピー&ペースト
Range("A1:A3").Copy Destination:=Range("B1")  '基準となる セルB1 だけ指定すればOK

Copy メソッドを使用して書式や数式を含めず値だけをペーストしたい場合は以下のようになる。
Range("A1").Copy                               'セルA1 をコピー
Range("B1").PasteSpecial Paste:=xlPasteValues  'セルB1 に値のみペースト


セルの結合
セルの結合を行いたい場合は Range.Merge メソッドを使用する。
以下の例では、左上以外のセル以外に値がある場合の確認メッセージを表示させたくないので、確認メッセージを一旦非表示にしている。
Application.DisplayAlerts = False  '確認メッセージを非表示
Range("A1:B2").Merge               '結合
Application.DisplayAlerts = False  '確認メッセージを表示

また、結合を解除したい場合は以下のようになる。指定したセルが結合されていなくても問題は無い。
Range("A1").UnMerge  '結合を解除


セルの値を削除
ClearContents メソッドを使用する。値だけでなく書式やコメントも削除する場合は Clear メソッドを使用する。

メソッド 説明
Clear 値, 書式, コメントを削除
ClearContents 値のみ削除
ClearFormats 書式のみ削除
ClearComments コメントのみ削除

Range("A1").ClearContents  'セルA1 の値を削除


セルの削除
セル自体を削除する場合は Delete メソッドを使用する。
削除後の詰める方向は引数で指定する。省略した場合は自動判定される。

Range("B2").Delete Shift:=xlShiftToLeft  '左方向に詰める
Range("B2").Delete Shift:=xlShiftToUp    '上方向に詰める

Range("B2").Delete Shift:=xlToLeft       '左方向に詰める
Range("B2").Delete Shift:=xlToUp         '上方向に詰める


Withステートメント
同じセルに対して連続する処理を行う場合、Withステートメントを使用してまとめて記述する事ができる。
'Withなし
Range("A1").Clear
Range("A1").Value = 5
Range("A1").Copy Destination:=Range("B2")

'Withあり
With Range("A1")
    .Clear
    .Value = 5
    .Copy Destination:=Range("B2")
End With


セルの幅を指定する
'全ての列の幅を自動調節
Columns.AutoFit

'A列の幅を自動調節
Columns("A").AutoFit

'B列の幅を 30 に設定
Columns("B").ColumnWidth = 30


'全ての行の高さを自動調節
Rows.AutoFit

'1行目の高さを自動調節
Rows(1).AutoFit

'2行目の高さを 30 に設定
Rows(2).RowHeight = 30

複数行選択したい場合は Columns("A:D"), Rows("1:4") のように指定すればOK。


ソート
'セル範囲"B4:D10"を対象にソート
'- C列を基準
'- 昇順
Range("B4:D10").Sort Key1:=Columns("C"), order1:=xlAscending

'セル範囲"B4:D10"を対象にソート
'- C列を基準
'- 降順ソート
'- 大文字/小文字の区別あり
Range(Cells(4, "B"), Cells(10, "D")).Sort _
    Key1:=Columns("C"), _
    order1:=xlDescending, _
    MatchCase:="TRUE"


セルの文字や背景に色をつける
セルの文字や背景に色をつけたい場合は、ColorIndex プロパティもしくは Color プロパティを使用する。
ColorIndex プロパティは番号ごとに割り当てられている色を指定することができるが、あまり使う機会はないような気がする。
Color プロパティは RGB 関数を使用して色を指定することができる。
'文字の色を指定 (赤)
Range("A1").Font.Color = RGB(255, 0, 0)

'背景の色を指定 (黄)
Range("A1").Interior.Color = RGB(255, 255, 0)

'文字の色と背景の色を取得
Debug.Print Range("A1").Font.Color
Debug.Print Range("A1").Interior.Color
実行結果
 255 
 65535 

65535 は 0xFFFF。白または塗りつぶしなしの場合は 16777215 (0xFFFFFF) が返る。


0 件のコメント:

コメントを投稿