Excelを勉強しましょう EnjoyExcel

アイコンの機能や関数の説明、VBA初心者向けの勉強方法について情報掲載しています。関数、VBAともに理解が進むように出来るだけ事例を交えて説明しています。

④条件分岐 If~Then(Ifのネスト)

f:id:EnjoyExcel:20210906154231p:plain

前回は「ElseIf」の処理について紹介しました。

 

enjoyexcel.hatenablog.com

 

今までは1つの条件に対して1つの処理という形をとってきましたが2つの条件に合致した時だけ処理をさせる等複数条件を絡めて処理を実行させたい時にどうするのかというのを紹介させていただきます。

 

例えば下表の「A」は「条件1」と「条件2」が「○」です。他の英文字の条件にも○と×があってAからDまで4種類の設定があります。各種処理させたい内容が違う際は今までの条件分岐では表現が難しいですね。

f:id:EnjoyExcel:20210906133111p:plain

最終的には4通りの処理を書く事になるのですが条件をどうやって組んだらよいのか考えないといけません。

 

そこで今回は「ネスト」というコードを紹介します。

 

「ネスト」だったり「入れ子」と呼んだりする様ですが今回は「ネスト」で進めます。

 

「ネスト」というのはある処理の中にもう一つ処理を埋め込むというようなイメージを持っていただくと理解出来るのではないかと思います。コードのフォーマットを見ていただくと分かると思いますのでまずは話を進めますね。

 

以下データを使って説明します。

f:id:EnjoyExcel:20210906141557p:plain

 

セルB9、B10で条件に対し選択を行いセルC12付近にある実行ボタンを押すとセルA13に品目が表示されるというデータです。この場合セルA13には「カツカレーうどん」が表示されることになります。

(セルB9、B10はプルダウン等で選択させることで指定文字以外を表示出来ない様にすると良いかと思います。)

 

ではフォーマットを提示します。コードに色を3色使っていますがこの後の説明で分かりやすくするためです。VBEに書く際に3色で色分けという形にはなりません。分かりにくい際は各自コメントで補ってください。

 

IF 条件が「AA」だったら Then

 

 If 条件が「BB」だったら Then

  条件「AA」=True、「BB」=Trueの処理

 Else 条件が「 BB」ではない時

  条件「AA」=True、「BB」=Falseの処理

 end If

 

Else 条件が「AA」ではない時

 

 If 条件が「BB」だったら Then

  条件「AA」=False、「BB」=Trueの処理

 Else 条件が「 BB」ではない時

  条件「AA」=False、「BB」=Falseの処理

 End If

 

End If

 

今回も「日本語+コード」で表現してからコードを書いてみましょう。

 

IF セルB9の値が”ライス” だったら Then

 

 If セルB10の値が”カツ” だったら Then

  セルA13に「カツカレーライス」を入力

 Else セルB10の値が”カツ” ではない時

  セルA13に「エビフライカレーライス」を入力

 end If

 

Else セルB9の値が”ライス” ではない時

 

 If セルB10の値が”カツ” だったら Then

  セルA13に「カツカレーうどん」を入力

 Else セルB10の値が”カツ” ではない時

  セルA13に「エビフライカレーうどん」を入力

 end If

 

End If

 

ではつぎはコードに変換します。

 

IF Range("B9") = "ライス"  Then

 

 If Range("B9") = "カツ" Then

  Range("A13")=Range("A2")

 Else 

  Range("A13")=Range("A3")

 end If

 

Else 

 

 If Range("B10") = "カツ" Then

  Range("A13")=Range("A4")

 Else 

  Range("A13")=Range("A5")

 end If

 

End If

 

先程「ネスト」というのは「ある処理の中にもう一つ処理を埋め込む事」と書きました。見た目で分かるように色を変えてみたのですがいかがでしょうか。ご理解いただけましたか?

 

一番外枠の水色のコードがベースになっていて水色のコードでTrueの際ピンク色のコードに落ちて再び分岐処理に入ります。このピンク色のIf~ThenからEnd Ifまでのコードが埋め込まれているコードになります。水色のコード=Trueは続いているので最終的に以下のうちどちらかの条件が設定される事になります。

 

水色 = True、ピンク色 = True

水色 = True、ピンク色 = False

 

水色のコードでFalseの際は紫色のコードに落ちて再び分岐処理に入ります。この紫色のIf~ThenからEnd Ifまでのコードが埋め込まれているコードになります。水色のコード=Falseは続いているので最終的に以下のうちどちらかの条件が設定される事になります。

 

