エクセルマクロ・VBA達人養成塾 小川です。
キューバ旅行記、その27です。
ハバナでの、2日目の早朝。
翌朝の長距離バスを予約しにviasulのターミナルへ。
その後、ハバナ名物、マレコン通りに向かう。
スペイン資本の高級ホテル「Melia Cohiba」の横に地元の人向けのデパートがある。casa particularのダンナに、そこの前で下ろしてもらった。
というわけで、いろいろ食品の写真を。まずは、中国製「バカうけのパチモン」と思しきスナック菓子。 ヾ(´ー`)ノ
今日は、ちょうどこの週末にある受講生からフォローアップ中にもらった質問から。
勉強会に参加するため(遊びに行っていた、とも言えるが)大阪に行っているとき、
ある受講生から、以下のような質問をもらった。
こんばんは。いつもお世話になります。
先日11月5日のセミナーを受講させていただいた、○○拓哉です。
フォローアップ動画の配信など、毎日ご連絡をいただきましてありがとうございます。
今日は一つ質問させていただきたいことがありまして、ご連絡をさせていただきました。
フォローアップのNo.4の問題で、正解のマクロは、
———————————————————————-
Sub mondai1() Dim hidari Dim migi migi = 5 For hidari = 8 To 17 If Range(“c” & zangyo).Value > 100 Then Range(“F” & migi).Value = Range(“A” & hidari) Range(“G” & migi).Value = Range(“B” & hidari) Range(“H” & migi).Value = Range(“C” & hidari) migi = migi + 1 Else End If Next End Sub
—————————————————————-
になりますが、変数の設定のところで
Dim hidari Dim migi For hidari = 8 To 17 migi = 5
という形で、hidariとmigiの定義の順番を逆にする(hidariが先、migiが後)と、
一つのセルの中に全部入力されてしまい、上手くいきませんでした。
これはなぜ逆にするとできなくなるのでしょうか。
ご教示いただければ幸いです。
何卒、宜しくお願い申し上げます。
ということだった。
つまり、以下のようなプログラムにしたらきちんと動かない。
([1]と[2]が、元のものと逆)
どうしてか、教えてください、という質問。
Sub mondai1() Dim hidari Dim migi For hidari = 8 To 17 ‘[1] migi = 5 ‘[2] If Range(“c” & zangyo).Value > 100 Then Range(“F” & migi).Value = Range(“A” & hidari) Range(“G” & migi).Value = Range(“B” & hidari) Range(“H” & migi).Value = Range(“C” & hidari) migi = migi + 1 Else End If Next End Sub
僕は見た瞬間何が問題かは分かるのだが。
それは、僕が頭の中だけでマクロを動かせるから。
ということで、以下、僕からの回答。地頭のいい人からの質問だったので、つっぱねた。
これは、○○さんなら、自力でなんとかしてもらいたい気もします。。
ステップインモードで実行しつつ、 migi という変数の値が変わる都度、
その中身を調べてみてください。
少なくとも、[F8]を50回くらい押す間には、
migiという変数の値がどう変化しているのかを確認できるかと思います。
それで分かるか、分からないかしたら、またご連絡ください。
そうしたら、すぐに返事が来た。
こんにちは。ご返信くださいましてありがとうございました。
ステップ・インで試してみたところ、解決することができました。
上手くいかなかった理由ですが、
migiという変数がforとnextの間に挟まれているため1回実行した後、
nextで戻ってきたときに再度migi=5に設定されてしまうため、
すべて同じセルの中に入力されてしまう。
ということが理解できました。
今後、マクロが上手くいかなかった場合、
ステップインで一つ一つ結果を確認する習慣を
つけるように気を付けます。
このたびはご回答くださいまして、誠にありがとうございました。
これからも色々と勉強を続けるなかで、ご質問させていただくことが
あるかと思いますが、何卒よろしくお願い申し上げます。
ここで大事なのは、実体験をもって学んでもらうこと。
僕は常々書いていますが。
僕は頭の中だけでプログラムを動かして、
「この行が実行された段階で変数の値がどうなっているはずだ」とか、
「この行が実行された段階で、セルの値はこうなっているはずだ」とか、
ありありとイメージできます。
でも、どうしてそれが可能かというと、
それは、かつては僕もVBE上でステップインモードでマクロを
実行しながら丁寧に確認する、という経験を積んできたからです。
その経験を通じて、頭の中だけでもそれができるようになったというだけです。
頭の中だけでイメージできるようになるには、実体験することです。
この○○拓哉さんも、上記の[1]と[2]をひっくり返したときに
思うようにマクロが動かなくなった理由について、
最初は、プログラムを見ていても見当をつけられませんでした。
なんですが、実は、こうして「実体験」をした今となっては、
ステップインモードでマクロを実行しなくても、
ある程度は解決できるようになっているはずです。
単に答えを教えるより、こういう具合に、「答えを脳内で導けるように
なるための、体験のプロセス」をお伝えすることが大切です。
こういう「体験のプロセス」を経なければならない分、
「魚の捕り方」を伝えるほうがどうしても面倒なのですが
(かつ、相手によっては、そういう対応をすると嫌われるのですが)。
「人に魚を与えることは一日の食料にしかならないが、魚の捕り方を教えることは、
生涯の糧を与えることになる」
という言葉もあります。
伸びるはずの人に本質的かつ重要なことを伝えたいと思うならば、
指導者は、やはりこういうアプローチを取るべきだ、と思います。
エクセルマクロ・VBA達人養成塾、12月末~3月までの日程を追加しました。
年末特訓も用意しています。