- ベストアンサー
Excel VBAポップアップ表示方法
- Excel VBAを使用して、特定の条件下でポップアップを表示する方法について説明します。
- Sheet1のD列の条件判定でYESが表示された場合、該当行のA列の4桁の数字をポップアップで表示できます。
- VBA初心者でも簡単に実装できるメッセージボックスを使用してポップアップを表示する方法を解説します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
hoully様 簡単な例で、下のようなものはいかがですか? YESのたびに止まってしまいますが... D列の条件判定がリアルタイムなのか、1701個のデータを取った後のバッチなのかわかりませんでした。 質問の意味を取り違えていたらごめんなさい。 Option Explicit Dim i As Long Sub 判定() For i = 2 To 1701 If Cells(i, 4).Value = 1 Then MsgBox Cells(i, 1).Value ' 1 または"YES" Next i End Sub 以上
その他の回答 (4)
- mitarashi
- ベストアンサー率59% (574/965)
メッセージボックスを出すと、その間VBAが止まってしまい、DDEのデータ受信にも支障が出るのでは? 下記の様に、メモ帳に追記なら、メモ帳は別のプロセスで動いているので、問題ないかもしれません。 http://okwave.jp/qa/q8084431.html 「YESが表示された場合」が、Worksheet_Changeイベントでは捉えられないらしく、、 Workbook.SetLinkOnData メソッド というのがあるそうですが、使ったことはないので、それ以上は分かりません。 Worksheet_Calculateは動作するかもしれませんが、何処が変わったかが取得出来ないので、今回の例では、D列全体をスキャンしないといけないのは同様です。 http://msdn.microsoft.com/ja-jp/library/office/ff838177.aspx
お礼
mitarashi 様 ご回答ありがとうございます。 なるほど、メモ帳という方法もあるのですね。勉強になりました。 平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。 この度は、ありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
MsgBox で表示するだけなら簡単なのですが、1,700 行もあるという点が問題になりそうですね。 1 1,700 回 MsgBox を表示させた場合、ポップアップの度にユーザーが OK して閉じるようになってしまいます。ボタンをクリックか Enter で押すまで、プロシージャが再開しません。 まとめて 1 回で該当データを表示するのは、次の理由で困ってしまうかもしれません。 2-1 改行により MsgBox の枠をはみ出す行数のデータが該当した場合、MsgBox にはスクロールバーがないので、全体を見ることができません。 2-2 改行しなかったとしても、1 バイト文字で約 1,024 文字までという prompt の制限があるので、4 桁の数なのであれば 1024 ÷ 4 = 256 個くらいまでしか表示できず、残りの文字は切れてしまうかと。 以上を考慮すると、そのデータ量で MsgBox というのは、不向きという感想です。 より実用的な代替法としては、例えば、どこかのシートに時刻(Now 関数)と該当データを書き出すなど。これであれば 1,700 行くらい何でもないし、OK ボタンを押すといった操作も不要です。 ただ、リアルタイムで送られてきていても、マクロが動作するときとしないときを If で切り替えられるようにしておくと、便利かもしれませんね。例えばどこかのセルの値とか、ボタン類(コントロール)のオン/オフの状態により、動作を変えるなど。
お礼
MarcoRossiItaly様 ご回答ありがとうございます。 なるほど、確かにおっしゃる通りの問題点がありますね。 大変参考になりました。 (コントロール)のオン/オフに関しては、平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。 この度は、ありがとうございました。
- kmetu
- ベストアンサー率41% (562/1346)
一括で表示するのでしたら For i = 2 To 1701 If Range("D" & i) = "YES" Then StrMsg = StrMsg & Range("A" & i).Value & vbCrLf End If Next i MsgBox StrMsg このような手段もあります。
お礼
再びのご回答ありがとうございます。 こちらの方も明日試してみます。
- kmetu
- ベストアンサー率41% (562/1346)
リアルタイムデータが一行ずつ取り込まれ、かつ、取り込まれたときのアクティブセルがその行にあるのでしたら Private Sub Worksheet_Change(ByVal Target As Range) '条件によっては ' If 何かしらの条件 Then ' Exit Sub ' End If 'とコードを実行する前に抜けるようにようにするか 'If 変更されたセルの条件 Then '実行する条件を付けておく If Range("D" & ActiveCell.Row) = "YES" Then MsgBox Range("A" & ActiveCell.Row).Value End If 'End If End Sub こんな感じでできると思われますが、シートのセルがどこであれ変更されるたびに実行されますので、コメントにしているような条件を付けておいたほうがいいと思います。
お礼
kmetu様 ご回答ありがとうございます。 平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。 この度は、ありがとうございました。
お礼
NYAFRAC様 ご回答ありがとうございます。 平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。 この度は、ありがとうございました。