水色 = False、紫色 = True

水色 = False、紫色 = False

 

このように4通りの処理を表現出来る様になります。条件分岐についてはこれで終了となります。

 

実務ではどんな条件があってどんな分岐が必要なのかによって今まで提示した①~④のコードを使い分ける事になります。コードが書けることは必須ですがまずは直面した仕事を条件と処理にわけて分岐を作るという行為(仕事をコードに落とし込む)が出来ないといけません。

 

これは条件分岐に限らずですが実際の仕事をコード化させる事が出来る様になるとコードの理解が進みます。反対にコードが分かってくると実際の仕事を見たり聞いたりしただけである程度コードが頭に浮かんでくるようになります。

 

私はコードを書く前に紙を使います。紙に実際の仕事を書き出して条件と処理に分けてから線で繋いで・・・と書きながら仕事を理解してどうやってコードを書けばよいのかある程度考えてからPCに向かいます。ある程度といいますか事前検討のほとんどは紙でやりますね。結果これが一番早いかつ手戻りも少ないと思います。ここは各自やり方があると思いますので自分なりのやり方を構築してみてください。

 

こんな感じでコードを書く以外にもやる事沢山ありますので大変ですがなんとか頑張っていきましょう。

③条件分岐 ElseIf

f:id:EnjoyExcel:20210906113523p:plain

 

前回は「Select~Case」の処理について紹介しました。

 

enjoyexcel.hatenablog.com

 

最初に提示した「IF~Then」より色んな挨拶に対して対応出来るようになりましたが提示した条件以外の挨拶があった際には処理をスルーしてしまうというコードでした。

 

近年は無言の人に率先して挨拶していくと煙たがられたりするので「無言の人には無言で」という事でも良いと思いますがどんな挨拶でも挨拶いただいた際は何か返しが欲しいですよね。

 

「想定してない挨拶が来た時には全部この返しで行きます」という受け皿を1つ作ってあげると良いのではと思います。

 

というわけで今回は「ElseIf」というコードを使った処理を紹介します。

 

毎度ですがまずは型(フォーマット)を見てください。

 

IF 条件が「AA」だったら Then

 条件「AA」向けの処理

ElseIf 条件が「BB」だったら Then

 条件「BB」向けの処理

ElseIf 条件が「CC」だったら Then

 条件「CC」向けの処理

ElseIf 条件が「DD」だったら Then

 条件「DD」向けの処理

Else 上記で提示した条件に全て当てはまらなかったら

 受け皿的回答を用意

End If

 

では今回も「日本語+コード」で表現してからコードを書いてみましょう。

 

IF セルA1の値が”おはようございます”だったら Then

 セル「A2」に”おはようございます”を入力

ElseIf セルA1の値が”こんにちは”だったら Then

 セル「A2」に”こんにちは”を入力

ElseIf セルA1の値が”こんばんは”だったら Then

 セル「A2」に”こんばんは”を入力

ElseIf セルA1の値が空欄だったら Then

 セル「A2」は空欄のまま

Else 上記で提示した条件に全て当てはまらなかったら

 セル「A2」に”ごきげんよう”を入力

End If

 

ではつぎはコードに変換します。

 

IF Range("A1") = "おはようございます" Then

 Range("A2") = "おはようございます"

ElseIf Range("A1") = "こんにちは" Then

 Range("A2") = "こんにちは"

ElseIf Range("A1") = "こんばんは" Then

 Range("A2") = "こんばんは"

ElseIf Range("A1") = "" Then

 Range("A2") = ""

Else 

 Range("A2") = "ごきげんよう"

End If

 

イメージは「If~Then」の分岐処理と「Select~Case」の複数条件提示の良いとこ取りみたいな感じです。

 

まず「If~Then」で一つ目の条件を提示し合致しなければ次の「ElseIf」に落ちていきます。最終的に提示した条件に引っ掛からない時は「Else」の処理が実行されます。

 

これで複数の挨拶に対して対応出来るようになったのと無言の人への無言対応(諸説有)、条件提示出来てない挨拶への返しが出来るようになりました。

 

今回は挨拶でコードを表現しましたが値であったり何らかの条件(文字や色)で処理を分ける事で色んな処理が出来ると思います。

 

では次が条件分岐としては最後の記事になります。今までは何か1つの条件に合致した時にその条件に用意された処理を行うというコードでしたが次は複数の条件に合致しないと実行されない処理(例えば〇〇部+男性社員等)のように条件を重ねて指定出来るコードを紹介します。

