VBAが嫌いな人が書いたVBA入門記事その4です。初心者の人も最低限だけ身に付けてPythonに移行しましょう。→VBAユーザーのためのPython入門 ~xlwingsでExcelからPythonを呼び出す~
記事一覧
- Excel VBA入門 ~その1 Excel VBAとは~
- Excel VBA入門 ~その2 最初のプログラム~
- Excel VBA入門 ~その3 基礎1~
- Excel VBA入門 ~その4 基礎2~
- Excel VBA入門 ~その5 Tips~
- Excel VBA入門 ~その6 アンチパターン~
オブジェクトとは
プログラミング全般で言うオブジェクトとは、データ(属性/プロパティ)と手続(メソッド)を一つのまとまりとして持つデータ構造。よりプログラムを効率的に作成するための仕組みで、多くのプログラミング言語がこの機能を使えるようにしている。ただし、VBAのオブジェクト対応は中途半端なため、既存オブジェクトは使えるが、まともに作ることはできない。
オブジェクトとプロパティ/メソッドの例:
-
- プロパティ
-
Worksheets: Worksheetのコレクション(これもオブジェクト!)を返す。
Dim ws as Worksheet For Each ws in Workbook.Worksheets '各ワークシートに対する処理 Next
-
Worksheets: Worksheetのコレクション(これもオブジェクト!)を返す。
- メソッド
-
Close: ワークブックを閉じる。
Workbook.Close(SaveChanges:=True) 'ブックを保存して閉じる
-
Close: ワークブックを閉じる。
- プロパティ
配列とコレクション
配列
配列とは同じデータ型を決まった数だけ格納したデータのこと。
Dim 配列名(要素数) As データ型 '配列の宣言
Dim 配列名 As Variant
Redim 配列名(要素数) As データ型 '要素数を可変にする(=要素数に変数を使う)には、Variant型で宣言し、再度Redimで宣言する
Ubound(配列名) '配列の要素数を取得
使用例
'選択した範囲のセルの行ごとの和を配列arryに格納する
Dim rg as Range
Set rg = Selection
Dim arry as Variant
Redim arry(rg.Rows.count) As Double
Dim i as Long
For i = 1 to Ubound(arry)
arry(i) = sum(rg.Rows(i))
Next
コレクション
コレクションとは、同じデータ型を任意の数だけ格納したデータのこと。自分で定義するよりも、親オブジェクトのプロパティから取得することが多い。例えば、WorkbookオブジェクトのWorksheetsコレクション(Worksheet型を要素とするコレクション)や、ListObjectオブジェクトのListRowsコレクション(ListRow型を要素とするコレクション)など。●●sコレクションの要素は●●となっていることが多い。
Dim ws as Worksheet
For Each ws in Workbook.Worksheets
'各ワークシートに対する処理
Next
プロパティやメソッドの使い勝手が配列よりも良いため、こちらを使う方が楽な場合が多い。
関数定義
コードが大きくなった場合、関数を使うことで可読性・保守性を高めることができる。
Function 関数名(引数1 As 引数1の型, 引数2 As 引数2の型, …) As 戻り値の型
'処理
'…
関数名 = 戻り値 '関数名に戻り値を代入して返す
End Function
関数定義のメリット
- 同じ処理の抽出: コピペの修正盛れを防ぐ
- 入力・出力の明確化: この処理で必要なものと得られるものを明示
- 処理のカプセル化: 不要な中間変数等を外に出さない
関数を使う前
Sub test()
Dim rg1 as Range, rg2 as Range
Dim sqSum1 as Double, sqSum2 as Double
Dim cll as Range
Set rg1 = Sheet1.Range("A1:C2")
sqSum1 = 0
For Each cll in rg1
sqSum1 = sqSum1 + cll.Value^2
Next
Set rg2 = Sheet1.Range("D1:F2")
sqSum2 = 0
For Each cll in rg1 'スペルミス
sqSum2 = sqSum2 + cll.Value^2
Next
debug.print sqSum1 + sqSum2
End Sub
関数を使った後
Funciton sqSum(rg as Range) as Double
Dim cll as Range
Dim rtn as Double
rtn = 0
For Each cll in rg
rtn = rtn + cll.Value^2
Next
sqSum = rtn
End Function
Sub test()
debug.print sqSum(Sheet1.Range("A1:C2")) + sqSum2(Sheet1.Range("D1:F2"))
End Sub
エラー処理
以下のコードで、On Error Resume Next
からOn Error GoTo 0
の間で生じたエラーを無視する。
On Error Resume Next
処理1
処理2
…
On Error GoTo 0
VBAのエラー処理はしょぼいのでいろいろ諦める(On Error GoTo 行ラベル
は使わない)。
参照設定
参照設定を行うことで標準以外の機能を使えるようになる。参照設定はファイル単位で行う必要があることに注意。
参照設定を行うには、VBE -> メニューバー「ツール」 -> 参照設定で使いたい機能のチェックをオンにする。よく使う機能は「Microsoft Scripting Runtime」。コレクションよりも便利なDictionaryや、ファイル操作ができるFileSystemObjectが含まれる。