Excelを勉強しましょう EnjoyExcel

Excelは人に聞いても覚えられません。自分で調べてやってみて覚えていくための助けになりたいと思っています。

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:20210719171351p: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かもしれないし関数やピボットテーブルの記事にするのか全く決めていませんが不定期でブログを書いていきます。お疲れ様でした。

VBA⑬ VBAでは関数とワークシート関数って分けて使います。

f:id:EnjoyExcel:20210628130926p:plain

 

関数には関数扱いするプログラム自体を指す関数とワークシート関数があります。そうやって分けて書いている本もあるので私も分けて紹介してみようと思います。

 

前回は繰り返し処理について紹介させていただきました。 

enjoyexcel.hatenablog.com

 

ではまず関数扱いするプログラム自体を指す関数というのはどういったものなのかという事を書いていきます。

 

Sub ~ EndSub までが1つのプログラムだと紹介してきました。プログラムというと伝わらない事があるかもしれませんので正式にはプロシージャと言います。1つのサブプロシージャが・・・という感じで使います。

 

たとえば最終行や最終列を認識するようなコードはプロシージャ毎に書くと面倒だしコード自体も長くなります。そんな時の為に別で最終行と最終列を確認するプロシージャを用意してしまいそれを関数と呼んでいます。

毎回関数を参照しに行く事で結果を取得する様にして同じコードを書かないというのが狙いです。

 

結果を返すという意味では関数ですが1つのプロシージャになりますのでワークシート関数と同じ様に考えるとちょっと違和感ありますよね。書籍によってはこれを関数と呼ぶ場合もありますのでご注意ください。

 

別プロシージャを関数として使用するには引数等他の情報についても説明が必要ですがあまり行き過ぎると初級編を超えてしまうのでひとまずここまでにします。興味ある方は調べてみてください。

 

次にワークシート関数です。

これは御馴染みのセルに書く関数です。

コードの先頭に WorksheetFunction. と書くと使える関数が出てきます。

以下はVLOOKUPを探している最中の画像です。

f:id:EnjoyExcel:20210628112749p:plain

というわけでワークシート関数も使えます。

 

ただし・・・

・書き方はVBAの作法で。

・ワークシート関数の中でも使えない関数もある。

VBA側でも用意された関数がありそれにはWorkSheetFunction.は書かない。

 

またいつもの例外ばっかですね。

でも1つ1つ使いながら覚えていくしかないです。持久戦だと思って対応してください。先に書かないといけなかったのですが「サクッとVBA」って考えている人は考えを変えてください。かならず量をこなす時が来てやらないと絶対知識は定着しません。

 

では話を元に戻します。

VLOOKUP(第1引数,第2引数,第3引数,第4引数)これがワークシート関数のVLOOKUP

です。

 

第1引数

対象範囲の中から検索したい文字、数値(セルの場合もある)

 

第2引数

対象範囲 選択範囲の1番左に第1引数がくるように範囲を指定

 

第3引数

第2引数の何列目を持ってくるのかを指定

 

第4引数

完全一致か類似か(ここはほぼ完全一致ですね False です)

 

こんな感じですね。これをVBAで書くと以下のようになります。

f:id:EnjoyExcel:20210628133540p:plain

ワークシートの画面は以下のようなレイアウトです。

個人情報風のデータは「なんちゃって個人情報」で生成したダミーです。

f:id:EnjoyExcel:20210628144406p:plain

A6からの表ですがB列に名前が居るのでB6を一番左の列にとったリストを第2引数にしてB2の値がB列にいたらいたらC2にI列の部署をもってきてくださいという関数です。結果は「経理」となりますね。

 

最終行はA列で認識して最終列は6行目で認識・・・って感じです。

enjoyexcel.hatenablog.com

 

あとは実行ボタンやC2の値をクリアするボタン、B7からI列の最終行までを一括で削除するボタンを作ってあげたら簡易的な検索ツールが出来ます。

 

ベースとなるデータ用意して名前をB2に書いてボタン押すだけで部署が分かるので誰でも使えますね。

 

ただですね・・・VLOOKUP関数をシートで使った際 #N/A が出る事ってないですか?VBAでこれを出してしまうとコード自体がエラーですってメッセージボックスが出てきてしまうんですよ。 以下のようなメッセージボックスが出ます。

f:id:EnjoyExcel:20210628133155p:plain

実行時エラー1004はいろんな要因がありますが1つは取得したいデータが存在しないというものがあります。文言から推測しても結果が取得出来ないんだ=多分データないってことね。と判断します。

 

