「エクセルマクロ達人養成塾」、ブログ担当の大椛です。
昨日のブログに関連して…。
「慣れないうちこそ、少ない道具だけでやりくりを – Exelマクロ・VBA」
塾長が、よく、「守破離」という言葉を使ってプログラミングスキル上達の過程について表現します。
守: 手本通りに、限られた道具だけでもそれらを組み合わせてマクロを書けることを目指す
破: 手本で示されたやり方をあえて踏み外したやり方を採る
離: 手本をほとんど意識しないでも、無意識にベストなプログラムを書ける
例えば、一つの表から、別の表にデータを転記するマクロを書くとします。
シート「元データ」から残業時間が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 |
------------------------------------------------------
このとき、For Next構文とIf文だけで解決させれば、以下のやり方です。
これは、プログラミングの教本どおり。お手本どおりの、「守」なやり方。
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
しかし、具体的なサンプルコードはここでは示しませんが、『シート「元データ」でオートフィルターをかけ、表示されている行だけをコピーしてシート「要注意リスト」に貼りつける』というマクロを作って解決することもできます。
後者は、表計算の基本をはずれて、エクセルの機能を借りて問題解決する方法です。
ただし、こういうプログラムを書くのは、上記のマクロを書くよりもよほど手間がかかります。
シート「元データ」とシート「要注意リスト」で転記先の列の並びが異なるとか、そういう場合にはもっと手間がかかります。
ということで、基礎レベルの人向けの教本としては紹介したくない。
ところが、データの数が非常に多く、しかも、スピードを求められているときには、後者のほうがすぐれています。
ということで、上級者向けには、どっちのやり方もありなのですが。
初心者の人が、型も覚えないうちから後者のやり方を覚えようとするのは、「守破離」の考え方から言うと、ちょっとアウト。
そういう人は、道具ばかりたくさん知っている割には、簡単な問題も自力で解決できない「軟弱プログラマー(塾長談)」で終わってしまいがちなのだそうです。
何ごとも、まずは基本からということのようですね。