仕事で未だに使うことのあるを改めて体系的に学びたく
を読んでいく。
目次
2. オブジェクトでExcelの機能にアクセスする
2.1 イミディエイトウィンドウの使い方
を扱うに当たり、イミディエイトウィンドウを知っておくと便利である。イミディエイトウィンドウは、
- マクロの実行結果を表示する
- 1行分のコードをその場で入力して実行する
ことができる。その場で実行するには、イミディエイトウィンドウに実行したいコードを記述した後にキーを押せばよい。
' イミディエイトウィンドウに結果を出力する Sub debug_test() Debug.Print ("Hello VBA!") End Sub
またイミディエイトウィンドウを用いる際、「?」を用いると便利である。ユーザーがさせたいと思っていたことを側で類推し、その構文が書かれたと見なして実行してくれる(このときの「?」をシンタックスシュガーという。)。たとえば? "Hello, VBA!"はDebug.Print "Hello, VBA!"として扱われる。
2.1.1 補足
は大文字・小文字を区別しない。
はコードウィンドウに入力したコードを自動修正してくれる。
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 入力値を消去する
セルの値を消去する方法に以下のものがある。これはシート上でキーを押した際の挙動に相当する。
Sub test() Range("B2").ClearContents 'セルB2の値を消去する End Sub
ではこのように、
の一般機能が、特定のオブジェクト(操作対象のことで、ここでは
)のメソッドとして整理され、割り当てられている。
に用意されている機能を実行するような操作は、「捜査対象を指定後に、実行したい機能(メソッド)を指定」する。
2.3 Excelの各機能はオブジェクトごとに整理されている
の機能を
から利用するためのコードは、まず操作対象を指定することから始まる。この操作対象のことをオブジェクトという。
オブジェクト |
用途 |
---|---|
セルに対する操作 | |
シートに対する操作 | |
ブックに対する操作 | |
フォントに対する操作 | |
セルの書式に対する操作 | |
並べ替え設定に対する操作 | |
フィルター設定に対する操作 |
2.3.1 オブジェクトとプロパティ・メソッド
各オブジェクトにはプロパティおよびメソッドが用意されている。プロパティは値や状態といった「特徴・状態」を扱いたいときに利用し、メソッドはオブジェクトに応じた「機能・命令」を扱いたい際に利用する。プロパティやメソッドを利用する場合はドットシンタックス方式*2で記述する。
オブジェクトのプロパティ例
プロパティ |
用途 |
---|---|
セルの値を取得/設定する | |
セルの幅を取得する | |
セルの書式情報に関する |
オブジェクトのメソッド例
メソッド |
用途 |
---|---|
セルをクリアする | |
セルの値や式のみをクリアする | |
セルを削除する |
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 コレクション経由でオブジェクトを指定する
は、同じ種類のオブジェクトをまとめて扱うためにコレクションという仕組みが用意されている。コレクションの多くは「オブジェクト名+複数形の『s』」という名前が付けられている。
コレクションからそのメンバー*4を指定するには、コレクションの後ろに括弧を付け、指定したいものを指すインデックス番号または名前を指定する。
'コレクション(インデックス番号) または 'コレクション(名前) Worksheets(1) Worksheets("Sheet1")
2.4.2 オブジェクトの階層構造から指定する
もう1つの方法として、あるオブジェクトに関連する他のオブジェクトを、対応するプロパティ経由で指定するものがある。のオブジェクトは階層構造で辿れるようになっている。
プロパティの例 |
アクセス対象 |
---|---|
セルに関連する |
|
セルに関連する |
|
セルに関連する |
|
セルに関連する |
'例:書式情報へアクセスして背景色を変更 Range("A1").Interior.Color = RGB(255,0,0)
2.4.3 Rangeでセルを指定する
セル(オブジェクト)のみコレクション経由/階層構造からのアクセスとは異なる方法でアクセスする。
'Range(アドレス文字列)で指定する ' 例1:セルA1に値を設定 Range("A1").Value=100 ' 例2:セル範囲C1:E3に値を設定 Range("C1:E3").Value="VBA"
また単一のセルにアクセスするにはプロパティを用いる方法もある。
'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 アクティブなもの・選択しているものにアクセスする
特定のオブジェクトにアクセスするには以下のようなプロパティをもちいればよい。
プロパティの例 |
操作対象 |
---|---|
アクティブなセル | |
選択しているセル範囲または選択中の図形 | |
アクティブなシート | |
アクティブなブック | |
アクティブなウィンドウ |
'ActiveCellを使ってアクティブな単一セルを操作対象に指定 ActiveCell.Value="VBA" 'Selectionを使って選択セル範囲全体を操作対象に指定 Selection.Value="VBA"