「大人の教養・知識・気付き」を伸ばすブログ

一流の大人(ビジネスマン、政治家、リーダー…)として知っておきたい、教養・社会動向を意外なところから取り上げ学ぶことで“気付く力”を伸ばすブログです。データ分析・語学に力点を置いています。 →現在、コンサルタントの雛になるべく、少しずつ勉強中です(※2024年1月21日改訂)。

MENU

Excel VBAをはじめから(その02/X)

 仕事で未だに使うことのある\mathrm{Excel\ VBA}を改めて体系的に学びたく

を読んでいく。


power-of-awareness.com

2. オブジェクトでExcelの機能にアクセスする

2.1 イミディエイトウィンドウの使い方

 \mathrm{VBA}を扱うに当たり、イミディエイトウィンドウを知っておくと便利である。イミディエイトウィンドウは、

  • マクロの実行結果を表示する
  • 1行分のコードをその場で入力して実行する

ことができる。その場で実行するには、イミディエイトウィンドウに実行したいコードを記述した後に\mathrm{Enter}キーを押せばよい。


' イミディエイトウィンドウに結果を出力する
Sub debug_test()
    Debug.Print ("Hello VBA!")
End Sub

 またイミディエイトウィンドウを用いる際、「?」を用いると便利である。ユーザーがさせたいと思っていたことを\mathrm{VBA}側で類推し、その構文が書かれたと見なして実行してくれる(このときの「?」をシンタックスシュガーという。)。たとえば? "Hello, VBA!"Debug.Print "Hello, VBA!"として扱われる。

2.1.1 補足

 \mathrm{VBA}は大文字・小文字を区別しない。
 \mathrm{VBE}はコードウィンドウに入力したコードを自動修正してくれる。

2.2 セルの値を操作する

2.2.1 セルに値を入力する

 セルへの値入力には様々なやり方がある。

'セルへの値出力
Sub test()
    Range("A1").Value = "Hello VBA!!"    ' セルA1に値を入力する
    Cells(2, 1).Value = 1000             ' セルA1に値を入力する
    Range("A1:B2").Value = #6/5/2018#    ' セルA1:B2に値を入力する
End Sub

 文字列、数値、日付の3つのリテラル*1を入力するには、上記のようにする。

種類
記述方法
文字列 ダブルクォーテーションで囲む "Excel" "VBA"
数値 そのまま記述 1000 1500 -100
日付・時刻 シャープで囲む #2018/1/10# #14:00#
2.2.2 入力値を消去する

 セルの値を消去する方法に以下のものがある。これはシート上で\mathrm{Delete}キーを押した際の挙動に相当する。

Sub test()
    Range("B2").ClearContents   'セルB2の値を消去する
End Sub

\mathrm{VBA}ではこのように、\mathrm{Excel}の一般機能が、特定のオブジェクト(操作対象のことで、ここでは\mathrm{Range})のメソッドとして整理され、割り当てられている。\mathrm{Excel}に用意されている機能を実行するような操作は、「捜査対象を指定後に、実行したい機能(メソッド)を指定」する。

2.3 Excelの各機能はオブジェクトごとに整理されている

 \mathrm{Excel}の機能を\mathrm{VBA}から利用するためのコードは、まず操作対象を指定することから始まる。この操作対象のことをオブジェクトという。

オブジェクト
用途
\mathrm{Range}
セルに対する操作
\mathrm{Worksheet}
シートに対する操作
\mathrm{Workbook}
ブックに対する操作
\mathrm{Application}
\mathrm{Excel}全体の設定や機能に対する操作
\mathrm{Font}
フォントに対する操作
\mathrm{Interior}
セルの書式に対する操作
\mathrm{Sort}
並べ替え設定に対する操作
\mathrm{AutoFilter}
フィルター設定に対する操作
2.3.1 オブジェクトとプロパティ・メソッド

 各オブジェクトにはプロパティおよびメソッドが用意されている。プロパティは値や状態といった「特徴・状態」を扱いたいときに利用し、メソッドはオブジェクトに応じた「機能・命令」を扱いたい際に利用する。プロパティやメソッドを利用する場合はドットシンタックス方式*2で記述する。

  • \mathrm{Range}オブジェクトのプロパティ例
プロパティ
用途
\mathrm{Value}
セルの値を取得/設定する
\mathrm{Width}
セルの幅を取得する
\mathrm{Interior}
セルの書式情報に関する\mathrm{Interior}オブジェクトへアクセスする
  • \mathrm{Range}オブジェクトのメソッド例
メソッド
用途
\mathrm{Clear}
セルをクリアする
\mathrm{ClearContents}
セルの値や式のみをクリアする
\mathrm{Delete}
セルを削除する
2.3.2 プロパティの値を設定・取得する

 オブジェクトの状態を変更したい場合、プロパティを指定して変更後の値を設定する。値の設定は、

'オブジェクト.プロパティ = 新しい値
Range("A1").Value = "Hello VBA!!"

