和風スパゲティのレシピ

日本語でコーディングするExcelVBA

WorksheetFunctionの呼び出しを短縮する方法

WorksheetFunctionはとても便利です。

WorksheetFunction.Sum(合計したいセル範囲)

というただの合計ですら、WorksheetFunctionの方が簡単に書ける上に、
処理速度もWorksheetFunctionの方が早いです。

SUMIF、COUNTIF、VLOOKUPあたりの超便利な関数たちでやるような処理を、
WorksheetFunctionで瞬殺できるのは、ExcelVBAの大きな強みでしょう。


さて、この大変便利なWorksheetFunctionさんですが、
コードが長いという弱点があります。

コード中に何度も登場すると、打つのも面倒だし読みづらいですよね。


これを短縮する方法がこちらです。

' 汎用関数として持っておく
Function Fx() As WorksheetFunction
    Set Fx = WorksheetFunction
End Function

' 使用例
Fx.Sum(合計したいセル範囲)

WorksheetFunctionオブジェクトをそのまま返すだけの関数を作っておけば、
その関数名だけでWorksheetFunctionを呼び出せます。

Wfでもwsfでもなんでもいいので、呼びやすい名前にしてしまいましょう。


とても簡単な方法ですが、効果は絶大です。

Cells(Fx.Match(検索値, 検索エリア, 0), 2)

のように、引数などに入れても全く邪魔になりませんので、
WorksheetFunctionの長所である手軽さが、さらに強化されますよ。

ぜひ使ってみてください。


「オブジェクトを返す関数」に慣れる、一番簡単なサンプルかもしれませんね。

Functionプロシージャを使わない方法

汎用関数集を作って運用している方は、そこにこれを追加するだけですが、
汎用関数を使っていない方や使えないマクロにおいて、
この関数をわざわざ都度作るのは面倒です。

その場合に、Functionプロシージャを利用せずに短縮呼び出しする方法も書いておきますね。

あまり「コレ!」ってくらい便利なものではないので、
何かのヒント・アイデアになればという程度です。

Withステートメント

WorksheetFunctionをWithすることで、以降「.Sum」などのように関数を呼べるようになります。

With WorksheetFunction

    .Sum(合計したいセル範囲)

End With

WorksheetFunctionを多用する箇所では、Withを使うと手っ取り早いですね。

変数

関数に出来るのですから、当然変数にもできます。

Dim Fx_ As WorksheetFunction :Set Fx_ = WorksheetFunction

Fx_.Sum(合計したいセル範囲)

まあこれやるくらいなら、関数を作ってしまった方がいい気がしますが、一応紹介しておきます。

ユーザー辞書

wf ⇒WorksheetFunction.

と変換に辞書登録しておくことで、
読みづらさは変わりませんが、かなり書きやすくはなります。

すみf ⇒WorksheetFunction.Sumif(

などを用意しておくのもよいかもしれません。


以上3点です。そんなに便利ではないですが、他に応用の効きやすいトリオなので、WorksheetFunction以外にも使いどころはあると思います。

引き出しとして持っておくと使い道があるかもしれません。

おまけ:FileSystemObjectでも同じことができる

同じことをFileSystemObjectでやるのもかなりおすすめです。

Function FSO() As Object
    Static FSO_ As Object
    If FSO_ Is Nothing Then Set FSO_ = CreateObject("Scripting.FileSystemObject")
    Set FSO = FSO_
End Function

この関数を用意しておくことで、

' ファイルをコピー
FSO.CopyFile wbコピー元ブック.FullName, Pathコピー先フォルダ & "\" & wbコピー元ブック.Name

と、メインコードでは突如「FSO」と書き始めることができます。


↓のコードを毎回コピペするのが面倒な方は、是非使ってみてください。

Dim FSO As Object
Set FSO = CreateObject("Scripting.FileSystemObject")


コードの詳しい解説はこちらをどうぞ
www.limecode.jp