②条件分岐 Select~Case

f:id:EnjoyExcel:20210903113800p:plain

前回は条件分岐の基本となる「If~Then」の処理について紹介しました。

 

enjoyexcel.hatenablog.com

 

挨拶について条件と処理を設定する中で生活の実態と合わないところが出ていましたので今回はもう少し条件と処理に幅を持たせて出来るだけ実生活に近い事が表現出来ればなと思っています。

 

今回は「Select ~Case」という処理を使います。

 

「If~Then」と同じ様にまずは型(フォーマット)を見てください。

 

Select Case 条件

 

case 条件が「AA」だったら

 条件「AA」向けの処理

case 条件が「BB」だったら

 条件「BB」向けの処理

case 条件が「CC」だったら

 条件「CC」向けの処理

case 条件が「ZZ」だったら

 条件「ZZ」向けの処理

End Select

 

条件の入り口は1つですが色んな条件を設定出来ます。処理も条件に応じて分ける事が可能ですので「If~Then」より表現の幅は広がります。

 

では今回も「日本語+コード」で表現してからコードを書いてみましょう。

 

Select Case セルA1の値が・・・

 

Case ”おはようございます”だったら

 セルA2に”おはようございます”を入力

Case こんにちは”だったら

 セルA2にこんにちはを入力

Case こんばんはだったら

 セルA2にこんばんはを入力

Case おはだったら

 セルA2におはを入力

End Select

 

ではつぎはコードに変換します。

 

Select Case Range("A1").value

 

Case "おはようございます"

 Range("A2") = "おはようございます"

Case "こんにちは"

 Range("A2") = "こんにちは"

Case "こんばんは"

 Range("A2") = "こんばんは"

Case "おは"

 Range("A2") = "おは"

End Select

 

これでいろんな挨拶に対応出来ますね。Select~Caseはうまく使うと色んな条件に対応出来るコードです。前回の記事から見ていただいているとコードの実行結果は想像出来ると思いますので今回は省略します。

 

これで複数の挨拶に対して対応出来るようになったのですが相変わらず無言の人に対してどうやって挨拶を返そうか悩みます。加えて条件で提示出来なかった挨拶が来た際はこのままだとスルーしてしまう事になります。

 

上記で提示した「おは」ぐらいだったら想像出来ますが「うっす」とか「おぅ」、「調子どう?」・・・色んな声の掛け合いがあるのでまだ条件と処理が足りない気がします。

 

上記の様にある程度の選択肢を用意する事で十分だと思うのですがもう少しだけ頑張ってみましょう。次回別の条件分岐を使う事で対応してみます。

①条件分岐 If~Then

f:id:EnjoyExcel:20210903113551p:plain

今回から条件分岐について書いていこうと思います。

 

そもそも「条件分岐」とは?って思いますよね。以下のように4回に分けて説明していきます。

 

 

では説明にはいります。

 

突然ですがVBAを書いていくと以下のような事ありませんか?

・〇〇の時だけ△△の処理をさせたい。

・〇〇以外の時だけ◇◇の処理をさせたい。

 

上記のような人の意思が入ったような事をさせたい時に使うのが「条件分岐」です。加えて「条件分岐」はマクロの記録では再現出来ません。自力でコードが書けないと出来ない処理ですが覚えてしまえば他者との差別化も可能です。是非覚えてください。

 

条件分岐の方法はいくつかあります。

・If~Then

・If~Then (ElseIfを用いた処理)

・If~Then(Ifのネスト)

・Select~Case

 

主な処理としてはこのぐらいでしょうか。

「If~Then」っていうのはコードを略して書いていましてあだ名みたいなものです。

「If~Then 使ってコード書けば出来そうだよね。」なんて感じで使います。

 

提示した4件については使い分けの明確な条件は無く状況に応じて使い分けます。使っていくと各自で住み分けが出来てくると思いますのでまずは気にせず一通り理屈を覚えていきましょう。

 

では「If~Then」から。

以前 社内のVBA勉強会用に用意した記事でも説明させていただいてますのでひとまずリンクを貼らせていただきます。

enjoyexcel.hatenablog.com

リンク先の中段から後半にかけて「If~Then」の説明をしています。

(リンク先ではIF文という表現をしています)

 

リンク先と内容重複するところもありますが説明を続けます。

最初に型(フォーマット)を提示します。

 

↓以下がフォーマットです。

IF  条件 Then

 条件がTrueだった時の処理

