- ベストアンサー
VBAコードでメッセージの返し方について
- VBA初心者が、シートのデータを比較し、更新したデータをメッセージボックスで返したいが、最後の処理値しか返ってこない
- 1ヶ月の独学VBA初心者が、シートのデータ比較とメッセージボックスでの返信について質問
- VBAでシートのデータを比較し、更新したデータをメッセージボックスで返す方法について質問
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは~ コード拝見させていただきました。 ループの動きを勘違いされていらっしゃるように思えます。 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を書く必要はありません。 あまり丁寧な回答になく、申し訳ございません。 ご参考になれば幸いです。
その他の回答 (2)
修正案です。ご参考まで。 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
お礼
回答ありがとうございます。 空白のセルに対するコード、大変参考になりました。 また、実は現在シート名を変数にして別途書いているのですが、なぜか走らなくて困っているところでした。 ご指摘の最後の1行をRangeオブジェクトで書いたのですが、それが原因なのか、他に問題があるのか、分かりません。 いろいろ書き直して、試して行こうと思います。 ありがとうございました。
- cj_mover
- ベストアンサー率76% (292/381)
こんにちは。 myMsg = myMsg & Sheets("strage1").Cells(i, 1).Value & "から" & Sheets("strage2").Cells(i, 1) & "に変更しました" & vbCrLf のように書き換えてみてはいかがですか。
お礼
早速の回答ありがとうございます。 myMsg=myMsg&・・・のくだり、さっそく書き直してみましたら、うまく走りました。 またお邪魔させていただきますので、その節はよろしくお願いいたします。
お礼
早速の回答ありがとうございます。 なるほどMsgBoxの原理はそういうことなんですね。 また.Valueの意味や変数の扱いなど、まだまだ勉強しなければなりませんね。 ちょくちょくお邪魔させていただきますので、その節はお願いいたします。