VBAの高速化!関数の複合利用とVBAでの利用について

 

いたちめです。

 

茶番な、前回のあらすじと今回の内容

ふと手帳に挟んでいる、勝利の導きてフレイヤが目に入ったので

遊戯王カードで遊んでいた頃を思い出しながら書いてますので

間違いとかあれば「この方がよくね?」と教えて下さい。

 

前回のあらすじ

VBAをコピペで高速化という武器を手に入れ、次なる試練に挑む主人公。

セルに数式を入力させて、高速化を計ろうとするが、

目の前に立ちはだかる四天王の手札をもつエクセール。

辛くも、エクセールの手札、「IF」を撃破。

 

今回のダイジェスト

「クッ!IFがやれれたか!しかしIFは最弱にして最強

その本当の脅威、思い知るがいい!」

 

いくぞ!ずっと俺のターン!

 

手札より装備カード「早すぎた埋葬」を発動!

墓地に送られたIFをフィールドに攻撃表示で特殊召喚。

 

更に、魔法カード「融合」を発動!

VLOOK、ISERROR、SUMIFSの魂を捧げ、IFと共に墓地に送る。

 

トラップカード「マクロコスモス」を発動!

墓地に送られるはずのVLOOK、ISERROR、SUMIFSを

異次元へ追放することによって上位IFを特殊召喚!

 

特殊召喚、多段IF!

 

更に魔法カード、「異次元からの帰還」を発動!

除外となったVLOOK、ISERROR、SUMIFSをフィールドに帰還させる!

 

さあ、今のお前にこいつを止められるか!?

魔法カード「大嵐」「ハリケーン」を発動!

フィールド上の全てのカード、魔法、トラップを墓地に送り

 

思考の流れよりも赤き存在(もの)

時間(とき)の流れに埋もれし偉大なる汝の名において、我ここに理論に誓わん!

 

合体特殊召喚!

 

打ち滅ぼせ!無限多段IF!

 

最後だ!手札より速攻魔法カード「地獄の暴走召喚」

フィールドに墓地に送ったすべてのカードを特殊召喚するっっ!

 

「最弱が最も最も最も最も最も最も最も最も最も最も最も最も最も

最も最も最も最も最も最も最も最も最も最も最も恐ろしいマギーッ!」

 

プレイヤーに!

ダイレクトアタッ

 

ごめん。ここまで書いててなんだけど、面倒臭くなった

 

 

スポンサーリンク

関数四天王の複合させた関数を使ってみよう

前回の内容で

単独のIF、VLOOK、ISERROR、SUMIFS

の関数四天王は、使える様になりましたか?

 

 

IFを主軸として関数を融合させてみよう

ざっくりとしすぎた説明と例です。

 

IFとISERRORを融合

たとえば、

もし、数式がエラーの時はセルを空白にして、エラーじゃなければ答えを出す。

そんなときに使います。

 

式:IF (ISERROR(数式)、“”、数式)

 

 

IFとVLOOKを融合

たとえば

もし、検索した数値(文字)がなければセルを空白にして、

あれば指定した列のものを表示させる。

そんなときに使います。

 

式:IF (VLOOKUP(数式)=指定数値(文字)、VLOOKUP(数式)、“”)

 

 

IFとISERRORとVLOOKを融合

たとえば、検索した数値(文字)がなげればセルを空白にして、

あれば指定した列のものを表示させる。

ただし、その検索する数値(文字)が検索するものの中にあるとは限らない。

そんなときに使います。

 