VBAに限らずですがプログラミング言語のエラーメッセージって結構不親切でピンポイントでどこが悪くて理由は○○ですって言ってもらえることは少ないです。

 

エラーメッセージとどう向き合っていくかも課題です。都度調べることが必要になります。

 

話を戻します。エラーメッセージが出てしまうという事でしたね。

検索がストップしてしまいメッセージボックスが出てくるので知らない人が使うと「エラーが出ます」ってなりますね。困ります。

 

では上記の改善を含め最後に今まで勉強したことをある程度使ってデータ抽出が出来るようなものを用意してみたいと思います。

VBA⑫ 繰り返し処理が出来ると沢山の仕事をこなせます。

f:id:EnjoyExcel:20210628094046p:plain

今回は繰り返し処理です。ループって呼んだりもします。

 

 前回はメッセージボックスとIF文について勉強しましたね。

IF文と今回のループが理解出来るとさらに色んな事が出来るようになります。

もう少しお付き合いください。

enjoyexcel.hatenablog.com

 

では早速始めます。

 

繰り返し処理についても他の処理と同様色んな方法があります。繰り返し処理はフォーマットが様々で1つの処理を勉強しても書き方が違うので横展出来ません。ただ一定の条件でコードをループさせるという事については共通です。

 

今回私が記事を書いたのは勉強初期に自力で学習出来るところまでサポートしたいという思いがある為ですので全部は説明しません。代表的なものを1つ挙げて説明させていただきます。

 

それは「For Next」というコードになります。

早速コードを紹介します。

これはセルA2~セルA1000に おはようございます と記入するコードです。

f:id:EnjoyExcel:20210628101037p:plain

 

まず今まで勉強してきたものを整理します。

ForとNext以外はなんとなく分かりますよね。

・Sub ○○○()~ EndSub までが1つのかたまり

・Dim ~ は変数の定義

・cells ~ はセルの番地に変数を使った処理

 

For Nextの説明に移ります。

簡単にいうと For と Next の間をループします。

 

・・・いやいや簡単すぎでしょ。。。ちゃんと説明します。

 

まず最初のコードです。

For 変数 = ○○ to ××

 

これは型だと思ってください。

変数 は各自で好きなものを設定してください。ひとまず定義はIntegerで良いかと思います。3万行を超えるような仕事になったらLongにする必要があります。忘れてしまった方は以前の記事を参照ください。

enjoyexcel.hatenablog.com

 

次に 〇〇 to ×× です。

上記のコードでは 2 to 1000 になってますね。これは2~1000まで数値が1つずつ変わりますという事を書いています。

 

Next は次に進んでしまうのではなく次のループに入ってくださいという事でFor~にコードを戻す役割をしています。

 

コードが流れる順番としては以下のようになっています。

f:id:EnjoyExcel:20210628102455p:plain

 

① d に 2 がセットされる

② Cells(2,1) = "おはようございます"  ’セルA2に おはようございます

③ For に戻る

④ d に 3 がセットされる

⑤ Cells(3,1) = "おはようございます"  ’セルA3に おはようございます

⑥ For に戻る

⑦ d に 4 がセットされる

⑧ Cells(4,1) = "おはようございます"  ’セルA4に おはようございます

⑨ For に戻る

 

dが1000に達するまで続いてdが1001になったらForで指定した数値の範囲外になるので処理が終了し次の処理に進む。という流れになります。

 

いかがでしょうか?理解出来ましたか?分かりにくい方のためにもう少し手掛かりを提供します。最初のころVBEの説明をしました。ローカルウインドウという場所があったのを覚えていますか?

enjoyexcel.hatenablog.com

ここを見る時がきました。

 

ローカルウインドウがデフォルトで出てないという方はVBEの画面の上方に「表示」というアイコンがいますのでそこからローカルウインドウを選択してください。

 

ではコードウインドウに戻りまして先程書いたコードのどこでも良いのでマウスでワンクリックしてからF8キーを押してみてください。先頭のSub・・・が黄色の枠に変化して左に矢印出ていませんか?

f:id:EnjoyExcel:20210628103535p:plain

こんな感じ。

 

これってコードを1行ずつ実行できるという機能なんですよ。もっと前に言えよって言われてしまうかもしれませんね。お許しください。

 

ではF8キーを1回押していきますと変数の定義はスルーされてForのところに黄色の枠が来ていますね。そこでローカルウインドウを見るとdが値0でInteger型という記載を見つけることが出来ます。