Else

 条件がFalseだった時の処理

End If

こんな感じで「If~Then」の他にも「Else」と「End IF」が加わりフォーマットが形成されます。

 

基本は水色の文字の部分がベースになって間に条件や処理を記入します。

 

ただし「Else」だけは必要に応じて記入します。「〇〇のときは××する」だけ設定したいときは「〇〇じゃない時」の事を考えなくて良いのでElseは必要無い為です。

 

必ず必要なのは「If」「Then」「End If」。状況に応じて「Else」も必要。という事になりますね。

 

最初に指定した条件に当てはまるときは「True」となりますので上段へ処理を書く。条件に当てはまらない時は「False」となりますので下段へ処理を書くといった具合にコードを書き分けます。

 

基本となる「If~Then」ではこのように1つの条件に対して最低1つ、最高2つの選択肢を提示出来ます。

 

では実際にコードを書いてみましょう。

ひとまず「コード+日本語」で書いてその後コードに置き換えてみます。

 

IF セルA1が”おはようございます”だったら Then

 セルA2に”おはようございます”を入力   ・・・ True の時

Else

 セルA2に”こんにちは”を入力   ・・・False の時

End If

 

これをコードとして書いてみます。

 

If Range("A1") = "おはようございます" Then

 Range("A2") = "おはようございます"

Else

 Range("A2") = "こんにちは"

End If

 

このような形になります。

型(フォーマット)が決まっていて条件と選択肢を決まった位置に書くだけなので扱いやすそうですね。

 

コードを実行した結果は以下のようになるはずです。

f:id:EnjoyExcel:20210903100916p:plain

 

「おはようございます」以外は「こんにちは」になります。

セルA1が空欄(無言)でもセルA2に「こんにちは」が入力される仕様です。

f:id:EnjoyExcel:20210903101000p:plain

 

処理としては合ってます。期待した結果が出ているのですがこれだと生活の実態に合ってない気がします。

 

朝「おはよ」に対して「こんにちは」は返さない(多分)ですよね。無言ですれ違った人に「こんにちは」って言ったら「?」ってなりそうです。

 

日々の生活の1コマを表現するには上記コードでは少し足りない気がします。

 

「挨拶」という行為は1つだとしても挨拶に種類がありますのでIF~Thenだけでは表現するのが難しそうです。

 

ではもう少し条件、処理について他の条件分岐を使いながら深堀りしていきましょう。

ExcelVBA番外編 勉強初期にオブジェクトとプロパティは理解した方が良いのか?

f:id:EnjoyExcel:20210719163126p:plain

結論としては理解した方が良いですね。

知ってた方が書いてるコードと理屈の整合が取れるので理解が早いと思います。

 

でも最初から全部理解しようとすると難しいかもしれません。私は独学だったのでぼやっと理解するまで数ヵ月かかりました。

 

勉強初期はあまり深く考えずコードたくさん書こうと思っている派ですがオブジェクトとプロパティの説明が欲しい方も居るのではと思い自分が分からなかったところを意識して記事を書いてみようと思いました。

 

記事を書いてみようと思ったのはもう一つ理由があります。数日前からVBAの勉強会が始まりました。

 

まだ初回でしてブログでいうとVBAの①~⑤の記事を使って説明をさせてもらいました。この時点で理解度を確認すると「理解出来た」という人の比率が7割~8割ぐらいでした。最初なので比較的高い理解度だったと思います。

 

enjoyexcel.hatenablog.com

enjoyexcel.hatenablog.com

enjoyexcel.hatenablog.com

enjoyexcel.hatenablog.com

enjoyexcel.hatenablog.com

 

そんな中私の中で力不足を感じているのがオブジェクト、プロパティの説明です。うまく出来ていない気がしています。という事で勉強会でうまく伝えられない自分のフォローをしようと思い付けたしで記事を書こうと思います。

 

では早速。

 

オブジェクトとプロパティの関係は1つのオブジェクトを起点としてみた時にオブジェクトに紐付いているプロパティはそのオブジェクトの属性となります。

 

これは代表例ですがRangeオブジェクトを起点としてみた時にFontやInteriorはRangeオブジェクトのプロパティ(属性)という事になります。(実際のプロパティはもっとたくさん存在します。あくまで一例です。)

f:id:EnjoyExcel:20210720091145p:plain

セルにはフォントだったり背景色等の情報が紐付いているとイメージすると良いかもしれません。手作業でやる時も「このセルの文字の大きさを〇〇にして・・・」と作業すると思いますが図で表現すると上図のように要素が繋がっているんだなと思ってください。

 

