【備忘録6】ExcelVBA~ワークシート関数、エラー処理、クラスモジュール~

ExcelVBA-マクロ

ワークシート上で使用する標準の関数だけでも、うまく組み合わせてネストすることで機能的かつ複雑な処理が可能となるため、むやみやたらにマクロを使用するのはよくありません。普通に関数で対応できることを無理にマクロでやろうとすると、かえって使いずらくしてしまいます。
やはり基本をしっかりと押さえて様々な関数をうまく使いこなすことがExcel本来の機能を最大限に発揮できる最良の方法だと思います。
ちなみに複数の関数を何重にもネストしないといけないような場合はマクロを使った方がよりシンプルに書けていい場合もあります。まぁそのへんは状況によりけりですね。

そしてなんとExcelVBAではマクロに通常のワークシート関数を組み込んで使用することが可能です。
処理内容によってはVBA関数よりもワークシート関数の方が適している場合があり、それぞれの特徴と得意分野を理解して使い分けることで処理速度を大幅に向上することもできます。

ということで、今回はワークシート関数とエラー処理について記録していきます。
また、クラスモジュールやユーザー定義関数(自作関数)についても少し触れたいと思います。

スポンサーリンク

ワークシート関数について

VBAマクロでワークシート関数を使用する方法

WorksheetFunction.ワークシート関数

VLOOKUP、INDEX、MATCH、SUM、COUNTなど、ワークシート上で使用する関数をそのままマクロにも使用できる。

配列からセルに一括転記する際の注意点

ワークシート関数で配列を参照範囲に指定すると、配列のインデックス番号下限値が0でも1でも関係なく、下限値の要素がインデックス番号1の要素となる。
つまり配列(0,0)の要素をワークシート関数で参照する場合は参照範囲が(1,1)となる。

例:指定した配列の行番号のすべての列を一括で貼り付ける
  配列のインデックス番号下限値が0の場合

Range(セル範囲).Value = WorksheetFunction.Index(配列, 行番号 + 1, 0)

この例では列に「0」を指定しているため、全ての列を貼り付ける。
※ワークシート上ではインデックス番号の下限値が必ず1以上となるため、参照範囲に0を指定すると行または列すべての指定となる

シート内の検索においてはマクロを使用するとループ処理が必要になるため、ワークシート関数のVLOOKUPやINDEX+MATCH関数を使った方が処理速度は速くなる。
※但しマクロはDICTIONARY(連想配列)を使用することで高速化できる

エラー処理について

エラーが発生するとプログラムの実行が中断されてしまうため、それを回避する手段として利用する。

エラーを無視する

On Error Resume Next

エラーが発生しても無視して次のコードを実行する。

エラー発生時は指定したラベルに飛ぶ

On Error GoTo ラベル名
(処理)

ラベル名:
(処理)

エラーが発生した場合はラベル名のところまで飛ぶ。

有効になったエラー処理を無効にする

On Error GoTo 0

有効になったエラー処理を無効にする

実際のエラー処理の流れ

Sub test()
On Error GoTo ラベル名 'エラーが発生した場合はラベル名に飛ぶ
(処理)
Exit Sub

ラベル名:
(エラー発生時の処理)
Resume Next 'エラーが発生した次の行からプログラムの実行を再開する
End Sub

クラスモジュールについて

独自に作成したクラスにメソッドやプロパティを追加することで、より複雑かつ高度なプログラミングが可能になる。

クラスモジュールの作成手順

1.クラスモジュールを挿入する
2.オブジェクト名を任意のクラス名に変更する
3.SubプロシージャまたはFunctionプロシージャにてメソッドを作成する

クラスモジュールを挿入するとオブジェクトブラウザの一覧に表示され、メソッドやプロパティがメンバ一覧に表示される。

クラスモジュールの利用方法

作成したクラスからオブジェクトを作成する。(インスタンス化)

Dim 変数名 As クラス名
Set 変数名 = New クラス名
  ↓
(1行で書くと)
Dim 変数名 As New クラス名

使用例

クラスモジュールのオブジェクト名(クラス名)を「Sample」とする

クラスモジュール内にメソッドを定義する

メソッド①
 Sub メソッド名①()
  処理
 End Sub

メソッド②
 Sub メソッド名②()
  処理
 End Sub

メンバ一覧にSampleクラスのメソッドが追加される

クラスからインスタンスを作成する

標準モジュールにて
 Dim obj As Sample
 Set obj = New Sample
 または1行で「Dim obj As New Sample」
メソッドを実行
 obj.メソッド①など

自作関数(ユーザー定義関数)について

Functionプロシージャは標準モジュールのSubプロシージャで呼び出すサブルーチンとして利用するが、実はExcelシート内で他のワークシート関数同様に利用できる。

Functionプロシージャ名(引数1 As Long,Optional 引数2 As long = 1,引数3 As long = 1) As long

※「Optional」は初期値で、一度指定すると以降の引数は全て省略可能として初期値を指定しなければならない

最後に

とりあえず、第6回まで続いた備忘録はこれで一旦終了となります。

コメント

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