【VBA✖テストエンジニアリング2】エビデンス採取ツール(実際にどこの現場でも個人的に開発して使ってるツール)の作りかた②~「マクロの記録は邪道なの❓👀」~マクロの記録は、調べるために存在する。
さてと、前回
の続きを( ´∀` )
今回から本格的に前回紹介した、
VBAの鉄則を盛り込んで解説してくや( ´∀` )
前回も紹介したけど、前置きで
(開発現場における)VBAの鉄則
コードの8割はマクロの記録で、Excelに書かせる(👉開発現場は学校のお勉強じゃない。開発現場に「マクロの記録は邪道」なんて存在しない)
小さく作って、大きく動かす(一度書いたコードは再利用する)
手で動かして、出来ないことは基本、コードでも出来ないし、やらない方が良い(小難しい機能はバグと改修コストになるので)
グローバルに変数や引数は定義する(同じものはひとつにまとめた方が管理が楽)
関数こそ最強のAPI(👈今回のツールでは関係ないので、やらない)
「〇〇すればいい。」、「〇〇でやればいい」が最大の敵
ここまでの関連記事
今回からは、
マクロの記録で出来る機能の組みかたを中心
に説明してく💃
んだば、早速
☆基本的な流れ
1、マクロの記録でマクロを起こす
↓
2、マクロの余計なコードを消す
↓
3、ユーザーフォームにコマンドボタンを追加する
↓
4、編集したマクロをユーザーフォームに追加する
↓
5、コマンドボタンのコード内でCallステートメントで追加したマクロを呼び出す
まあ、あくまでも基本( ´∀` )
そもそも、エビデンスを採取する工程ってどんな感じ👀❓
このマガジンの【朝活JSTQB】シリーズでやってる
JSTQB(テストの国際資格)
のシラバスで書かれてる内容は、どちらかと言うと、
どこのテスト専門部署にも共通する
テスト工程やテスト実施方法といったテストマネジメント
👉テスト戦略=組織のマクロ部分
的な話に終始してるんだけど、これだけだと、
各テスト担当者が実際にテストを実施する方法
👉テスト戦術=組織のミクロ部分
が抜け落ちてる👀💦
※まあ、ミクロな部分は組織ごとにやり方が違うからしゃーない( ´∀` )
テストってどんな感じで行われるのかをイメージ湧かない人も居るかもしれないので、
具体的なテスト作業のイメージ
が湧きやすいように例を挙げながらでちょっと説明するや( ´∀` )
例えば、今オイラが記事を作ってるnoteも記事サイトなので、ありそげなテスト内容(以下、テストケース)
テスト着手
テスト内容に従って、
てな感じでエビデンスを採取していくんだけど、ここまでのイメージ画像を見ても、そのまま貼り付けるだけだと、
かなり見にくい( ´∀` )
そんなとき、手作業で、見やすくなるように
調整すると思うんだけど、こんな単純な確認だけでも、既に
初期表示のエビデンス
入力のエビデンス
アクセス後のエビデンス
って感じで
少なくとも3回、同じ操作を繰り返してる箇所がある
てな時に、
ボタン一発で、共通する操作をできるようにしておけば、
かなり時間短縮になるでしょ( ´∀` )
で、個人的に作って、実際にどこの現場でも
テストエビデンスの採取
手順書の作成
なんかで使ってるのがこのツール💃
機能としては、
◆シート・セルの操作フレーム
書式ボタン
シート追加ボタン
シート番号入力ボタン
行追加ボタン
行の高さボタン
A1選択ボタン
A4選択ボタン
◆図の操作フレーム
手順番号ボタン
手順番号入力ボタン
黒枠縮小のみボタン
スクショ画像ボタン
挿入した図ボタン
吹き出しボタン
赤枠ボタン
折れ線ボタン
右矢印ボタン
下矢印ボタン
◆シートリストフォーム
シート数ラベル
シート数カウントラベル
シート名リスト
くらいなもん( ´∀` )こう書き出すと20個もあって、多いように感じる人も居るかもしれないけど、サクサク作れるところを作ってこ💃まずは、
手作業で殆どの人がやる操作は、
画像サイズの調整
だと思うので、そこからスタート
■図の操作4.スクショ画像ボタンを作ろう
【操作の流れ】
①マクロの記録をクリック
②普段手作業でやっているとおりで操作
③②が終わったら、記録の終了をクリック
②でオイラが普段手作業で普段やる操作は、
図を60%くらいのシートで見えやすいように調整
黒の外枠を図に付ける
図をセルに埋め込む
なので、まずは
①開発タブを開いて、マクロの記録をクリック
ここでポイント①:マクロの記録って何❓👀
まあ、今からの操作を見てもらえると分かるんだけど、
普段手作業でやってる操作を、マクロの終了がクリックされるまで記録する機能
👉操作の録画機能
ってイメージ
では、実際に操作すると、
何も変更せずに、OKボタンだけクリック
👉マクロの記録開始( ´∀` )
②普段手作業でやっているとおりで操作
さっき書いたオイラの操作だと、記録するのは、
図を60%くらいのシートで見えやすいように調整
黒の外枠を図に付ける
図をセルに埋め込む
って操作なのでそのとおりに操作して
で、
③②が終わったら、記録の終了をクリック
ここまでで、マクロの記録は出来たので~~~
④開発タブ>VisualBasicでVisualBasicEditor(以下、VBE)画面を開こう
すると、前回紹介した、VBE画面が開く
ので、左側のプロジェクトエクスプローラーにある標準モジュールをクリック
すると、前回作ったモジュール以外に、Module1が新たに追加されてるので、Module1をダブルクリック
開くと
コードが自動的に入力されてる
Sub Macro1()
'
' Macro1 Macro
'
'
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
End With
Selection.Placement = xlMoveAndSize
End Sub
ので、ここで一旦、ファイルを保存して
2枚目のスクリーンショット画像を選んだ状態で
VBE画面に戻り、実行ボタンをクリック
2枚目のスクリーンショット画像も変わったことを確認。同じやり方で、3枚目も選んで実行
で後は、
てな感じでサイズが小さくなった分、空いた隙間の
画像を移動する
間の空白行を削除する
のいずれかで調整するだけ。
こんな感じで、
一度コードにしてしまえば、他の画像なんかでも同じ操作をする=マクロ=自動化
以上で冒頭の、基本的な手順の流れ
1、マクロの記録でマクロを起こす👈今ココまで完了
↓
2、マクロの余計なコードを消す
↓
3、ユーザーフォームにコマンドボタンを追加する
↓
4、編集したマクロをユーザーフォームに追加する
↓
5、コマンドボタンのコード内でCallステートメントで追加したマクロを呼び出す
なので、2以降をやってく。
⑤余計なコードを消そう
VBE画面に戻って、
コードを見ると、まず、下図の緑文字の部分は、ただのコメントなので
要らないので消す。
次に、コードなんて全然読めないので分からないって人向けに、さっき書いたオイラの操作は、
図を60%くらいのシートで見えやすいように調整
黒の外枠を図に付ける
図をセルに埋め込む
だったので、コードにコメントを付けると
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
ここでポイント②コードに出てくるWithって何👀❓
Withは、Withステートメントって言って、
With~End Withの間で共通するコード
をひとつにまとめるよ
って意味。今のコードは
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
End With
ってなってるんだけど、Withを使わずに
'黒の外枠を図に付ける
Selection.ShapeRange.Line.Visible = msoTrue
Selection.ShapeRange.Line.ForeColor.RGB = RGB(0, 0, 0)
Selection.ShapeRange.Line.Transparency = 0
でも書けなくはないんだけど、コードの各行で共通する
Selection.ShapeRange.Line
が重複してるので、重複するコードは、
まとめてあげた方が読みやすい
👉Withは重複するコードをとめる機能
ってイメージ。で、説明を先に進めるけど、マクロが自動で起こした
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
ってコードの中で、余計なコードを消してく。
と、ここでVBAをやったことない人の当然の疑問
「余計なコードを消すも何も、そもそもコードが分からないから、何が必要で何が余計なコードか分からないんだけど👀❓」
てなるのが普通。
ここでポイント③:マクロの記録中に、自分で無効とか0を設定していない= msoFalseと= 0は、消してほぼ問題なし
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
.Transparency = 0
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
だと、下から5行目の
.Transparency = 0
コイツを実際に削除
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
もうひとつ別の画像を貼り付けて、
マクロを実行してみると、、、
てな感じ。
消してほぼ問題ない理由:
・= msoFalse:何かを無効とかなしにする設定
・= 0:色や影などの状態設定がなしと変わらない
から( ´∀` )
ま、消して大丈夫かなって不安があるときは、
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
'.Transparency = 0
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
余計なコードをいったん’(クォーテーション)でコメントアウト
マクロを実行
同じ動きになっていることを確認してから削除
って流れがいいかもね( ´∀` )
ここでポイント④:なんで余計なコードまで書いちゃうの❓👀
まあ、これが職人気取りの自称さんや学校の先生から
「マクロの記録でVBAを使うのは、邪道」
とか言われてる理由みたいなんだけど、まあ、
色々な操作のやりたいこと関係ない設定
までコードで記述しちゃう
👉ある程度コードは起こしてあげるから、それでも余計なコードは自分で消してって作りになってるからとしかいーよーがない( ´∀` )
ここでポイント⑤:マクロの記録は、調べる機能
裏を返すと、さっきここでポイント③で書いたコツさえ覚えちゃえば、
別に、
コードをゼロから勉強して覚えて、自分の手でゼロから起こして…
(自分がやりたい操作を実現するくらい使えるようになるまで何年かかるんだろうね👀)
みたいに、
余計な学習コストを増やさなくても、
ある程度のマクロが簡単に組めるようになるし、自分でよくやる操作をマクロの記録でコードに起こしてみて、そこで出てきたコードで、この操作の時にはどんなコードを使うんだろうて、
コードを調べる
こともできるからね👀てか、
マクロの記録の本来の役割
👉不明なコードを調べる機能
なんだよね( ´∀` )
一歩前へ:コードの8割はマクロの記録で、Excelに書かせる(VBAの鉄則1)
別にマクロの記録で8割コードに起こそうと、自分でゼロからコードを書こうと、最終的に
書かれているコードが同じなら、
何度実行しても同じ結果にしかならない
し、自分でゼロから書いても、そのコードが誤っていたり、編集ミスで余計な文字が残ってたりしてると、
どの途、バグにしかなら
👇
コードはなるべく、
Excel自身に書かせた方が安全
で、マクロの記録でやりたいことが賄えないところだけ、
やり方や考え方を覚えて、
自分で加工してしまえばいいだけ( ´∀` )
👉この連載の目的💃
さてと、続きの操作に戻って~~~
1、マクロの記録でマクロを起こす
↓
2、マクロの余計なコードを消す👈今ココまで完了
↓
3、ユーザーフォームにコマンドボタンを追加する
↓
4、編集したマクロをユーザーフォームに追加する
↓
5、コマンドボタンのコード内でCallステートメントで追加したマクロを呼び出す
なので、
⑥ユーザーフォームにコマンドボタンを追加しよう
VBE画面で、フォームをクリックして、エビデンス採取ツールをダブルクリック
前回挿入したユーザーフォーム画面が表示されたら、ツールボックスのコマンドボタン
をクリックしたまま、マウスを動かして、
でボタンを追加。前回説明した、ユーザーフォームと同じく、左下のプロパティウィンドウのオブジェクト名とCaption
を、
変更して、ボタンの表示が
変更されたのを確認したら、ボタンをダブルクリック
すると、下図のような画面に表示が切り替わるので~~~
Private Sub スクショ画像ボタン_Click()
End Sub
が表示されたのを確認。
⑦編集したマクロをユーザーフォームに追加しよう
標準モジュールのModule1をダブルクリック
して、さっきのコード
をSub~End Subまで選んで、右クリックかCtrl+Xキーで切り取り
次に、プロジェクトエクスプローラーのエビデンス採取ツールを右クリックして、コードの表示をクリック
コードが表示されたら、一番下の空白行で、右クリックして貼付けをクリック
⑧コマンドボタンのコード内でCallステートメントで追加したマクロを呼び出そう
マクロのコードまで追記出来たら、後は、
Private Sub スクショ画像ボタン_Click()
Call Macro1
End Sub
って感じで、
Call Macro1
を間に追記して、Excelの画面を表示して
前回追加した左上のエビデンス採取ツールボタンをクリック
ユーザーフォームが表示されるので、今追加したボタンをクリック
ユーザーフォームを左上の✕ボタンで閉じるとさっきの画像がさらに小さくなったのが確認できた( ´∀` )
ここでポイント⑥:Subには、分かりやすい名前を付けよう
前回、ユーザーフォームのオブジェクト名を変更するときに、
VBAは日本語にも対応してる
って話したんだけど、Sub(正式には、Subプロシージャ名)とか変数の名前も、
コード編集部分も、ある程度、日本語に対応してる
(コード自体が全部日本語で書けるって意味ではない👀💦)
ので、現在のコード
Sub Macro1()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
で、Subプロシージャ名がMacro1だと
コードが読めない人だと、何をしてるのか分からない
コードが読める人でも、コードを読まないと把握できない
ので、
Sub 縮小60パーセント黒枠埋込()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
って感じで、変更してあげて、Callしてる部分も
Private Sub スクショ画像ボタン_Click()
Call Macro1
End Sub
Private Sub スクショ画像ボタン_Click()
Call 縮小60パーセント黒枠埋込
End Sub
で変える( ´∀` )
一歩前へ:コードを読みやすくするために、不要になったコメントは削除する
Subプロシージャ名に日本語で具体的に、簡潔に何をしてるかを書くメリットなんだけど、
Sub 縮小60パーセント黒枠埋込()
'図を60%くらいのシートで見えやすいように調整
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
'黒の外枠を図に付ける
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
'図をセルに埋め込む
Selection.Placement = xlMoveAndSize
End Sub
を見てもらうと分かる通り、
Sub~End Subの間で記載してる
説明がもはや要らない
でしょ( ´∀` )なので、コメント部分を削除して~~~
Sub 縮小60パーセント黒枠埋込()
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
Selection.Placement = xlMoveAndSize
End Sub
いったんここまでで保存
して、Excel画面でユーザーフォームを表示して再度、同じボタンをクリックすると
大きな図で取り直して、
ボタンをクリックしても
同じ結果になった💃
もう一歩前へ:小さく作って、大きく動かす(VBAの鉄則2)=オブジェクト指向言語の醍醐味👉再利用
ここまでのコードでも、やりたい操作は出来なくはないんだけど、今後、
画像を60%に縮小だけしたい
画像に黒枠だけ付けたい
画像を埋め込みだけしたい
って場合に、また同じコードを書くのか❓👀って話になるので、(まあ、そうやりたきゃやればいいんだけど、)ここで生きてくるのが
VBAの鉄則2、小さく作って大きく動かす
実は、上から下に3つの処理を順番にやってるだけなので、各処理ごとに、
Sub 縮小60パーセント()
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
End Sub
Sub 黒枠()
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
End Sub
Sub 埋込()
Selection.Placement = xlMoveAndSize
End Sub
てな感じで処理ごとに小さく小分けにしてあげて、
Private Sub スクショ画像ボタン_Click()
Call 縮小60パーセント
Call 黒枠
Call 埋込
End Sub
プログラミングで行う処理は、
上から下に順番で処理を実行してるだけ
なので、これで再度実行しても、
つまり、
処理を最小単位で
Subプロシージャで小分けにしておけば、
同じコードを複数個所に書かなくて済む💃
👉重複するコードの数が減って、
管理しやすくなる
実際、黒枠と同じ比率で縮小まではしたいけど、埋込だけしたくないって場合に、
■図の操作3.黒枠縮小のみボタンを作ろう
①ユーザーフォームに新規でコマンドボタンを追加
さっきと同じやり方で
プロパティウィンドウでオブジェクト名とCaptionも変更
②追加した黒枠縮小のみボタンをダブルクリックして、コード追加
Private Sub 黒枠縮小のみボタン_Click()
End Sub
が追加されたので、
右クリックかCtrl+Cキーでコピー
新しい画像を1枚スクショして、
黒枠縮小ボタンをクリック
画像は縮小されて、黒い枠線はさっきと同じ感じでついたんだけど
埋込はされてないのが分かる
👉小分けにしておけば、
Callで組み合わせるだけで
臨機応変にやりたいことができる
ってことが分かると思う( ´∀` )
Private Sub 黒枠縮小のみボタン_Click()
Call 縮小60パーセント
Call 黒枠
End Sub
は、
移動しておこう。
ここまでのコード
Option Explicit
Private Sub スクショ画像ボタン_Click()
Call 縮小60パーセント
Call 黒枠
Call 埋込
End Sub
Private Sub 黒枠縮小のみボタン_Click()
Call 縮小60パーセント
Call 黒枠
End Sub
Sub 縮小60パーセント()
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
End Sub
Sub 黒枠()
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
End Sub
Sub 埋込()
Selection.Placement = xlMoveAndSize
End Sub
小分けにしてCallすら使わないばかりに
殆ど同じ操作しかしてないのに、
動けば一緒で、
Option Explicit
Private Sub スクショ画像ボタン_Click()
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
Selection.Placement = xlMoveAndSize
End Sub
Private Sub 黒枠縮小のみボタン_Click()
Selection.ShapeRange.ScaleHeight 0.6, msoFalse, msoScaleFromTopLeft
With Selection.ShapeRange.Line
.Visible = msoTrue
.ForeColor.RGB = RGB(0, 0, 0)
End With
End Sub
のコードにしてる人が殆どなんだけど、さっきのコード
と見比べて、
どちらがシンプルで見やすく、
何をしてるか分かりやすいか
ってだけの話( ´∀` )
まとめ:実際に、操作しながら読んでる人は既にお気づきだと思うけど、
これだけ色々動かしながら、実はオイラまだ一回も、余計なコード削除とSubプロシージャ名を変更した以外、
処理コードの中身を触ってない
んだよねえ( ´∀` )
それくらい簡単に
コツさえ掴めば、
こんなにあっさり、
ここまでの加工なら出来ちゃう
って話( ´∀` )
裏を返すと、みなさん
マクロに慣れてもいないのに、
コードありきで、
いきなりコードから入るから、
VBAが逆に難しくなってる
ってゆーね👀💦
さてと、次の操作も継続しようかなと思ったら
既にここで12000字以上になったのと、
マクロの記録でVBAの基本の流れ
の説明が終わって、キリもいいので、
続きは、また明日
明日も、マクロの記録だけである程度作れちゃう操作をやってく~~~💃
今回の関連記事
以下は、GoogleAppsScriptの記事ではあるけど考え方は同じなので~~~
違うプログラミング言語でも通じる考え方なんだ👀💦
ってだけ思ってもらえたら幸い💃