今度はWorksheetオブジェクトとRangeオブジェクトの関係です。

下図のトップに居るWorksheet(青)とRange(黄)は両方共オブジェクトです。

 

ただしWorksheetの属性として居るRangeはプロパティです。

 

f:id:EnjoyExcel:20210720091517p:plain

WorksheetオブジェクトのRangeプロパティからRangeオブジェクトの値を取得するという方法でコードを繋いでいます。つまりプロパティはその後に続くオブジェクトを引っ張ってくる為の手掛かりのような役割をしています。

 

上記の様にコードはオブジェクトが繋がって構成されていると思ってください。コードを書く=オブジェクトを繋ぐというようなイメージを持ってもらえると理解が進むと思います。その繋ぎ役でプロパティが居るよという感じでしょうか。

 

今はRangeプロパティがRangeオブジェクトを引っ張ってくるというざっくりした説明だけなので全部理解するのは難しいと思います。「こんな感じだろうな」というイメージを少しだけでも持てたらOKです。もう少し詳しく説明するので今までの説明をふまえて以下を見ていきましょう。

 

Range("A1") ="おはようございます" 

 

を省略せずに書いてみます。

 

Application.workbooks("〇〇.xlsm").worksheets("△△").Range("A1").value = "おはようございます"

 

となります。以下はオブジェクトとプロパティの関係を言葉と絵で表現してみました。

 

f:id:EnjoyExcel:20210720132924p:plain

 

ここからはオブジェクトブラウザを見ながら上記コードと絵の説明をしてみようと思います。

 

VBEを画面に展開後F2キーを押すことでオブジェクトブラウザが立ち上がります。

f:id:EnjoyExcel:20210719164715p:plain

クラスの中に居る外枠白×内装グレーの背景に赤と青と黄色の四角のような物体が居るアイコンがオブジェクトです。コードの先頭に出てきたApplicationオブジェクトを探してみましょう。

 

Applicationオブジェクトを選択すると(背景青で白文字は選択されているということです)右側に使えるプロパティ、メソッド、イベント等が並びます。

 

このリストの中からWorkbooksプロパティを探して選択してみます。紙を指で指しているようなアイコンがプロパティ、緑の箱が飛んでるアイコンがメソッド、稲妻のアイコンがイベントです。ここではそれぞれの説明は省略します。上図では点線で囲まれているWorkbooksプロパティを選択すると下のグレー色の枠の中に以下のような表記が出てきます。

f:id:EnjoyExcel:20210719164746p:plain

実際にコードを書く際はまずApplicationの後はWorkbooksじゃないとダメという事ですね。Applicationオブジェクトが保有しているプロパティの中にWorkbookは居ないのでWorkbookでは繋がらないという事になります。

 

続いてWorkbooksは読取専用です。コードに書いたWorkboksの引数 ("○○.xlsm") を用いてWorkbookを特定し値を返してもらう事で("〇〇.xlsm")というWorkbookを特定しています。イメージですが直接値を定義するのではなく「値を出力するので読み取ってください」という意味の読み取り専用だと思っています。

 

序盤にWorksheetオブジェクトとRangeプロパティの関係を説明しましたがこれも同じようにRangeプロパティがRangeオブジェクトの値を返すことで次のオブジェクト(モジュール)にコードを繋いでいるという役割をしています。

 

Workbookの値が取得出来ているという事で次にはWorkbookオブジェクトをトップにしてシートを指定する為のプロパティを選んでみようと思います。

f:id:EnjoyExcel:20210719170205p:plain

f:id:EnjoyExcel:20210719170227p:plain

これもWorkbooksとWorkbookの関係と同じです。WorkbookオブジェクトにはWorksheetsプロパティが居て worksheets("△△") を用いてWorksheetを特定し値を返してもらう事で("△△")というWorksheetを特定しています。

 

Worksheet以下のRangeは序盤で説明したとおりです。最後のValueは以降にオブジェクトが無いので繋がりません。Valueプロパティ自体に値を代入したりする事になります。

 

コードの中にWorkbookやWorksheet(両方共単数形ですね)が出てこないのは結果として単体のオブジェクトは特定されていますが別のオブジェクトからもたらされた値を使っているという事になります。

f:id:EnjoyExcel:20210824105216p:plain

しつこい様ですがコードに注釈をつけると上記のような感じになると思います。

 

