• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAコードでメッセージがうまく返せません)

VBAコードでメッセージの返し方について

このQ&Aのポイント
  • VBA初心者が、シートのデータを比較し、更新したデータをメッセージボックスで返したいが、最後の処理値しか返ってこない
  • 1ヶ月の独学VBA初心者が、シートのデータ比較とメッセージボックスでの返信について質問
  • VBAでシートのデータを比較し、更新したデータをメッセージボックスで返す方法について質問

質問者が選んだベストアンサー

  • ベストアンサー
  • k-glad
  • ベストアンサー率35% (5/14)
回答No.2

こんにちは~ コード拝見させていただきました。 ループの動きを勘違いされていらっしゃるように思えます。 1)i = 1 2)For i = i To 15 3) If Sheets("strage1").Cells(i, 1) <> Sheets("strage2").Cells(i, 1) Then 4) myMsg = Sheets("strage1").Cells(i, 1).Value & "から" & Sheets("strage2").Cells(i, 1) & "に変更しました" & vbCrLf 5) Sheets("strage1").Cells(i, 1).Value = Sheets("strage2").Cells(i, 1) 6) Else 7) End If 8)Next i 9)MsgBox myMsg ・2行目 For i = (ループの初期値) TO 15 'まず、ループ制御文が変です。 ・4行目 If判定でtrue(If以降のコードを実行することになった場合)変数myMsgの中には、そのとき見ているセルの内容を入れようということですね。 しかし、ループが1~15回繰り返されている間は、その変数myMsgの中は上書きされています。 →なので、ループを抜けたときの最新のものしか変数myMsgには入っていない状態になります。 →myMsg = myMsg & …(略) とするといいと思います。 その他ですが… ・cells.valueをとっていますが、もしセルが空だった場合、エラーで止まります。 ・myMsgはstring型で宣言しているため、セルの値を取ったらconvert.tostringすると安全です。 ・If~thenのときの処理はありますが、それ以外の場合(else)は何も処理をしないときは、elseを書く必要はありません。 あまり丁寧な回答になく、申し訳ございません。 ご参考になれば幸いです。

upside-down
質問者

お礼

早速の回答ありがとうございます。 なるほどMsgBoxの原理はそういうことなんですね。 また.Valueの意味や変数の扱いなど、まだまだ勉強しなければなりませんね。 ちょくちょくお邪魔させていただきますので、その節はお願いいたします。

その他の回答 (2)

noname#203218
noname#203218
回答No.3

修正案です。ご参考まで。 Sub 何を書き換えたかMsgBox() Dim i As Integer Dim myMsg As String For i = 1 To 15 If Sheets("strage1").Cells(i, 1).Value <> Sheets("strage2").Cells(i, 1).Value Then myMsg = myMsg & Sheets("strage2").Cells(i, 1).Value & "から" & Sheets("strage1").Cells(i, 1).Value & "に変更しました" & vbCrLf Sheets("strage2").Cells(i, 1).Value = Sheets("strage1").Cells(i, 1) End If Next i If myMsg <> Empty Then MsgBox myMsg Else MsgBox "変更はありません" End If End Sub メッセージボックスの修正については#1の方の通りです。 修正箇所が無い場合はメッセージボックスは空白になってしまいますので、空白の場合は「変更ありません」としました。 ワークシート名が多く書き込むのであれば、ワークシート名も変数にした方がコードの書き込みが楽になります。 例として dim ws1,ws2 as worksheet set ws1=worksheets("strage1") set ws2=worksheets("strage2") if ws1.cells(i,1).value<> ws2.cells(i,1).value then

upside-down
質問者

お礼

回答ありがとうございます。 空白のセルに対するコード、大変参考になりました。 また、実は現在シート名を変数にして別途書いているのですが、なぜか走らなくて困っているところでした。 ご指摘の最後の1行をRangeオブジェクトで書いたのですが、それが原因なのか、他に問題があるのか、分かりません。 いろいろ書き直して、試して行こうと思います。 ありがとうございました。

  • cj_mover
  • ベストアンサー率76% (292/381)
回答No.1

こんにちは。 myMsg = myMsg & Sheets("strage1").Cells(i, 1).Value & "から" & Sheets("strage2").Cells(i, 1) & "に変更しました" & vbCrLf のように書き換えてみてはいかがですか。

upside-down
質問者

お礼

早速の回答ありがとうございます。 myMsg=myMsg&・・・のくだり、さっそく書き直してみましたら、うまく走りました。 またお邪魔させていただきますので、その節はよろしくお願いいたします。

関連するQ&A

専門家に質問してみよう