という書き方で記述する。

2.3.3 メソッドを実行する

 オブジェクトに関する機能を実行したい場合、オブジェクトを指定してメソッドを実行する。
 メソッドを実行したい場合、オブジェクト名に続けて「.メソッド」とメソッド名を記述する。

'オブジェクト.メソッド
Range("A1").ClearContents
2.3.4 引数を指定してプロパティやメソッドを利用する

 一部のプロパティやメソッドの多くでは引数が利用できる。引数を指定するには、引数名とそれに指定したい値を「:=」(コロン+等号)でつないで「引数名:=値」のセットで記述する*3

' セルB2の削除をするDeleteメソッドを行なう。
' このときシフト方向を指定する引数(Shift)に左詰めを意味するxlShiftToLeftを与える。
Range("B2").Delete Shift:=xlShiftToLeft

 引数には表記が必須なものと任意のものがある。必須な引数を省略した場合、エラーを起こす。

2.4 目的のオブジェクトにアクセスする

 オブジェクトを指定するには、大別して2つの方法が存在する。

方法
概要
コレクションからアクセス
コレクションを利用してオブジェクトを特定する
任意のオブジェクトの

階層構造からアクセス
オブジェクト同士の階層構造を利用する
2.4.1 コレクション経由でオブジェクトを指定する

 \mathrm{VBA}は、同じ種類のオブジェクトをまとめて扱うためにコレクションという仕組みが用意されている。コレクションの多くは「オブジェクト名+複数形の『s』」という名前が付けられている。

 コレクションからそのメンバー*4を指定するには、コレクションの後ろに括弧を付け、指定したいものを指すインデックス番号または名前を指定する。

'コレクション(インデックス番号) または
'コレクション(名前)
Worksheets(1)
Worksheets("Sheet1")
2.4.2 オブジェクトの階層構造から指定する

 もう1つの方法として、あるオブジェクトに関連する他のオブジェクトを、対応するプロパティ経由で指定するものがある。\mathrm{VBA}のオブジェクトは階層構造で辿れるようになっている。

プロパティの例
アクセス対象
\mathrm{Interior}
セルに関連する\mathrm{Interior}オブジェクト
\mathrm{Font}
セルに関連する\mathrm{Font}オブジェクト
\mathrm{Borders}
セルに関連する\mathrm{Borders}オブジェクト
\mathrm{Validation}
セルに関連する\mathrm{Validation}オブジェクト
'例:書式情報へアクセスして背景色を変更
Range("A1").Interior.Color = RGB(255,0,0)
2.4.3 Rangeでセルを指定する

 セル(\mathrm{Range}オブジェクト)のみコレクション経由/階層構造からのアクセスとは異なる方法でアクセスする。

'Range(アドレス文字列)で指定する
' 例1:セルA1に値を設定
Range("A1").Value=100
' 例2:セル範囲C1:E3に値を設定
Range("C1:E3").Value="VBA"

 また単一のセルにアクセスするには\mathrm{Cells}プロパティを用いる方法もある。

'Cells(行番号,列番号)
' 3行目2列目のセル(セルB3)に値を入力
Cells(3,2).Value = "Excel"

' 3行目C列目のセル(セルC3)に値を入力
Cells(3,"C").Value = "VBA"
2.4.4 アクティブなオブジェクト

 既述の方法でオブジェクトにアクセスする場合、アクティブなブックの該当オブジェクトにアクセスしている。このようにアクティブなものを操作するコードは、想定していないオブジェクトに操作を加える可能性がある。
 シートを明示的に示すには、

'対象シート.対象セル
Worksheets("Sheet1").Range("A1").Value="当期売上集計"

Workbooks("東京支店.xlsx").Worksheets(1).Range("A1:C5").Copy
2.4.5 アクティブなもの・選択しているものにアクセスする

 特定のオブジェクトにアクセスするには以下のようなプロパティをもちいればよい。

プロパティの例
操作対象
\mathrm{ActiveCell}
アクティブなセル
\mathrm{Selection}
選択しているセル範囲または選択中の図形
\mathrm{ActiveSheet}
アクティブなシート
\mathrm{ActiveWorkbook}
アクティブなブック
\mathrm{ActiveWindow}
アクティブなウィンドウ
'ActiveCellを使ってアクティブな単一セルを操作対象に指定
ActiveCell.Value="VBA"
'Selectionを使って選択セル範囲全体を操作対象に指定
Selection.Value="VBA"

2.5 オブジェクトを調べる方法

 どの機能がどのオブジェクトかを調べる方法にはいくつか存在するが、1つにはオブジェクトブラウザーを調べることがある。



*1:リテラル値は値そのもののこと。

*2:オブジェクト名に「.」(ドット)を記述し、その直後に利用したいプロパティないしメソッド名を記述する方式。

*3:引数が複数ある場合、「引数名:=値」をカンマでつないで列記する。

*4:そのコレクションに所属する個々のオブジェクトを指す。

プライバシーポリシー お問い合わせ