参考ですがエラーが出る書き方をしてみました。これではオブジェクトとプロパティの繋がりが無くエラーが出ます。

 

f:id:EnjoyExcel:20210719171514p:plain

 

オブジェクトからみて「指定したプロパティは持ってないですよ」と言っています。

f:id:EnjoyExcel:20210719171708p:plain

 

一つの簡単なコードでも考えていくと結構深くていろんな要素が詰まっています。 長くなってしまいました。読んでいただいた皆様ご理解いただけたでしょうか。

どの言語から勉強したら良いのでしょうか?・・・それはその人次第なのです。

f:id:EnjoyExcel:20210714234832p:plain

今回は体験談のような記事です。どのプログラミング言語を勉強するか悩んでいる人は読んでいただけると参考になるかもしれません。

 

いきなりですが・・・私は最初にどの言語を勉強しようかすごく迷ったんですよ。

 

結論から申しますと「自分の仕事につながる事、自分が趣味でやりたい事につながる言語を選んだ方が良い」と思います。

 

私が最初にExcelVBAを選んだのは仕事においてメインで使っているはExcelだったからです。客先や社内においても最も使用されているアプリケーションの1つというのが選定理由の中で大きなウエイトを占めています。

 

あまり社内のことは書くべきではないのですがこれぐらいなら会社が特定されるわけでもないので大丈夫だと思います。(思いたい。。)というわけで私の職場環境の話はこのぐらいにしましょう。

 

開発用の言語って沢山ありましてざっくり環境の話をすると時代にあった流行りの言語の軸があったりずっと残っている老舗のような言語の軸があったり混沌としています。かといってやりたい事を軸にして言語を選んでも似たようなことが出来るのに違う言語も居たりする、他の言語との関連性も考えなきゃいけない等々選ぶのが難しいです。

 

加えて1つ目の言語を選ぶ時って自分の中に評価軸がないからどれを選んだらよいのか全く見当もつかないわけでほんと困るんですよ。

 

「やりたいこと=〇〇という言語」 じゃないんですよね。

 

そんな中でも勉強するための方向性は決めないといけないのでまずは自分が何に困っているのか?何がしたいのか?を自問自答しましょう。

 

やりたい事が決まったら「プログラミング言語」というワードと一緒にネットで検索をします。(HTMLはプログラミング言語じゃない等諸説ありますがひとまず置いときます)

 

そうすると関連の言語がいくつか出てきますので今度はそれらを調べます。「どんなアウトプットをもたらすのか」、「書店に本は多いのか」、youtube等の「動画配信関連で露出が多い言語なのか」とか様々です。自分が勉強していけるモチベーションが保てるのかどうかを確認する必要があります。

 

近場ににその言語に明るい人が居るかというのも結構重要です。こんな時代でも困ったときは対面で話すのが一番わかりやすいです。私はここが無かったので最初結構苦労しましたね。

 

決まったらとにかくスタートしましょう。少しでも勉強を始めて感触をつかんでください。まずは始めないと何も起きません。

 

私はExcelVBAの勉強もしつつ半年ぐらい前からHTML、CSSPHPSQLの勉強をしています。動機は部内で自作のアプリケーションを立ち上げてみたいと思ったからです。

 

私が挙げた情報が抜き取られて転用されるかもしれないというリスクや開発環境の構築については別で考えていますのでここでは紹介しません。どうやって言語の選定に至ったのかだけ紹介します。

 

まずはネットワーク環境に情報を展開する事が必要だったのでインターフェイスを準備する為にどんな言語が必要なのか調べたところHTMLとCSSという言語がある事が分かりました。

 

実際の成果物を想像してさらに検討してみると画面遷移はHTMLでも用意出来ると思っていたのですが調査していくと画面内で入力した情報を掴んだままの次画面への移動だったり情報をストックする為の箱を用意するとなると HTMLだけでは対応出来ないという事も分かってきました。

 

さらに調査をしていくといろんな言語があったのですが上記を満たすにはPHPという言語が比較的有効で情報をストックする箱への情報の出し入れはSQLという言語が必要だという事も分かりました。

 

どうやって複数の言語を絡めていくのかについて調査するとHTMLの中にPHPを書いてさらにその中にSQLを書く事で情報と画面に動きを出すことが出来るという事も分かりました。CSSはHTMLで用意したインターフェイスのレイアウトや色を管理する言語だという事も理解出来ました。

 

