どうも。つじけ(tsujikenzo)です。実はノンプロ研VBA初級講座3期を受講しておりまして、隔週の更新になりますが、学んだことをアウトプットしていきたいと思います。
VBA初級講座を受講します
ノンプロ研にて2020年11月14日(月)より全6回行われるVBA初級講座3期を受講しています。もともとレコーディングマクロでVBAを眺めていたのが私のプログラミングをするきっかけですが、受講中に気付いたことや学んだことをアウトプットしたいと思います。(自分用のメモ要素が強いです。ご容赦くださいませ。)
自己紹介
Slackでは流れてしまうので、記念に自己紹介で書いたことを残しておきます。初心忘るべからずですね。
自己紹介
つじけ(辻健蔵)です。札幌に住んでます。小さな貿易商社を営んでます。ノンプロ研には2019年7月入会。課金歴はGAS初級3、4期、GAS中級1、2期、Python初級2期です。実は古いOfficeをずっと使っていて(特に問題なし)VBA出身なのですが、社内ExcelはほぼGAS化してしまいましたのでもうOfficeは要らねと思ってました(さっきまで)。。。
・最近のMicrosoftさんの盛り上がりはすごい。ユーザー数も圧倒的。
・データ分析系を勉強しているとやっぱりExcelの情報が多い。
・そう言えばVBA講座始まるなぁ。
・自己紹介欄しゅごい!なんやこれ!
と思っていたらいつの間にか買切り2019をポチっていました。怖いですね
実現したいこと
・Officeのバージョンを上げる
・実家の事務作業をGAS化するのはちょっと非現実的なので、便利なVBAツールを1つ書いてあげたいです。
・pandasとかBIとか触る前にExcelで目的を達成できることを1つ形にしたいです。
事前課題はじめてのVBA
ここからは実際に事前課題を解きながらメモを残していきます。
変数の宣言を強制する
早速知らないことが。変数は宣言しないとダメよ!という設定に変更する。VBEのツールからオプションをクリック。
メニュー[挿入]から[標準モジュール]、メニュー[表示]から[イミディエイトウィンドウ]も表示してからスタートです。
日付型のリテラルに#を使う
日付型をリテラルで書くのはダブルクォーテーションで囲むのもいいけど##ハッシュで囲むと自動で日付形式になる。
シンタックスハイライト
画面設定も一度しかやらないからこそ覚えにくいですね。ツールの[オプション]から[エディターの設定]をクリックします。まぁ覚える内容ではないのでここを見たら分かるという内容です。
コードの表示色 | 前景 | 背景 |
標準コード | 黄色 | 黒 |
コメント | 濃いグレー | 黒 |
キーワード | 水色 | 黒 |
識別子 | 白 | 黒 |
ショートカット
とにかく慣れが必要です。毎日1行でもコードを書くといいんですけどね。
- VBEの起動 Alt+F11
- 入力候補 Ctrl + Space そのまま入力する場合はTab。(Enterだと改行しちゃう)
- イミディエイトウィンドウに移動F7:Ctrl+G
- プロシージャの移動 Ctrl+上
- 定義の表示 Shift+F2(戻る時はCtrl+Shift+F2)
- コメントイン・アウトはショーカットがないので、ユーザー設定から個別にカスタマイズする必要がある。
- アウト・・・(&/) Alt+/
- イン・・・・(&\) Alt+\
自動クイックヒントを外す
自動データヒントは知らなった。Debugの時に変数の値をポップアップで表示してくれる。
イミディエイトウィンドウの便利な出力の仕方
- Debug.Print i; ’横に出力
- Debug.Print i, ‘タブ区切りで出力
- イミディエイトウィンドウを入力として?の後ろに四則演算や関数を計算させられる
- Returnと同じように、stopで停止さることができる
- stopで止めてる時に? xや? yなどで変数の中身を確認することができる。
- ?を先頭に書くとDebug.Printと同じ命令になる
Day5で出てくる内容ですが、Debug.Printの上手な使い方のヒントが詰まっていたのでここに書いておきます。
これだとTom,32,Bob,45が要素一つずつ改行されて出力される。
With Sheet1
Dim i As Long, j As Long
For i = 2 To 4
For j = 1 To 2
Debug.Print .Cells(i, j).value
Next j
Next i
End With
Debug.Printの後ろにカンマ(,)を置くと、タブ区切りで横方向に出力される。
With Sheet1
Dim i As Long, j As Long
For i = 2 To 4
For j = 1 To 2
Debug.Print .Cells(i, j).value,
Next j
Next i
End With
なので、改行が入ってる空のDebug.Printを置く。
With Sheet1
Dim i As Long, j As Long
For i = 2 To 4
For j = 1 To 2
Debug.Print .Cells(i, j).value,
Next j
Debug.Print
Next i
End With
学習ペースの掴み方
私は講座をペースメーカーとして学習しています。事前予習(前半・後半に分ける)→課題提出(ピラニア)→ビデオ受講→TAさんに添削してもらい苦手なところは再度復習→予習というサイクルです。Twitterで受講日当日のアウトプットができない為、ブログを使います。
Day1
初日第1回がスタートします。
・モジュールにはたくさんのプロシージャを入れることができる。
・「マクロ」はふわっとしてる単語。「プログラミング」だったり「自動化機能」だったり人によって違う。
・データ型は沢山あるけど最初は6つだけでいい
Slackでスニペット投稿
投稿する時にタイプを指定するが、スクロールしなくても頭文字を打つと早い(これはGAS初級講座でもお伝えしようっと)
型の宣言は省略しちゃダメ
Sub 演習1_09()
'Dim x, y As Long: x = 5: y = x * x
'Debug.Print TypeName(x) 'Integer
'Debug.Print "一辺の長さが" & x & "cmの正方形の面積は" & y & "平方cmです。"
Dim x As Long: x = 5
Dim y As Long: y = x * x
Debug.Print "一辺の長さが" & x & "cmの正方形の面積は" & y & "平方cmです。"
End Sub
※VBAの文字列型はダブルクォーテーション。シングルだとコメントアウトに。
Day2
第2回目です。他の言語と記述方法が違うところが徐々に明らかなってきます。ここから脳の切り替えが大変になってきます💦
- VBAには三項演算子がないけど変わりとなるIIf関数にはバグがある。
- +=のような複合代入演算子が無い。インクリメント演算子(i++)もない。i = i+1はi = i + 1
- さかもとさんが「プロシージャ名がおかしい」ってエラーで怒られてるのを見て、そう言えばVBAはインタープリターなのか?と疑問を持って調べてら、VBAはインタープリターなのか?と言われたらコンパイルでもありインタープリターでもありというネット記事を見つけてそっ閉じ。
- 短絡評価がない。VB.NETではAndAlsoという論理演算子があるらしい。VB.NETって何?って調べたらwindowsのコマンドで書くようなプログラミング言語らしい。。。
For文のNEXT iのiは省略できる
知らなった。。。。ただし、書いた方がどのカウント変数をまわしてるのか分かりやすいので、できるだけ省略しないように。
if文のワンライナー
TAさんの解答みたら、if文をワンライナーで書いたらEnd Ifが省略できるのを知りました💦
Sub MySub5_017()
Dim cell As Range
For Each cell In Sheet1.UsedRange
Debug.Print cell.Value,
If cell.Column = 2 Then Debug.Print
Next cell
End Sub
まとめ
2回分をまとめると結構な量になりますね。。。あ、そうか今回は事前課題も入ってるのか。卒業LTまで頑張ります。生徒とTAを同時とか複数講座同時受講とか頑張ってるメンバーもたくさんいるので私も(ピラニア)頑張ります!