【VBA✖テストエンジニアリング6】エビデンス採取ツール(実際にどこの現場でも個人的に開発して使ってるツール)の作りかた⑤~必要なのはVBAでも同じ。シンプルイズビューティフル~インプットボックスと条件分岐によるエラーハンドリング
さてと、コラムを挟んだけど、前回
の続きで、
シート番号のエラーを解消する
一番シンプルで簡単なやり方
=次のシートに付けたい番号を自分で入力する
👉InputBox
からやっていこう💃
機能一覧
◆シート・セルの操作フレーム
書式ボタン👈前回
シート追加ボタン👈前回
シート番号入力ボタン
行追加ボタン
行の高さボタン👈前回
A1選択ボタン👈前々回
A4選択ボタン👈前々回
◆図の操作フレーム
手順番号ボタン
手順番号入力ボタン
黒枠縮小のみボタン👈3個前
スクショ画像ボタン👈3個前
挿入した図ボタン👈前々回
吹き出しボタン
赤枠ボタン
折れ線ボタン
右矢印ボタン
下矢印ボタン
◆シートリストフォーム
シート数ラベル
シート数カウントラベル
シート名リスト
残り12個👀💦この記事では
シート番号入力ボタン
手順番号ボタン
手順番号入力ボタン
をやってく💃
(開発現場における)VBAの鉄則(前回までから追記)
コードの8割はマクロの記録で、Excelに書かせる(👉開発現場は学校のお勉強じゃない。開発現場に「マクロの記録は邪道」なんて存在しない)
小さく作って、大きく動かす(一度書いたコードは再利用する)
手で動かして、出来ないことは基本、コードでも出来ないし、やらない方が良い(小難しい機能はバグと改修コストになるので)
グローバルに変数や引数は定義する(同じものはひとつにまとめた方が管理が楽)
関数こそ最強のAPI(👈今回のツールでは関係ないので、やらない)
「〇〇すればいい。」、「〇〇でやればいい」が最大の敵
なるべく早めに検証し、リファクタリングまで行う(エンジニア業界の「後からはいつまでも来ない」)
一度、コード化した同じ処理を2度書かない(再利用)
※記事の内容に合わないものを一気に列挙しても、混乱するだけなんで書かなかっただけ~~~( ´∀` )
ここまでの関連記事
☆基本的な流れ(前回までから追記)
1、マクロの記録でマクロを起こす
↓
2、マクロの余計なコードを消し、コードを一部、編集する。
↓
3、ユーザーフォームにコマンドボタンを追加する
↓
4、編集したマクロをユーザーフォームに追加する
↓
5、コマンドボタンのコード内でCallステーメントで追加したマクロを呼び出す
↓
6、期待どおりに動くか検証し、リファクタリングする
ではでは、本編( ´∀` )
■前回の最後に紹介した事象
ユーザーフォームを開きなおして、シート追加をクリックすると、
同じ名前のシートが既に存在するエラー
が発生したんだけど、、、
これは、
①ユーザーフォームをいったん閉じたことでシート番号が0に戻った
👉次から追加しようとするシートの番号を+1=No1にしようとする
↓
②No1シートが既に存在するので、シートは追加出来ても、新規シートのシート名をNo1に変名できない
↓
③エラー発生
てな原因と流れでエラーが発生する。
考えられる対処策とデメリットとしては、
1、最終シートの番号を記憶しておいて、その番号以降でやればいい
👉逆にシートをNo1など一度使った番号から連番にしたいときに面倒くさい
2、毎回シートを追加する前に、シート番号を入力させればいい
👉操作の手順が、毎回①ボタンをクリック→②番号を入力する→③OKボタンを押すになるので、正直、だったらもはや普通にいつもやってるシート追加操作でやった方が早い
って感じになるので、オイラが実際に使ってるツールでは
シート番号入力ボタンを別に設けて、
1回だけシート開始番号を指定する
にしてる。
メリットとしては、
操作中に邪魔になったり、誤ってユーザーフォームを消した場合でも、
シート番号を指定したいときだけ使える
ので、便利
じゃ、早速操作方法をやってく💃
■シート番号入力ボタンを作ろう
コードをゼロから書いていくのでやらないところは削った
①コードを編集する。
VBE画面を開いて、プロジェクトエクスプローラーのエビデンス採取ツールを右クリックして、コードの編集をクリック
前回、リファクタリングしたコードのグローバル変数領域に、下のコードを追加
Dim sheetInputNumber As String
下のコードを一番下の行に追加
Sub シート番号を指定する()
End Sub
処理コードを入力
Sub シート番号を指定する()
sheetInputNumber = InputBox("シート番号入力", "開始したいシート番号を入力してください")
sheetNumber = sheetInputNumber
End Sub
②ユーザーフォームにコマンドボタンを追加する
ユーザーフォームの編集画面をいつもどおり開いて、新規のコマンドボタンを追加して、左下のプロパティウィンドウのオブジェクト名とCaptionを変更
追加したシートNoボタンをダブルクリックすると、シート番号入力ボタンのコードが追加される
③コマンドボタンのコード内でCallステーメントで追加したマクロを呼び出す
これまでどおり、さっき起こしたSubを呼び出す。
Private Sub シート番号入力ボタン_Click()
Call シート番号を指定する
End Sub
④期待どおりに動くか検証し、リファクタリングする
Excel画面に戻って、ユーザーフォームを開く。
シートNoボタンをクリック。
No6までは既に存在するので全角で数字7を入力
入力出来たらOKボタンをクリック
入力用のWindowが消えたら、ひとつ上のシート追加ボタンをクリック
前回やったシート追加ボタンが呼び出しているシート名を変更Subのコードで+1の処理をしてることが原因( ´∀` )
No & (入力した数字=)7 + 1
👉 No8( ´∀` )
Sub シート名を変更()
sheetNumber = sheetNumber + 1
ActiveSheet.Name = "No" & sheetNumber
End Sub
「じゃあ、入力するときに一番大きな数字を入力すればいいのでは❓👀」
って思うかもしれないけど、この機能の動きが分かっていない人には、
なんで6って入れたのに、No7になるんだ❓👀
ってなるのに使用感(ユーザービリティ)的にはかなり混乱を招くか
👉バグ、障害と誤解される
危険あり。要は、7と入力した場合は、No7になればいいだけなので
Sub シート番号を指定する()
sheetInputNumber = InputBox("シート番号入力", "開始したいシート番号を入力してください")
sheetNumber = sheetInputNumber
End Sub
のコードを、
Sub シート番号を指定する()
sheetInputNumber = InputBox("シート番号入力", "開始したいシート番号を入力してください")
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
End Sub
と、シート番号に入力する前に、コード=画面の裏側で-1してあげればいいだけ( ´∀` )この状態で実行してみると、、、
ここまでで追加されたNo7とNo8のシートをいったん削除して、今度は半角数字で7を入力しても
追加できた💃インプットボックスの左上のタイトルと中身が逆転してるので、さっきのコードを
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を入力してください", "シート番号入力")
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
End Sub
てな感じで変更して実行すると、、、
ここでさらに、数字以外の文字を入れてみると、、、
ただし、
使う人により親切に
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を入力してください", "シート番号入力", "半角数字を入力")
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
End Sub
てな感じにしてあげて、
にしておくと、これで、あかさたなとか文字列入れて
だと、それはさすがに、
半角数字を入力ってゆーてる
(次の操作を指し示す:シグニファイア)
のに、文字列を入れる方が悪い
👉OKエラー
でしょ( ´∀` )
一歩前へ:操作ミスの原因の大半は、操作する人ではなく、デザインが悪い。👉アフォーダンスとシグニファイアの違い
認知心理学を用いた、認知デザインを学んだ人でも、
アフォーダンス:そのツールやボタンなどモノ=そのモノ自体の目的、役割、存在意義(例)ドア:ふたつの空間を仕切るモノ、椅子:座るモノなど
シグニファイア:どう使うかなど示すモノ=次に何をすべきかなどの手順(例)ドア:引くのか押すのか、椅子:どう座ってほしいかなど
を勘違いしてる人が多く、特に日本人が作るツールやアプリは、
アフォーダンスまでで止まっていて、
シグニファイアがないものが非常に多い👀💦
その割に、小手先のデザインで、スタイリッシュとかデザインのトレンドなどだけ学んでいるので、
世界共通のアイコンなどはないのに、アイコンを羅列したり、
何をどうして欲しいのか、なんとなくしか分からない文字無しでピクトグラムを多用して事故を誘発する車内インテリア
などなど。その結果、事故が起きたり、エラーが起きても、
それは使い方=操作する人が悪い
で片づける人が殆ど👀💦で、結果的に改善すらしないか、改善しようとしないので、
評判が広まり、気づけば使ってくれる人が
いなくなりました( ´∀` )
人は、読みにくいものは読まない。
使いにくいものは使わない
👉使って誰かが事故に遭う、
エラーが頻発して業務が滞るもの
であれば尚更( ´∀` )
さっきのインプットボックスであれば、よく現場で、文字で普通に書けばいいのにわざわざ
数字の入力を示そうとする人も居るんだけど、よく見てわかる通り、
”、”とか”…”は思いっきり文字列
なので、
これでも文字列を入力してもいい
と判断する人はいる( ´∀` )
快適なユーザビリティ(使用感)で業務を補完するためのが目的で、別にスタイリッシュとかデザインのトレンドなんかを求めてるツールではない(てか、ツールにそんなものは要らない)
ので、最初からシンプルに、誰が見ても、
と分かるようにしてしておいてあげる方が親切💃
そのため、最初に例で示したツール全体のイメージも
このボタンを押すと、どんなことが起きるか
=操作や処理の結果
を指し示すようにだけしてるでしょ( ´∀` )
アフォーダンス(ツール全体の目的):テスト作業のエビデンス採取が効率的に、円滑にできる補助ツール
シグニファイア(操作指し示す):ボタンなどをクリックしたらどんな処理をするか=処理結果を示すだけ
裏を返すと、いくらスタイリッシュでかっちょいいデザインにしても、使う人がパッと見て何ができるかを分からないと
人は怖くて使わない。
何万ページもある手順書なんか全部把握する
時間がもったいない
👉インタラクション・デザイン
もう一歩前へ:シグニファイアを適所に使えば、分厚い説明書なんざ要らない
このシグニファイアをツール自体に盛り込めてない、シグニファイアとアフォーダンスの違いが分からず混同してるばかりに、
次に何をすればいいか
何をしてはいけないか
をうまく指し示せず、でも事故や障害の責任を極力負わなくていいように、エンジニア業界でよく言われる「グレシャムの法則」を未だに何とかのひとつ覚えのように実践し、
分厚い手順書
操作説明が延々続き、一向に始まらないスマホゲーム
みたいなものも多い👀💦
まあ、これも法律の世界では”ウルトラ・ヴァイレス”て言われる用語でよく使われるし、もう5年以上前だったか、アメリカの裁判所でも
分厚い説明書が必要とか、見れば分かるだろうといったデザインではなく、そんなモノなくても、
見てわかるデザインにしなさい
って判決も出てるからね( ´∀` )。
👉説明書でいくら契約とか責任リスクを回避しようとしても、今は、分厚い説明書を作らないといけないようなデザインにしてる方が悪い時代
だからね( ´∀` )
「日本はアメリカと違う」とそこの部分だけゆーて、今まで通りの日本のやり方でやろうとしても、そーゆー人や企業ほど、片や、
グローバル化
とやらで、世界に商品だけは打ち出そうとしてるからね( ´∀` )別に、消費者なんて、裁判云々なんかいちいち起こさなくても、
一回使ってみて使いにくかったら、
次回からそこの商品は買わなきゃいい
だけだもん( ´∀` )
ボタンを一個押すのに説明書見ないと分からない
説明書全部見ないと触るのがおっかない製品
なんて今の世界で売れるわけないじゃん
さてと、本題に戻って~~~
キャンセルを押した場合の処理も入れておこう
今のままだと、入力欄を空欄にしてOKボタンを押すと、
まあ、これはさすがに、半角数字を入力しろってゆーてんのに、何も入力してないからエラーになったなって文句ゆー奇特な方はなかなかいないんだけど、キャンセルボタンを
でエラーが起きると
さすがにビックリする人はいるので~~~、一番簡単な方法は
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
End Sub
てな感じでコードを変更
で、入力欄を敢えて空欄にしておいて、
入力欄が空欄以外でOKが押された👉処理続行
入力欄が空欄でOKが押された👉処理中断メッセージを表示
入力欄が空欄以外でキャンセルが押された👉処理中断メッセージを表示
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
If sheetInputNumber <> "" Then
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else
MsgBox ("入力されませんでした")
End If
End Sub
てな感じにコードを変更して実行すると、
てな感じでやるだけでも、シンプルにできる。
これが普段、現場で使ってるツールの実際の条件分岐
👉オイラ的にはこれで充分なんで( ´∀` )
さらにキャンセルと空欄をきちんと分けたいのであれば、
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外
'空欄判定
If sheetInputNumber <> "" Then '空欄以外
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else '空欄
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外
MsgBox ("キャンセルされました")
End If
End Sub
てな感じでもできる。
さらに、厳密に考えられるエラーを全て網羅したいなら、
入力欄が空欄以外で、入力された文字が数字でOKが押された👉処理続行
入力欄が空欄以外で、入力された文字が数字以外でOKが押された👉処理中断メッセージを表示
入力欄が空欄でOKが押された👉処理中断メッセージを表示
入力欄が空欄以外でキャンセルが押された👉処理中断メッセージを表示
で、
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外
'空欄判定
If sheetInputNumber <> "" Then '空欄以外
'数字判定
If IsNumeric(sheetInputNumber) Then '数字
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else '数字以外
MsgBox ("入力された文字が数字以外です")
End If
Else '空欄
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外
MsgBox ("キャンセルされました")
End If
End Sub
てな感じで実行すると
てな感じ( ´∀` )
まあ、実際の現場で今使ってるツールはオイラ自身が作って、オイラしか使ってないのでここまで厳密には条件分岐してないんだけど、あくまでもこだわる人向けのサンプルとして挙げておいた( ´∀` )
ここでポイント①:Elseは強力なので、書かないのもひとつ。条件に何を入れるかをきちんと先に日本語で書いてからコードに起こす(PPP:疑似コードプログラミング手法)
最初に出した、実際に現場で使ってる条件式と、一番厳密に分けた条件式を比較すると分かる通り、全て
Else以降が、実はElse以前の条件に当てはまらないモノの指定でこれだけ差があることが分かる
👉If文できちんと細かく条件付けしないと、
その条件以外=Elseに入る
👉条件付けが曖昧だと、
想定外の処理をElseがやる可能性あり。
別に、Elseは必ず書かないといけないものではないので、ここまで条件式でかつ=Andが連なると、把握しにくくはなるけど
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
If StrPtr(sheetInputNumber) <> 0 And sheetInputNumber <> "" And IsNumeric(sheetInputNumber) Then 'キャンセル以外
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
End If
End Sub
てな感じにして、
もし、インプットボックスでOKが押されるかつ入力欄が空欄以外かつ入力された文字が数字である場合だけ、処理を実行しろ
Elseなしなのでそれ以外は何もしない
てことも出来なくはない。ただし、これだけ見ても分かるとおり、
人間の言語にしてもかなり見にくい( ´∀` )
見にくい=改修とか保守メンテする人が
条件を把握しにくい
👉バグが起きやすくなる
さらに、Elseがない分エラーメッセージも操作する人に表示されないので、処理が正常に行われたのかどうかが分からない
👉まさに、さっきのシグニファイア=指し示す
ので、Elseできちんと以外の処理結果も示してあげた方が無難。
また、コードで条件分岐や場合分けを書くときは、慣れないうちは
いきなりコードに起こす
ではなく、
なんかでも紹介してる、
疑似コードプログラミング手法(PPP)
を使って、
一旦、人間の言葉で条件を書き出す
書き出せたら、コードに起こす
きちんと想定した条件を全て満たしているかを検証する
が普通。さっきのコードを人間の分かるコードにすると、
シート番号を指定する処理
シート入力番号に、インプットボックス("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")を表示して入力させる
もし、インプットボックスの状態が0(キャンセル以外)であれば
もし、入力欄が空欄以外であれば
さらにもし、数字が入力されていれば
入力されたシート入力番号から1を引いて
シート番号に入力
もし、数字以外が入力されていれば、
入力された文字が数字以外ですメッセージを表示
3個目の判定終わり
もし入力欄が空欄であれば、
入力されませんでしたメッセージを表示
2個目の判定終わり
もし、インプットボックスの状態が0(キャンセル)であれば、
キャンセルされましたメッセージを表示
1つめの判定終わり
処理終わり
てな感じで、これをただ、コードに起こしただけ( ´∀` )
ここでポイント②:条件分岐の階層(ネスト)は深くても3階層まで~職人気取りな人は、エクセル関数でもVBAでも複雑な階層がお好き
いくらでも深い処理を条件分岐さえすれば組んで行けちゃうのと、現場だと設計全体を視野に入れずに、
言われた要求とか変更部分しか見ない
人が多いので、
コードを探す
👉条件式だけ追加して、違う処理も追加
って感じで、どんどんどんどんネストが深くなり、もはや人間の目でパッと見て、
変数にどんな値が入っているか
どんなことをしているのか
等が分からない処理になっていることが多い( ´∀` )例えば、さっきのElseありで厳密に分岐したコードをもう一回見てもらっても
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外
'空欄判定
If sheetInputNumber <> "" Then '空欄以外
'数字判定
If IsNumeric(sheetInputNumber) Then '数字
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else '数字以外
MsgBox ("入力された文字が数字以外です")
End If
Else '空欄
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外
MsgBox ("キャンセルされました")
End If
End Sub
てな感じで、条件分岐の階層が
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定ー1階層目
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外ー1階層目
'空欄判定ー2階層目
If sheetInputNumber <> "" Then '空欄以外ー2階層目
'数字判定ー3階層目
If IsNumeric(sheetInputNumber) Then '数字ー3階層目
Else '数字以外ー3階層目
MsgBox ("入力された文字が数字以外です")
End If
Else '空欄ー2階層目
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外ー1階層目
MsgBox ("キャンセルされました")
End If
End Sub
かなり深くまで入り込んだ処理
になってるのが分かると思う。仮にこれが、繰り返しとか後判定の中にさらに4階層どころか気づけば7階層、10階層なんかになってるとどう❓👀💦
でもタイトルに書いてるとおり、
こーいったところに思いやりがない
「そんな複雑なコードでも、一瞬で初見で読んで把握できるのが職人だ」
👉誤った職人像とかプロ意識を持ってる自称職人やプロの方々
略して、自称さん
が、Excel関数にしろ、VBAにしろ、
ユーザーフォームすら使わず、
自分たちでより複雑に怪奇なコードや関数を組み、
自分たちで改修コストや管理コストを爆上げしながら、
お盆や正月休みを返上しながら、今日もどこかで、さらに複雑なコードを組んでいる。
SQLだとさらに、アクセスのSQLビューなんかを使わずに
SQLを直に書く
10階層以上のネストを組む
CONSTRAINTを入れまくる
使い終わっても接続を切らない
👉もはやどこを改修していいのか
誰もすぐには分からない
=手が付けられない間にデータベースが
どんどん処理速度が遅くなる
なんて悲惨なことになってるからねえ( ;∀;)
それっはもはや、使う人が悪いわけでも、作る人が悪いわけでもなく、そんな開発のやり方を許して、野放しして、放置してる
開発者側の管理
=マネジメントが悪い
が大半。
ここまで書けば分かる人も多いと思うけど、
Excel関数なんて、VBAのコードをExcelの数式バーに入力して同じことが出来るようにしてる
ただのAPIだからね( ´∀` )
なぜ、いくつかの処理列にそれぞれの関数の計算結果を入れれば、最終的にシンプルで誰が見ても分かるような関数を
わざわざひとつで済ませようと、
複雑怪奇なExcel関数にしようとする
んだろうね( ´∀` )
改修に時間かかるうえに、
バグを起こしたら
それこそ意味ねーだろと( ´∀` )
👉そこまで考えて、
何事も最初からどこまでもシンプルにやる
のが
本当の職人
※まあ、過去のVBA合格体験記みたいな記事で
「VLOOKUP関数と同じ処理ができるコードを数百行書いて出来るようになりました」みたいな人を見たときは、「いや、VLOOKUP関数で出来ることは、VBAのコードなんか書かずにVLOOKUP関数でやれよ」と( ´∀` )。せめて、
なんかでも書いてる
WorksheetFunction
で、数値だけ変数なんかに変換して
数行でやる
だろと( ´∀` )
つまり本当の職人であればあるほど、
そもそもそんな複雑なコードを書く必要もない
誰が見ても分かりやすいツールやコードにする
👉シンプルイズビューティフル
にする。
COBOLみたいな
メインフレーム時代のレガシー言語
でやってるわけじゃないんだし( ´∀` )
職人は余計な複雑さなんざ求めない
職人=難しいことが出来る人
ではないからね( ´∀` )
👉誰が見てもわかりやすいコードやツール
にするのが当たり前
さてと、今回は3つやるつもりだったけど、
ここの時点で記事も12000字を突破したので、今回はここまで。
続きはまた、次回
今回出来なかった
手順番号ボタン
手順番号入力ボタン
を紹介しながら、いよいよ
図の操作をやってく💃
多分、ラスト2~3回( ´∀` )
■最後にいつものリファクタリング
◆リファクタリング前
Option Explicit
'グローバル変数---------------------------
Dim sheetNumber As Integer
Dim sheetInputNumber As String
Private Sub シート番号入力ボタン_Click()
Call シート番号を指定する
End Sub
'呼び出し元のオブジェクト------------------
Private Sub スクショ画像ボタン_Click()
Call 縮小60パーセント
Call 黒枠
Call 埋込
End Sub
Private Sub 黒枠縮小のみボタン_Click()
Call 縮小60パーセント
Call 黒枠
End Sub
Private Sub 挿入した図ボタン_Click()
Call 挿入した図のサイズを変更
Call 黒枠
Call 埋込
End Sub
Private Sub A1選択ボタン_Click()
Call A1選択
End Sub
Private Sub A4選択ボタン_Click()
Call A4選択
End Sub
Private Sub 行の高さボタン_Click()
Call 行の高さを変更
End Sub
Private Sub 書式ボタン_Click()
Call シート全範囲選択
Call 選択文字をMeiryoUIにする
Call フォントサイズを12にする
Call 目盛線の表示を変更
Call A1選択
End Sub
Private Sub シート追加ボタン_Click()
Call 末尾に新規シートを追加
Call シート全範囲選択
Call 選択文字をMeiryoUIにする
Call フォントサイズを12にする
Call 選択箇所を太字
Call 目盛線の表示を変更
Call A列右寄せ
Call シート名を変更
Call A1選択
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
Sub 挿入した図のサイズを変更()
Selection.ShapeRange.Height = 345.5433070866
Selection.ShapeRange.Width = 614.5511811024
End Sub
Sub A1選択()
Range("A1").Select
End Sub
Sub A4選択()
Range("A4").Select
End Sub
Sub 行の高さを変更()
Selection.RowHeight = 234
End Sub
Sub シート全範囲選択()
Cells.Select
End Sub
Sub 選択文字をMeiryoUIにする()
Selection.Font.Name = "Meiryo UI"
End Sub
Sub フォントサイズを12にする()
Selection.Font.Size = 12
End Sub
Sub 目盛線の表示を変更()
If ActiveWindow.DisplayGridlines = False Then
ActiveWindow.DisplayGridlines = True
Else
ActiveWindow.DisplayGridlines = False
End If
End Sub
Sub 目盛線の表示()
ActiveWindow.DisplayGridlines = True
End Sub
Sub 目盛線の非表示()
ActiveWindow.DisplayGridlines = False
End Sub
Sub 末尾に新規シートを追加()
Sheets.Add After:=ActiveSheet
End Sub
Sub 選択箇所を太字()
Selection.Font.Bold = True
End Sub
Sub A列右寄せ()
Columns("A:A").HorizontalAlignment = xlRight
End Sub
Sub シート名を変更()
sheetNumber = sheetNumber + 1
ActiveSheet.Name = "No" & sheetNumber
End Sub
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外
'空欄判定
If sheetInputNumber <> "" Then '空欄以外
'数字判定
If IsNumeric(sheetInputNumber) Then '数字
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else '数字以外
MsgBox ("入力された文字が数字以外です")
End If
Else '空欄
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外
MsgBox ("キャンセルされました")
End If
End Sub
◆リファクタリング後
Option Explicit
'グローバル変数---------------------------
Dim sheetNumber As Integer
Dim sheetInputNumber As String
'呼び出し元のオブジェクト------------------
Private Sub スクショ画像ボタン_Click()
Call 縮小60パーセント
Call 黒枠
Call 埋込
End Sub
Private Sub 黒枠縮小のみボタン_Click()
Call 縮小60パーセント
Call 黒枠
End Sub
Private Sub 挿入した図ボタン_Click()
Call 挿入した図のサイズを変更
Call 黒枠
Call 埋込
End Sub
Private Sub A1選択ボタン_Click()
Call A1選択
End Sub
Private Sub A4選択ボタン_Click()
Call A4選択
End Sub
Private Sub 行の高さボタン_Click()
Call 行の高さを変更
End Sub
Private Sub 書式ボタン_Click()
Call シート全範囲選択
Call 選択文字をMeiryoUIにする
Call フォントサイズを12にする
Call 目盛線の表示を変更
Call A1選択
End Sub
Private Sub シート追加ボタン_Click()
Call 末尾に新規シートを追加
Call シート全範囲選択
Call 選択文字をMeiryoUIにする
Call フォントサイズを12にする
Call 選択箇所を太字
Call 目盛線の表示を変更
Call A列右寄せ
Call シート名を変更
Call A1選択
End Sub
Private Sub シート番号入力ボタン_Click()
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
Sub 挿入した図のサイズを変更()
Selection.ShapeRange.Height = 345.5433070866
Selection.ShapeRange.Width = 614.5511811024
End Sub
Sub A1選択()
Range("A1").Select
End Sub
Sub A4選択()
Range("A4").Select
End Sub
Sub 行の高さを変更()
Selection.RowHeight = 234
End Sub
Sub シート全範囲選択()
Cells.Select
End Sub
Sub 選択文字をMeiryoUIにする()
Selection.Font.Name = "Meiryo UI"
End Sub
Sub フォントサイズを12にする()
Selection.Font.Size = 12
End Sub
Sub 目盛線の表示を変更()
If ActiveWindow.DisplayGridlines = False Then
ActiveWindow.DisplayGridlines = True
Else
ActiveWindow.DisplayGridlines = False
End If
End Sub
Sub 目盛線の表示()
ActiveWindow.DisplayGridlines = True
End Sub
Sub 目盛線の非表示()
ActiveWindow.DisplayGridlines = False
End Sub
Sub 末尾に新規シートを追加()
Sheets.Add After:=ActiveSheet
End Sub
Sub 選択箇所を太字()
Selection.Font.Bold = True
End Sub
Sub A列右寄せ()
Columns("A:A").HorizontalAlignment = xlRight
End Sub
Sub シート名を変更()
sheetNumber = sheetNumber + 1
ActiveSheet.Name = "No" & sheetNumber
End Sub
Sub シート番号を指定する()
sheetInputNumber = InputBox("開始したいシート番号を半角数字で入力してください", "シート番号入力", "")
'キャンセル判定
If StrPtr(sheetInputNumber) <> 0 Then 'キャンセル以外
'空欄判定
If sheetInputNumber <> "" Then '空欄以外
'数字判定
If IsNumeric(sheetInputNumber) Then '数字
sheetInputNumber = sheetInputNumber - 1
sheetNumber = sheetInputNumber
Else '数字以外
MsgBox ("入力された文字が数字以外です")
End If
Else '空欄
MsgBox ("入力されませんでした")
End If
Else 'キャンセル以外
MsgBox ("キャンセルされました")
End If
End Sub
今回の関連記事
以下は、GoogleAppsScriptの記事ではあるけど考え方は同じなので~~~
違うプログラミング言語でも通じる考え方なんだ👀💦
ってだけ思ってもらえたら幸い💃