これは運が良かったのですが比較的近場で勉強出来る先生を見つける事が出来てその方がPHPに詳しかったというのもPHPを選ぶ要因だったと思います。最終的にはこの辺りまできてから4つの言語を勉強しようと決めました。

 

冒頭でも申し上げましたがこのような感じでやりたい事先行で言語を選んでいただくのが一番良いと思っています。決してはやりの言語だからという軸で選ばないようにしてくださいね。

 

VBA⑭ VLOOKUP関数を知らない人でも使えるツールを作ってみよう。

f:id:EnjoyExcel:20210628150154p:plain

キャッチ画像にもある様にVBAのシリーズとしては完結編になります。もう少しお付き合いください。よろしくお願い致します。

 

前回はワークシート関数のVLOOKUPを使ってみようという記事でしたね。
enjoyexcel.hatenablog.com

 

でも検索対象となるデータがデータベースに無い時にはエラーになってしまうという事で不完全なコードでした。エラーが出る原因からすると今後も起こる可能性があります。

 

ではどうしたら良いでしょうか?エラーが出るときと出ないときの条件がほとんど明確なので条件分岐を使って考えてみましょうか。

 

データがあるときはVLOOKUPを実行しデータが無い時はVLOOKUPを実行せず「データが無いよ」って言ってあげれば良さそうな気がします。

 

ってことはやっぱり条件分岐が使えそうな感じがしてきますね。IF文採用しましょう。

 

続いてデータの有無を確認するにはいろいろな方法がありますが今回もワークシート関数を使いましょう。COUNTIF関数を使います。

 

ワークシート関数のCOUNTIFは

COUNTIF(第1引数,第2引数)という形です。

 

第1引数

関数実行時の対象となるデータベースの範囲です。

 

第2引数

データベースの中で検索したい文字です。

 

COUNTIF(第1引数,第2引数)>0  という条件にしたらデータベースの中に第2引数の情報が居るのか確認出来ますね。

 

上記をIF文の先頭にしてTRUEだったらVLOOKUP、FALSEだったら”該当なし”等の言葉を出してあげればエラーは出ないです。

 

前回のワークシートのネタを元にコードを組んでみました。

これでエラーが出ない様になってます。

 

f:id:EnjoyExcel:20210628152701p:plain

 

では仕上げです。課題としては今まで勉強してきたことでほとんどは対応可能ですがちょっと背伸びしてるところもあります。教えてないところもありますがやってみましょう。

 

データシートは2枚になります。

プロジェクトエクスプローラは以下のようになっています。

f:id:EnjoyExcel:20210628153343p:plain

こちらは Sheet1(データベース) という名前のシートです。

これも「なんちゃって個人情報」で作成しているダミーデータです。

各自コードを書くときは名前列とは別にあと2つの列の情報を適当に作成してみてください。件数は10件もあれば良いと思います。

f:id:EnjoyExcel:20210628153046p:plain

 

こちらは Sheet2(抽出シート) という名前のシートです。

f:id:EnjoyExcel:20210628153139p:plain

 

データベースは5000件です。抽出シートのD列は200件です。私が用意したデータと同じ量は必要無いと思います。

 

課題

抽出シートにある名前とデータベースの名前が一致したら抽出シートのE、F列に都道府県とカレーの食べ方を引っ張ってくるという仕様のデータを用意してみてください。

 

抽出シートの実行ボタンで作業を行う様コードを作りこんでみてください。

抽出シートの削除ボタンは抽出シートのE、F列を削除する際に使用します。

 

ってことはプロシージャとしては2つですね。実行と削除を分けて作ってください。

 

ヒント

・コードは標準モジュールに書きましょう。

 

・For~Next でループさせるのは抽出シートのD列の情報です。

 

・ループは5行目、もしくは6行目から最終行とします。

 

・データベースの情報についても最終行と最終列を認識する必要があります。

 

・抽出シートの名前がデータベースの中に居るのか確認しましょう。名前が居たらVLOOKUPを行い居なかったら”該当なし”を表示させましょう。

 

都道府県とカレーの食べ方を抽出するのでVLOOKUPは2つ必要です。

 

・シート間の情報を扱いますのでRangeやCellsの前にSheetを指定する必要があります。(これはまだ紹介していません)

 

・削除データは単純に範囲を決めて削除という形でもOKです。

 

いかがでしょうか。前の記事に戻っていただき探すのも良しYahooさんやGoogleさんに頼るも良しです。考えながら書いてテストするという事が重要です。こんな感じで実務ではやりたい事を整理してコードに変換し自力で書いてテストするという事が求められます。

 