f:id:EnjoyExcel:20210628103802p:plain

次にF8キーを押すと おはようございますのところに黄色の枠が移動しますね。

ローカルウインドウのdの値には2がセットされています。

f:id:EnjoyExcel:20210628103907p:plain

F8キーを押すたびに黄色枠動いていき黄色枠がコードを通過すると処理が済むという流れで進んでいきます。

 

もう1回F8キーを押すとNextに黄色枠が進みます。セルA2にはおはようございますが入力されていると思います。

 

次にF8キーを押すとForに戻らずおはようございますのコードに来ます。これはForを無視しているのではなく省略されているだけです。dの値が3になっている事でdはちゃんと数値を変えながらループしている事が分かります。

f:id:EnjoyExcel:20210628104439p:plain

F8キーを数千回押さないと処理が終了しないのでVBE画面の上部「実行」からリセットを押しましょう。これで途中でも処理を抜けられます。セルにはおはようございますが記載されてしまっていると思いますのでひとまず手動で消しましょう。

f:id:EnjoyExcel:20210628104529p:plain

 

いかがでしょうか。理解は進みましたか?

前回のIF文と組み合わせて使うとかなり多くの事が出来る様になります。

例えば表のすべての行をループさせるコードを書いてループさせたセルに書いてある情報がAならBする、CならDするという様に処理を分岐させながら表のすべての情報を仕分け出来てしまうんですよ。これって今までの手作業からするとかなり大きな事じゃないですか?

 

ここにVLOOKUP関数等ワークシート関数を混ぜて使うとさらに使い勝手の良いものが出来るかもしれません。この後はワークシート関数を勉強して最後に1つVLOOKUP関数を用いたデータ抽出シートを作る予定です。ひとまずそこまでをもってVBAの勉強を終了したいと思っています。

 

次いきましょう。

VBA⑪ メッセージボックス。アプリケーションっぽくなってきた。

f:id:EnjoyExcel:20210627203040p:plain

余談ですけど N-Box知ってる人居ますか?

 

当時ジュビロ磐田で名波さんを中心に据えたフォーメーションです。藤田、服部、福西等々のメンバーがフォーメーションをどんどん入れ替えながら流れるような攻撃を展開していく様は驚きしかなかったです。ポジションなんか関係なく常にグルグルしている印象でさっきボランチにいたのに今は左サイドですか??みたいな感じでしたよ。

 

今でもあれよりすごい連動性があるチームは日本にはないんじゃないかと思っています。(他サポさん申し訳ございません)

 

では勉強を進めます。前回はメソッドについて少し説明しました。

enjoyexcel.hatenablog.com

 

今回はメッセージボックスになります。

実行ボタンを押した後に以下のようにメッセージボックスを出してみようと思っています。

f:id:EnjoyExcel:20210627220340p:plain

 

アプリケーションっぽくなりますよね。加えてIF文について勉強できるので採用してみました。

 

建付けとしては実行ボタンを押したら上記のようにメッセージボックスを出してOKならOKの処理を行いキャンセルならキャンセルの処理を行うというコードを書いてみます。

 

まずはコードを紹介します。

f:id:EnjoyExcel:20210627222202p:plain

キーとなるのは2つ。

メッセージボックスの書き方とIF文の書き方ですね。

 

メッセージボックスは以下のように書きます。

 

ちょっと理屈っぽくコードの骨格を書いてみます。

(ちょっとずつ出していきますので慣れてください)

 

MsgBox ( prompt , [Buttons],[Title],[HelpFile],[Context])

 

[ ] の中は省略可能です。 promptだけは必須です。

 

prompt

メッセージボックスに表示させる文字です。上の画像に置き換えると「実行しますか」という文字になります。

 

Buttons

ボタンの種類やアラートマークの設定をします。今回はOKとCancelを表示させたかったのでvbOKCancelにしています。 +vbExclamationで警告メッセージを出しています。上の画像に置き換えると「△の中に!マークがある表示」ですね。

 

Title

メッセージボックスのタイトルです。上の画像に置き換えると「テスト」という文字です。

 

HelpFile と Context は私も分かりません。(すいません)多分使わないと思いますが興味ある方は調べてみてください。

 

メッセージボックスのOKボタンは戻り値が1、キャンセルボタンは戻り値が2です。

どちらか押されたボタンの戻り値が変数「回答」に収納されるという建付けになっています。ちなみに変数の宣言は1か2しかないのでIntegerで適当だと思います。

 

