ド素人でも学べるExcelVBA講座 008 セルオブジェクト2

ブログ

はじめに

 前回はRangeとCellsの位置を指す引数の指定方法と、値のプロパティ Value について解説した。
 今回は、Rangeオブジェクトのプロパティとメソッドの使い方を紹介しよう。
 
 Excelの部品であるオブジェクトは、属性であるプロパティと、命令であるメソッドの2種類で扱う事になる。
 
 尚、Rangeオブジェクトに関しては、Cellsも同じプロパティとメソッドを使えるので、Cellsに置き換えても問題ない。以下の内容は Range を Cells に置き換えて構わない。

Rangeオブジェクト

 Rangeオブジェクトを使ってオブジェクトの概要を説明しよう。
 
 セルを示すRangeは値だけでなく、その他にも色々な要素を含んでいる。
 例えば、書式設定、文字色、背景色、フォントなどだ。

プロパティ値

 オブジェクトでは、これらの要素をプロパティ(属性)という名前で呼んでおり、それぞれ値を持っている。
 プロパティは、オブジェクトにドット(.)を付けて繋げる。
 また、プロパティには初期値があり、必要になったら変更する形になる。
 
 例えばRangeの初期値は以下のような感じだ。
 
 Range(アドレス).値 = “”
 Range(アドレス).書式設定 = “標準”
 Range(アドレス).文字色 = 自動
 Range(アドレス).背景色 = 塗りつぶしなし
 Range(アドレス).フォント = “MSゴシック”

 
 プロパティ値は、文字列であったり、数値であったり、プロパティによって様々だ。

 特にプロパティ値では、列挙型といって、数値を文字列に割り当てて使う事が良くある。
 例えば、xlNone と書いたら 0 という値を指定した事にするという具合だ。
 こうする事で、単なる数値を文字列にして意味を持たせる事ができる。Excelの列挙型は、xl で始まる事が多い。

 では、ここでA1セルの情報を、B1セルにコピーする事を考えてみよう。
 A1セルは以下のような状態だとする。
 
 Range(”A1″).値 = “ABC”
 Range(”A1″).書式設定 = “標準”
 Range(”A1″).文字色 = rgbRed
 Range(”A1″).背景色 = rgbYellow
 Range(”A1″).フォント = “MS Pゴシック”

 値と文字色、背景色が変更されている。
 実際に動くプログラムで書いてみよう。

Sub testRange()
    Range("A1").Value = "ABC"
    Range("A1").NumberFormatLocal = "G/標準"
    Range("A1").Font.Color = rgbRed
    Range("A1").Interior.Color = rgbYellow
    Range("A1").Font.Name = "MS Pゴシック"
End Sub

 難しく感じるかもしれないが、導き出す方法があるので暗記しなくても大丈夫だ。
 プロパティ値の中には、 以下のようにプロパティ値が2段階になっている場合もある。

    Range("A1").Font.Color
    Range("A1").Font.Name

 A1セルをB1セルにコピーしたい場合は、変更されたプロパティ部分を転記すれば良い事になる。
 NumberFormatLocal と Font.Name は変更していないので転記は不要だ。

Sub testCopyRange1()
    Range("B1") = Range("A1")   'Valueは省略しても良い
    Range("B1").Font.Color = Range("A1").Font.Color
    Range("B1").Interior.Color = Range("A1").Interior.Color
End Sub

 ただ、「A1セルをB1セルにコピーしたい」のであれば Copy メソッドを利用する方が手っ取り早い。
 Copy メソッドなら、A1セルの情報を全てB1セルにコピーしてくれる。

Copyメソッド

 メソッドの場合は、以下のような構文なる。
 
 オブジェクト.メソッド 引数

A1セルをB1セルにコピーするメソッドは以下のように書く。

Sub testCopyRange2()
    Range("A1").Copy Destination:=Range("B1")
End Sub

 メソッド引数の間には空白が入る。引数は複数ある場合はカンマで区切る事になっている。
 引数に関しては、コロンとイコール(:=)を使って以下のような書き方をする。
 
 引数名:=

 Copyメソッドは、セルの持つプロパティ値を指定したセルにコピーしてくれる。
 コピー先は、引数 Destination で指定する。
 Copyメソッドでは引数が1つなので、引数名を省略しても良い事になっている。(また省略だ…)
 引数名を省略した書き方は以下のように書く。

Sub testCopyRange2()
    Range("A1").Copy Range("B1")
End Sub

 だいぶシンプルに書けた。これで、A1セルの全てのプロパティ値をB2セルにコピーしてくれる。