コード書いてるだけでしょ?って思っている人も居るかもしれませんが実際は依頼された仕事を理解してどうやって使うのか考えながら設計図を作りコードを書いてテストし依頼者へ納品する。納品後使用感をみてもらい修正を行うまでやり通すという事がほとんどだと思います。

 

スキルの無い人の依頼は「どんな使い方したい」とかアウトプットのイメージなんて無くただ「楽にして」です。伝わりにくいのですがこちらが考える事は結構多いです。

 

ではコードの話に戻ります。

答え載せておきます。変数に日本語使うのは抵抗あるという人も居ますが私は問題無いと思います。誤作動もしませんので。私は変数を英語でも書きますが日本語の方が引継ぎが楽な印象があります。何やってるか伝わりやすい事が多のでメリットもありますよ。

 

実行ボタンのコードです。


Sub vlookup()

'変数の定義
Dim 行 As Long
Dim 列 As Long
Dim 抽出行 As Long

'画面更新の停止
Application.ScreenUpdating = False

'抽出シートの4列目をループする
For 抽出行 = 6 To Cells(Rows.Count, 4).End(xlUp).Row

'データベースの最終行と最終列を確認する
With Sheet1
行 = .Cells(Rows.Count, 1).End(xlUp).Row
列 = .Cells(5, Columns.Count).End(xlToLeft).Column
End With

'抽出シートの名前がデータベースに居るのか確認。
If WorksheetFunction.CountIf(Sheet1.Range(Sheet1.Cells(6, 1), Sheet1.Cells(行, 1)), Sheet2.Cells(抽出行, 4)) > 0 Then

'居たらVLOOKUPで結果を抽出
Cells(抽出行, 5) = WorksheetFunction.vlookup(Sheet2.Cells(抽出行, 4), Sheet1.Range(Sheet1.Cells(6, 1), Sheet1.Cells(行, 列)), 8, False)
Cells(抽出行, 6) = WorksheetFunction.vlookup(Sheet2.Cells(抽出行, 4), Sheet1.Range(Sheet1.Cells(6, 1), Sheet1.Cells(行, 列)), 10, False)

Else
'居ない時は「該当なし」と表示させる
Cells(抽出行, 5) = "該当なし"
Cells(抽出行, 6) = "該当なし"

End If

Next
'画面更新停止の解除
Application.ScreenUpdating = True
End Sub

f:id:EnjoyExcel:20210628160319p:plain

削除ボタンのコードです。


Sub clear()

'変数の定義
Dim 行 As Long
Dim 行2 As Long

'抽出シートの都道府県とカレーの食べ方が入力されている列の最終行を認識
行 = Cells(Rows.Count, 5).End(xlUp).Row
行2 = Cells(Rows.Count, 6).End(xlUp).Row

'抽出シートの都道府県とカレーの食べ方が入力されている列の最終行が5より大きかったら・・・
If 行>5 and 行2>5 then

'結果をクリアにする(都道府県とカレー食べ方の抽出結果を消去する)
Range(Cells(6, 5), Cells(行, 6)).ClearContents

End If

End Sub

f:id:EnjoyExcel:20210628160340p:plain

vlookupプロシージャの Application.ScreenUpdating や clearプロシージャの比較演算子、IF文の中でのAndの使い方は興味がある方は調べてみてください。そこからまた勉強が始まると思いますが知識の積み重ねだと思ってやってみてください。

 

長くなりましたが以上となります。

ここまで出来れば書店に行ってもVBA初級編の本なら結構読めると思います。厚みのある専門書みたいなものではなく「いけそうな気がする」本を手に取ってください。

 

それでも???になったらもう1回勉強し直しましょう。ネタはなんでも良いです。1回でうまくいくことは無いので繰り返し勉強しましょう。

 

この時期にこういった記事を書いたのは自分なりに意味があって8月の連休をターゲットにしているます。そこまでで下地を作ってもらって8月の連休でコードをたくさん書いてもらえると連休明けから皆様の仕事が片付くのでは?という思いがあります。

 

私事ですが7月には社内でVBAの勉強会も予定しています。募集をしたら思ったより集まっていただきました。他拠点の方にもオンラインで聞いていただく事になっているのでしっかりやらなきゃなと思っています。このブログをベースに勉強会をやろうと思っています。

 

では次からはVBAかもしれないし関数やピボットテーブルの記事にするのか全く決めていませんが不定期でブログを書いていきます。お疲れ様でした。