式:IF(ISERROR(VLOOKUP(数式))、“”、IF(VLOOKUP(数式)=指定数値(文字)、VLOOKUP(数式)、“”)

 

 

2以上の関数を同時に使う関数の作り方

どうでしょう、先の例はわかりました?

もし意味がわからないのであれば、一つ前の段階、

「単独で関数を使える」状態になりましょう。

 

なお、この「2以上の関数を同時に使う関数」の主軸はIFです。

 

論理的思考よりもフローチャートで考える。

IFは常に2択です。3択ではありません。

これが原則です。

 

なので、YESかNOにしか分岐しません。

2進法ですね。

 

 

IFの階層は3階層くらいがベスト

関数のメンテナンス性のことを考えて、

深くても3階層くらいまでに抑えましょう。

 

長々と数式を作って悦に浸るのは

個人の勝手なので、一向に構いませんが

 

時間が経って見直すとき、数式を紐解くのが面倒臭いよ?

 

僕のオススメとしては、

複数のセルに渡って、加工をすすめていくことです。

非表示にすれば一発でスッキリ☆

 

 

VBAでセルに関数を入力させる方法を間違えてみよう

最初からうまくいったら、覚えませんよ?

基本のおさらい

VBAでセルに何か入力するときって覚えていますか?

 

Range(“A1”).value = 「入力させるもの」

 

これが基本パターンですね。

Dim i as String

i = 「入力させるもの」

Range(“A1”).value = i

 

こんな感じで、入力させるものを変数にする方法もありますね。

 

数式を入力させるときは、慣れるまでの間は基本パターンをお勧めします。

慣れてくれば、好きなだけ変数を利用して下さい。

 

 

セルに数式を入力してみよう☆

これでやっと本題です。

実際にVBAで実際にセルに数式を入力する構文を書いてみよう。

 

例題:SUM(A1:A100)をセルB1に入力させる

 

多分、Range(“B1”).value = SUM(A1:A100)

 

と入力して、コンパイルエラーと怒られて

 

Range(“B1”).value = SUM(A1、A100)

 

みたいに「」を「」に変更したりして?

で、実行すると、

 

「SubまたはFunctionが定義されていません」

 

と表示されるまでのテンプレ通りだったら、ありがたい☆

 

 

エラーになる理由は入力させる方法を間違ったから

では、なぜエラーになったか?というのが大事です。

VBAでセルに関数を入力させるのは、2種類あります。

 

意味としてはざっくりだけど「文字列」として入力する方法

 

「Application.WorksheetFunction」を利用して入力する方法

 

どちらかを利用しないと、例題のエラーみたいになるわけです。

 

 

意味としてはざっくりだけど「文字列」として入力

こちらは、すごく簡単。

ときにより、「“」の使う回数がハンパないので要注意。

では、さきほどの例題をそのまま流用します。

 

答え:Range(“B1”).value = “ =SUM(A1:A100)”

 

=SUM(A1:A100)を文字列として入力させてやるわけです。

 

 

応用の例題:=VLOOKUP(“C”、B1:D100、2、FALSE)

 

これを、SUMのときと同じ様にやってみましょう。

 

 

Rnage(“A1”). Value =” =VLOOKUP(“C”、B1:D100、2、FALSE)”

 

って、書いた人!その、まっすぐな心が嬉しいよ!

 

勿論、エラーになるね☆

なぜって「C」という文字列を「“」で挟んでるからね。

 

 

ここで「&」が登場するよ

※「&」の使い方は持ってるテキストでも見てね、説明は割愛するよ☆

 

では。

 

答え:Rnage("A1").Value = " =VLOOKUP(" & "C" & "、B1:D100、2、FALSE)"

 

このままだと、わけわかないから分解して考えます。

 

“ =VLOOKUP("

"C"

"、B1:D100、2、FALSE)"

 

この3つに分かれているンだね。

これを「&」でくっつけてあげるわけ。

 

空欄の表記は覚えてる?

「“”」だね。あたり。

 

そう。これが「“」を使う回数がハンパなくなる理由。

 

この節の参考までに、僕が実際に作ったデータベースでの数式入力を載せます。

 

Range("M" & n).Value = "=IF(A" & n & "="""","""",SUMIFS(G:G,A:A,A" & n & ",E:E,E" & n & ")-SUMIFS(J:J,A:A,A" & n & ",E:E,E" & n & "))"

 

まぁ、一見して面倒臭い。

「n」は変数で別のところから数値を持ってきています。

 

詳しい説明はここでは省きますが、valueではなく、Formulaを使ってもOKですが

まずは、使って覚えてみましょう☆

 

 

「Application.WorksheetFunction」を使って関数を入力

これも覚えてしまえば非常に楽なのですが、

これはVBAがノートで、エクセルが回答用紙になります。

 

なので

=SUM(A1:A100)をVBA上で行い

結果をエクセルの指定したセルに入力します。

 

メリットとして、計算過程がエクセルから判別できないから、

給与査定だとか第三者に数式を見せたくないときに有効です。

 

デメリットとして、ちょっと算式を見たいときは必ずVBAを開く必要があり

ちょっと面倒。

 

例のSUM(A1:A100)を早速やってみましょう。

 

答え:Range("B1").Value = Application.WorksheetFunction.Sum(Range("A1:A100"))

 

気が付きましたか?

SUM()のセルの位置はRangeプロパティで記入します。

 

 

以上2つのやり方ですが、これはもう好みです。

 

僕はデータベースを作るとき、給与査定計算書を作るとき

それぞれエクセル上で算式を組んで

実際に稼働させてからVBAに書き込みました。

 

コピペが楽なので、

意味としてざっくりだけど「文字」として入力させるやり方の方が好きです。

 

「“」が面倒ですけどね

 

今回は以上です☆

スポンサーリンク

Twitterでフォローしよう

おすすめの記事