「エクセルマクロ達人養成塾」、ブログ担当の大椛です。
今回紹介するのは、「Excelマクロ・VBA基礎コース」セミナー受講後のフォローアップ課題から。
課題は、「シート「元データ」にある表で残業時間が100時間を超えている人の情報を、シート「要注意リスト」に書きこむマクロを作りなさい」というもの。
シート「元データ」から残業時間が100時間超の人を抽出して、
|A列 |B列 |C列 |D列 |E列 | ------------------------------------------------------------------ 3 行目 |ID |名前 | 1~3月 | 4~6月 | 合計 | ------------------------------------------------------------------ 4 行目 |1 |北海 尚広 | 108.0 | 88.5 | 196.5 | ------------------------------------------------------------------ 5 行目 |2 |米子 美和 | 119.5 | 107.5 | 227.0 | ------------------------------------------------------------------ 6 行目 |3 |兵庫 早希 | 34.0 | 11.0 | 45.0 | ------------------------------------------------------------------ 7 行目 |4 |津 篤史 | 107.0 | 58.0 | 165.0 | ------------------------------------------------------------------ 8 行目 |5 |静岡 威宏 | 69.0 | 64.5 | 133.5 | ------------------------------------------------------------------ 9 行目 |6 |神戸 智宏 | - | - | - | ------------------------------------------------------------------ 10行目 |7 |高知 昌浩 | 110.0 | 60.5 | 170.5 | ------------------------------------------------------------------ 11行目 |8 |高岡 範夫 | - | - | - | ------------------------------------------------------------------ 12行目 |9 |呉 早希 | 30.0 | 35.0 | 65.0 | ------------------------------------------------------------------ 13行目 |10 |五日市 加奈子| 70.0 | 69.0 | 139.0 | ------------------------------------------------------------------
シート「要注意リスト」にリストを作成します。(下表は解答)
|C列 |D列 |E列 | ------------------------------------------------------ 7 行目 |残業時間要注意リスト:| | | ------------------------------------------------------ 8 行目 |ID |名前 |合計 | ------------------------------------------------------ 9 行目 |1 |北海 尚広 |196.5| ------------------------------------------------------ 10行目 |2 |米子 美和 |227 | ------------------------------------------------------ 11行目 |4 |津 篤史 |165 | ------------------------------------------------------ 12行目 |5 |静岡 威宏 |133.5| ------------------------------------------------------ 13行目 |7 |高知 昌浩 |170.5| ------------------------------------------------------ 14行目 |10 |五日市 加奈子|139 | ------------------------------------------------------
この課題、基礎編なので難易度は高くはありません。
IF文、ForNext構文を組み合わせれば、難なく解けます。
先に正解を示すと、こんな感じ↓。
Sub kaitou() Dim moto As Long Dim saki As Long saki = 9 For moto = 4 To 13 If Worksheets("元データ").Range("I" & moto).Value > 100 Then Worksheets("要注意リスト").Range("C" & saki).Value = Worksheets("元データ").Range("A" & moto).Value Worksheets("要注意リスト").Range("D" & saki).Value = Worksheets("元データ").Range("B" & moto).Value Worksheets("要注意リスト").Range("E" & saki).Value = Worksheets("元データ").Range("I" & moto).Value saki = saki + 1 End If Next End Sub
大椛もこの課題にチャレンジしました。
「余裕余裕!」とサクサクっとマクロを書き上げ、実行!
しかし、シート「要注意リスト」にリストが作成できていない。おかしいと思い、シート「元データ」を見て、
「あーーーーーーーーーーーーーーー!」と声を上げてしまいました。
シート「元データ」がアクティブの状態になっているときに、マクロを実行したため、データの上にリストを作成するという失態。
こう書いて↓いたんです。
Sub sippai() Dim moto As Long Dim saki As Long saki = 9 For moto = 4 To 13 If Worksheets("元データ").Range("I" & moto).Value > 100 Then Range("C" & saki).Value = Worksheets("元データ").Range("A" & moto).Value Range("D" & saki).Value = Worksheets("元データ").Range("B" & moto).Value Range("E" & saki).Value = Worksheets("元データ").Range("I" & moto).Value saki = saki + 1 End If Next End Sub
データの転記先になるシート「要注意リスト」を開いたままマクロを書いていました。
これだと、シート「要注意リスト」を開いているときはよかったのですが、シート「元データ」を開いているときにこのマクロを実行すると、データを記入する先は、シート「元データ」になってしまいます。。
凹みました。
で、小川塾長曰く。
まさに、複数シート間でのやりとりでの典型的な失敗。
出力されるシートがいつもアクティブになっているとは限りません。
シートが指定されてなければ、どのシートに書きこむのか小人ちゃんには判断できませんからね。
例えば、5年3組と5組に「鈴木君」がいて、ふたりがケンカをしたことで、学校で職員会議になったとします。
そのとき3組の先生が「鈴木君」と言っても、どちらの鈴木君かわかりませんね。それと同じことです。
もう少し広く言うと、手順書なんだからオブジェクトの指定は一意になるようにしなさい、ということでもあります。
とのこと。
なるほど。
しかし、この失敗、けっこう慣れている方でもやってしまうことがあるそうです。
かく言う塾長も、フォロー動画の中で、しっかり失敗しています(笑
ダメじゃん!オマエ!
それでも、動画の中では、「失敗しても素早くリカバリする方法」の説明をすかさずしていました。
「この男…。転んでもタダでは起きんな~」と感心します。