アプリ版:「スタンプのみでお礼する」機能のリリースについて

●質問の主旨
下記コードのうち、

buf = buf & msg & vbCrLfについて

1.右辺の変数bufはどんな役割があるのでしょうか?
2.右辺のbufを省略したら、メッセージボックスに
表示される「Excel」の文字は3つから1つになります。
これはなぜでしょうか?

ご存知の方ご教示よろしくお願いします。

●コード
Sub Sample8()

Call Sample9("Excel", 3)

End Sub

Sub Sample9(msg As String, n As Long)

Dim i As Long, buf As String
For i = 1 To n
buf = buf & msg & vbCrLf
Next
MsgBox buf

End Sub

A 回答 (4件)

Forループの1回目はbufには何も入っていないので、



buf = "" & "Excel" & vbCrLf

になります。2回目はbufは上記のものが入っているので、

buf = "" & "Excel" & vbCrLf & "Excel" & vbCrLf

になります。右辺のbufがその時点のbufの内容と置き換えられてbufに代入されます。
右辺にbufがなければ、bufの内容にかかわらず

buf = "Excel" & vbCrLf

なので、ループさせる意味はありません。
    • good
    • 0
この回答へのお礼

m-take0220様
ご回答ありがとうございます。
ご回答を繰り返し読んでいると、
右辺の変数bufの役割が分かってきました。

お礼日時:2011/11/02 12:03

こんなことはVBAの始のうちに学ぶことだ。


sは文字列として
s=s & x
は文字列の足し算のようなもので、 sの後にx という文字列を結合することの定石。
ーーー
単独では上記だが、繰返す場合は
上記のx にあたる部分が同じ文字列であると、実用性は無い。
xが変わる場合はx(i)などにデータがあるとして(エクセルのセル範囲でも良い。後述)
Sub test01()
x = Array("aa", "bb", "cc")
s = ""
For i = 0 To 3 - 1
s = s & x(i)
Next i
MsgBox s
End Sub
をやってみると、順次結合された文字列が返るのがわかるだろう。
セルの文字列の場合A2:C2については
Sub test02()
s = ""
For Each cl In Range("A2:C2")
s = s & cl
Next
MsgBox s
End Sub
ーーー
bufなどはファイルからレコードを読んで変数に受け取る場合の変数名として使われる習慣みたいなものだが
質問ではその面は現れてない。
ちなみに
なぜレコードのインプトエリアが、buf(=Bufferから来る)という用語になるのかは、昔からのプログラム経験などないと、わからないだろう。
ーーー
>右辺の変数bufはどんな役割があるのでしょうか?
文章で言うなら直前の文字列に追加という意味で、概念的にはとらえる時点がヅレて入るのだが、プログラム書法では
ほとんどの言語fでこう書く。
変数bufの箱から値を取り出して、別の場所(マシン(演算装置)のレベルのこと)で加工し、元の変数の箱に戻す(代入)するイメージ。
ーー
>「Excel」の文字は3つから1つになります。
これはなぜでしょうか?
なぜ突然Excelか。
判らないではないが、表現には注意。プログラムを造ろうとする人は特に神経質であれ。
    • good
    • 0
この回答へのお礼

imogasi様
ご回答ありがとうございます。

ご回答の内容につきまして今後の
VBAの学習の参考とさせていただきます。

お礼日時:2011/11/02 12:10

>1.右辺の変数bufはどんな役割があるのでしょうか?


 ⇒Msgbox関数の引数文字型変数
>2.右辺のbufを省略したら、メッセージボックスに表示される「Excel」の文字は3つから1つになります。
 ⇒常にSample9の引数1の文字列しかセットされない為です。
  肝心なのは「&」でこの連結演算子を理解すれば自ずと判ります。

これは、For~Nextで文字列リピートする手法です。
例えば、x = x & "a"を実行するとxは"a"、繰り返すと前回xの"a"に"a"が
連結されxは"aa"のように繰り返した回数分文字列がリピートされます。

別例(リピート関数を利用した方法)
Sub Sample(msg As String, n As Long)
buf = Application.Rept(msg & vbCrLf, n)
MsgBox buf
End Sub
    • good
    • 0
この回答へのお礼

mu2011様
ご回答ありがとうございます。

ご回答の文章を繰り返し読んでいると
直感的にではありますが、私の疑問が
解けてきました。

お礼日時:2011/11/02 12:09

百聞は一見にしかず



[F8] でステップ実行しながらbufの値の変化を見る事をお勧めします。
    • good
    • 0
この回答へのお礼

mt2008様
ご回答ありがとうございます。

[F8] でステップ実行していると、
For~Next構文の中で3回実行が
繰り返されるのを見ていてたら、
直感的になんとなく分かってきました。

お礼日時:2011/11/02 12:07

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!