Clearメソッド

 Clearメソッドは、セルの持つプロパティ値を初期状態に戻してくれる。
Clearメソッドは引数を持たないのでシンプルに書ける。

Sub testClearRange()
    Range("B1").Clear
End Sub

 ここでは、B1セルのプロパティ値を全てクリアしている。
 この命令は、セルの値、書式設定、背景色、枠線など全てのプロパティ値をクリアできる。
 Clearは、セルを初期状態に戻してくれる命令だ。

特定のプロパティ値のみコピー

 Copy も Clear もセルの全てのプロパティに影響を及ぼす。
 特定のプロパティのみ値をコピーするにはどうしたら良いだろうか?

 一つの方法としては、変更したいプロパティ値を直接、転記すれば良いだろう。
 Copyメソッドを使う場合は、貼り付けのメソッド(PasteSpecial)でオプションを指定して貼り付ければOKだ。

Sub testPaste()
    Range("A1").Copy
    Range("B1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
End Sub

 具体例は、日付のコピーで紹介しよう。

日付のコピー

 例えば以下のような日付が入力されているセルがあったとする。

Sub testRange2()
    Range("A1").Value = 45416
    Range("A1").NumberFormatLocal = "yyyy/m/d"
    Range("A1").Font.Color = rgbRed
    Range("A1").Interior.Color = rgbYellow
    Range("A1").Font.Name = "MS Pゴシック"
End Sub

 A1セルは、2024/5/4 と表示され文字色と背景色が変更されているが、
 B1セルにA1セルの日付のみを表示させたい場合を考えてみよう。

 日付型は、書式設定と値(シリアル値)で出来ているので、この2つのプロパティを変更すれば良い。
 プロパティ値で変更したければ以下のようにする。

Sub testSetProperty()
    Range("B1").NumberFormatLocal = Range("A1").NumberFormatLocal 
    Range("B1") = Range("A1")
End Sub

 Copyメソッドでも貼り付け(PasteSpecial)メソッドを使えば、貼り付けるプロパティを指定する事ができる。

Sub testPaste()
    Range("A1").Copy
    Range("B1").PasteSpecial Paste:=xlPasteValuesAndNumberFormats
End Sub

 このプログラムでは、最初にA1セルで Copyメソッドを実行している。今回は引数を指定していないが、こうするとクリップボードに内容が保存される。
 次に貼り付け先のB1セルでPasteSpecialメソッドを実行する。ここでは引数を指定していて、
 Paste という引数に、xlPasteValuesAndNumberFormats を指定している。これは、値と書式設定だけを貼り付ける指定(列挙型)になる。

 クリアするメソッドも、プロパティを指定できるものがある。
 値と数式をクリアするには、ClearContents メソッドを使い、書式設定をクリアするには、ClearFormats メソッドを使う。
 日付型のように、値と書式設定のみをクリアしたければ、この2つのメソッドを実行する必要がある。

Sub testClearProperty()
    Range("B1").ClearFormats   '書式設定をクリア
    Range("B1").ClearContents  '値をクリア
End Sub

日付をコピーした後は書式設定が残る

 セルに数値や文字列の値がある場合、値をクリアすればOKだが、日付の場合は値を消しても書式設定が残るので注意しよう。そのセルに再び日付が入るのであれば問題ないが、他の値が入る可能性があるなら書式設定もクリアしておかないと数値が入った時に日付のシリアル値として扱われるてしまう。

 以下のプログラムでは、A1セルに日付を入力したあと、空白でクリアし、その後 123 という数値を入れている。

Sub testDateFormat()
    Range("A1") = "2024/5/5"
    Range("A1") = ""
    Range("A1") = 123   '1900/5/2  ???
End Sub

 結果は、123 ではなく 1900/5/2 と表示されてしまう。これは最初の入力の際、自動変換されて日付の書式設定が入ってしまった事が原因だ。2行目で空白を入力してクリアしたつもりでも、書式設定はクリアされていないので 3行目の 123 は日付のシリアル値として処理され日付として表示されてしまっている。

 これを回避するためには、2行目で、ClearFormats メソッドを使うか、Clear メソッドを使用する必要がある。

まとめ

 今回はオブジェクトの使い方について解説してきた。紹介したのは、ほんの一部だが難しいと感じた人もいるだろう。プロパティやメソッドは数が多いので、使えるものを少しづつ増やしていった方が無難だ。
 Copyメソッドのように例外が多いものもあるので、その都度経験を積み重ねて行こう。

 それと日付型が結構厄介だと感じたと思う。要は、日付型は「値」と「書式設定」の二重構造になっているという事を覚えておこう。

コメント

タイトルとURLをコピーしました