GoGoマクロのブログ

初心者向けマクロ講座「Go!Go!マクロ」の筆者三太郎の公式ブログです。

【Q&A】最初の文字が消えてしまうのはなぜ?

2010-08-03 10:12:26 | マクロ作成のコツ

Q.福岡県 総務・経理 50代男性より

福岡県の○○です。
仕事が忙しいくなかなか出来なかったのですが、言われたとおり
に毎日少しづつ勉強しました。
そして、いとも簡単に出来てしまうことにビックリしました。
チョッと拍子抜けという感もあります。

マクロの記録を使い我流で少しやってはいたのですが、知らない
ことばかりでした。
Lesson13のところで理解が出来ず、自分なりに意味を考えてみ
ました。

以下のような理解でいいのでしょうか?
③④で変数がからみあっているようで 初心者に理解するのは
なかなか難しいです。

① a = ActiveCell.Value
② ActiveCell.Offset(1, 0).Activate
③ For i = 1 To Len(a)
④  ActiveCell.FormulaR1C1 = Mid(a, i, 1)
⑤  ActiveCell.Offset(1, 0).Activate
⑥ Next i
   Range("B4").Select



①  クリックしたセルの値をaという変数に入れる。
②  書き込む位置を縦方向に1つ移動させる。
③⑥ i という変数(1からaという変数の文字数)の数
   だけ④⑤の命令を繰り返す。
④  Mid(a, i, 1)の命令を書き込む。

Mid(a, i, 1)の意味は 文字列aを iの開始位置
(1からaという変数の文字数分)から1文字抽出する。
※この部分が?

⑤  書き込む位置を縦方向に1つ移動させる。


自分でマクロをいじってみました。
i は別の文字でもいいこと。 ②を消すと最初の文字が消えて
しまうことなど
でも、なぜ②を消すと最初の文字が消えてしまうのでしょうか?


以上3ヶ所の疑問点よろしくお願いいたします。

※各レッスンの最後マクロが完成した時に各命令の横にコメント
があると初心者には復習の意味もあり理解が進みもっと分かり
やすくなるように思いました。




回答.三太郎より

> そして いとも簡単に出来てしまうことにビックリしました。
> チョッと拍子抜けという感もあります。

→(笑)。ちょっと簡単すぎましたかね!?


> 以下のような理解でいいのでしょうか?
> ③④で変数がからみあっているようで 初心者に理解するのは
> なかなか難しいです。

→とても詳しく、疑問な点をまとめていただけて感心しました。
これでバッチリです。これだけ理解できていて、しかもそれを
文章に書き表すことができるということが重要ですので、これは
すばらしい内容だと思いますし、この通りのご理解でまったく
問題ないです。(この部分が分かりにくい・・・とおっしゃる
部分も、私以上に説明がうまいです。^^; )


> 自分でマクロをいじってみました。
> i は別の文字でもいいこと。 ②を消すと最初の文字が消え
てしまうこと など
> でも、なぜ②を消すと 最初の文字が消えてしまうのでしょうか?

→これは、仰るとおりに「②書き込む位置を縦方向に1つ移動さ
せる。」ということですから、この行を消してしまう場合だと、
ここでは「書き込む位置を移動させない。」ということになります
ので、その後の1回目のループで最初に、まず先頭の1文字をその
移動させなかった位置(すなわち、入力する文字列のある位置)に
上書きをしてしまうわけですね。なので、上書きをされて最初の
文字が消えてしまうということになります。

例えば、②を消した上で、これの④と⑤の順番を入れ替えて下記
としても同じ結果が得られるわけです。

  a = ActiveCell.Value
  For i = 1 To Len(a)
    ActiveCell.Offset(1, 0).Activate
    ActiveCell.FormulaR1C1 = Mid(a, i, 1)
  Next i

(ただ、元々このような順番にあえてなっていないのは
( Offset(1, 0) が2回出てくるようになっているのは)、より
理解しやすくするためを考えてのレッスン上の都合で、です。)
とにかく、ご自分で色々試してみる!という姿勢がある方は必ず
上達が早いですので期待が持てます。


> ※各レッスンの最後マクロが完成した時に各命令の横にコメント
> があると初心者には復習の意味もあり理解が進みもっと分かり
> やすくなるように思いました。

→貴重なご意見ありがとうございます。仰るとおりですね。
ただ、実はそれ、あえて(わざと)書いていないという面もある
んです。
テキストの鉄則の中にも「コメントをたくさん書きなさい!!」と
いうことを書いていますが、もしこれに予めコメントが書かれて
いたとしたら、皆さん中々自分では書かなくなってしまうだろう
と思います。

○○さんのように、

> ①  クリックしたセルの値をaという変数に入れる。
> ②  書き込む位置を縦方向に1つ移動させる。
> ③⑥ i という変数(1からaという変数の文字数)・・・
> ④  Mid(a, i, 1)の命令を書き込む。
>    Mid(a, i, 1)の意味は 文字列aを・・・
> ⑤  書き込む位置を縦方向に1つ移動させる。

このような自分で理解した内容を、プログラム中にコメントとして
”自分の言葉で書き残す”ということが非常に重要なことなんです
ね。
自分自信でプログラムの意味を理解しようとしないことには、こう
したコメントは書けませんから。
ぜひこれをこのままLesson13で作成したプログラムの各行の横に
書き残しておいてくださいね。


以上ですが、説明にご不明な点などありましたらお手数ですがまた
何なりとご質問ください。

また、その後の近況、「こんなマクロを作りました!(^^)」とか、
「中々勉強する時間がありません(~_~)」とか・・・などのご連絡も、
是非お待ちしています!(何らかのよいアドバイスもできるだろうと
思いますので。。。)

では。




お返事.ご質問者より

福岡の○○です。
早速のご回答有難うございます。

やはり そうだったのですね!
出来たマクロを見ていたら ActiveCell.Offset(1, 0).Activate
が2回あったので何か変だなと思い1つでいいのではと思い
1つ目を消して実行してみたしだいです。


  a = ActiveCell.Value
  For i = 1 To Len(a)
    ActiveCell.Offset(1, 0).Activate
    ActiveCell.FormulaR1C1 = Mid(a, i, 1)
  Next i

このマクロで理解できました。
 

「こんなマクロを作りました!(^^)」とか とありましたので 
完成してはいるのですがアドバイスいただければと思い送ります。
ただ、個人情報に触れる部分がありますので内容を修正して 
次回メールいたしたいと思いますのでよろしくお願いいたします。


まずは今日はお礼まで



コメント    この記事についてブログを書く
« シート間のデータマッチング(... | トップ | VBAマクロが作れるように... »
最新の画像もっと見る

コメントを投稿

ブログ作成者から承認されるまでコメントは反映されません。

マクロ作成のコツ」カテゴリの最新記事