メッセージボックスにはもっとたくさんの仕様がありますがここでは省略します。今回の形を覚えてもらえればあとは要素を入れ替えるだけです。このまま先に進みます。

 

次にIF文です。

 

IF文も形が決まっています。

 

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

IF  条件 Then

 条件がTrueだった時の処理

Else

 条件がFalseだった時の処理

End If

↑ここまで。

 

これに当てはめればOK。ワークシート関数でIF文書いている人達は結構イメージしやすいのでは?と思います。 IF(条件,Trueの時,Falseの時) っていう関数を縦に書いただけっていう感じを個人的には持っています。

 

今回はメッセージボックスでOKボタンが押されて変数「回答」に1が代入されたらセルA1に OKですよ と表示されます。メッセージボックスでキャンセルボタンが押されて変数「回答」に2が代入されたらセルA1に Cancelですよ と表示されるというコードになっています。

 

いかがでしょうか?理解出来ましたか?

 

ワークシート関数の様にIF文を重ねて書いたりすることも可能です。IF文が理解出来るとコードの幅が広がりやれることも増えます。

 

なによりIF文はマクロの記録では再現出来ないコードになりますのでこれが書けるだけで普通の方が出来ない事が出来るという事になります。

 

では次はループ処理です。これもマクロの記録では書けないコードです。

 

みんなで勉強してスキルアップしましょう。

VBA⑩ メソッドについて触れてないので少し話をします。

f:id:EnjoyExcel:20210627191826p:plain

 

オブジェクトやプロパティはちょくちょく登場してますがメソッドの話をしていないので少し触れます。

 

前回は罫線を引くのと実行用のボタンの作り方を紹介しています。

enjoyexcel.hatenablog.com

 

罫線を書くマクロを構築して実行ボタンで線を引くところまでは出来そうですが次のデータをもらうためには最後に画面から情報を消すという作業が必要です。

 

値をクリアに・・・って事ですがこれって以前に少しだけ紹介しています。

ほぼ一番最後のあたり。 ClearContents の話をしています。

enjoyexcel.hatenablog.com

 

この ClearContents は名前の通りの作業をするのですがくくりとしてはメソッドの一員です。

メソッドってなんでしょうか?メソッドというのはオブジェクトに対して命令を出すワードってぐらいに思っておいてください。

 

セルの値を削除やコピー&ペーストって感じでしょうか。オブジェクト、プロパティ同様かなりたくさんあるので覚えなくてもよいです。使いながら覚えていくというのが良いと思っています。 以前も書きましたが「習うより慣れろ」です。

 

使い方は オブジェクト.メソッド という感じでドットの後にワードを置くといった感じです。

 

例えば・・・

Range("A1").Clear Contents   ’セルの内容のみクリア

Range("A1").Clear   ’セルの内容と書式をクリア

Range("A1").ClearFormats   ’セルの書式のみクリア

 

オブジェクトの直下にきてますね。単にクリアだけでもいろんなメソッドが居ますね。

 

次はコピー&ペースト と カット&ペースト です。

Range("A1").Copy Range("B1")   ’A1の値をコピーしてB1に貼付け

Range("A1").Cut Range("B1")   ’A1の値をカットしてB1に貼付け

 

最後にコピー&ペーストの形式を選択して貼り付けの中から値貼付けを紹介します。

Range("A1").Copy

Range("B1").PasteSpecial xlPasteValues

 

こんな感じです。プロパティに値を代入の時は「=」を使っていましたがメソッドは直接オブジェクトに対して指示を出します。

 

オブジェクト?プロパティ?メソッド?は最初は分からないと思います。

私はコードを書いて実行して画面の動きを見ながら色々試した結果後付けで理解しました。 今は理解出来なくても良いです。コピーするときやデータを消すときは上記のように書けばデータをコピー出来たりデータを消せるって思って使ってみてください。

 

ふと分かる時が来ます。VBAのシリーズではないのですがExcelを勉強するにあたって本をどうやって選んだらよいのか?という事について触れた記事があります。

enjoyexcel.hatenablog.com

 

その時のレベルで読める本がその人にとって一番良い本ですという事を書いています。オブジェクトの話は私自身も完全に理解してすべて説明できるかといわれると怪しいです。でもやれることはありますので不完全でも前に進むことを考えましょう。

 

いつかは理解出来る時が来ます。

 

ではメッセージボックスとIF文に入りましょうか。