可変するセルの値をMsgBoxで表示させる方法

このQ&Aのポイント
  • Excel2007を使用している場合、DDEで更新されるリアルタイムデータに応じて特定の条件を満たすセルの値をMsgBoxで表示させる方法について教えてください。
  • リアルタイムデータは1ケタから7ケタの数字であり、特定の条件を満たす場合には「BUY」と「SELL」の文字列に連結された数字が表示されます。
  • 表示させたい文字列はR列のIF関数の条件を満たす際に発生するため、MsgBoxを表示することでユーザーに注意喚起を促すことができます。ビープ音と併せて使用することもできます。
回答を見る
  • ベストアンサー

可変するセルの値をMsgBoxで表示させる方法

ご質問させていただきます。 Excel2007をwindows7で使用しております。 ソフト・OS共に64ビットです。 Q4~Q3723までDDEで更新されるリアルタイムデータが入っています。 リアルタイムデータは1ケタから7ケタの数字です。 R4~R3723までは、R4の=IF(AND(O4="BUY",Q4>H4),"BUY"&J4,IF(AND(P4="SELL",Q4<I4),"SELL"&J4,""))をオートフィルでR3723まで貼り付けてあります。 J列には異なる4ケタの数字が事前に入力されていて、R列のIF関数の条件を満たすと、例えば"BUY1301"とか"SELL7203"のように表示されます。 やりたいことは、DDEで更新されるQ列のリアルタイムデータの変化をうけてR列のIF関数が条件を満たして"BUY1301"とか"SELL7203"と表示された瞬間に、その文字("BUY1301"とか"SELL7203")をMsgBoxを使って表示させたいのです。 しかも、MsgBoxの表示と同時にビープ音で注意喚起もしたいのです。 ちなみに、R列のIF関数の条件判定が3720行もありますが、Excelを一日動かしても、条件を満たすのはせいぜい10件程度なので、MsgBoxが表示されたことによってOKをクリックするまでVBAが止まってしまっても問題はありません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

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

  • ベストアンサー
  • nishi6
  • ベストアンサー率67% (869/1280)
回答No.3

DDEで更新されるのはQ列で、変更が知りたいR列は算式になっているので、Worksheet_ChangeイベントではR列の変更はつかめないはずです。 ここは、DDEでの更新前後でR列の内容をつかんで比較するのでしょうか。4000件程度で該当件数が少なければ時間的にも問題ないでしょう。 DDEでの更新がどのようにして行われているか分からないので、「DDEでの更新」はブラックボックスとして参考にコードを書いてみました。ほとんど何もしていません。こんな解答でいい? VBAのメッセージボックスを使っているので、複数のメッセージを出す場合、1件目で待ちになります。この辺りはご容赦を。 Sub Syougou()   Dim OldData As Variant   '更新前データ   Dim NewData As Variant   '更新後データ   Dim r As Integer      '行カウンタ      '更新前データを退避   OldData = Range("R4:R3723")   '**************************************   '**************************************      '処理 DDEでの更新のつもり   'Range("Q4") = 800   'Range("Q18") = 1300      '**************************************   '**************************************      '更新後データを取得   NewData = Range("R4:R3723")      '新旧の比較   Dim i As Integer      'Beepカウンタ   Const Num = 3       'Beep回数(お好きに)   Dim startTime As Single   '開始時刻   Const waitSec = 1     '待ち秒数(お好きに)      For r = 1 To UBound(NewData)     If OldData(r, 1) <> NewData(r, 1) Then       'Beep音       For i = 1 To Num         startTime = Timer         While Timer < startTime + waitSec           DoEvents         Wend         Beep       Next              'メッセージ       MsgBox NewData(r, 1)     End If   Next End Sub

hoully
質問者

お礼

nishi6様 ご回答ありがとうございます。 ご指摘の通り、worksheet changeではDDEでのデータ更新を捉える事ができませんでした。 また、ご回答頂きましたVBAは知らないコードばかりで大変勉強になりました。 この度は、ありがとうございました。

その他の回答 (2)

回答No.2

ちょっと変更 Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("R:R")) Is Nothing Then '範囲に含まれて無くない=含まれてたら! If Target <> "" Then MsgBox Target.Address & vbCrLf & "「" & Target.Value & "」に変更されました。" End If End If End Sub

hoully
質問者

お礼

satoron666様 早いご回答ありがとうございます。 worksheet changeですが、DDEでのデータ更新を捉えることができませんでした。 しかし、ratoron666様のご回答は大変勉強になりました。 この度はありがとうございました。

回答No.1

シートのVBAに、 Private Sub Worksheet_Change(ByVal Target As Range) If Not Application.Intersect(Target, Range("R:R")) Is Nothing Then '範囲に含まれて無くない(含まれてたら) MsgBox Target.Value'変更した部分の内容を表示 End If End Sub 当方Excel2003ですが、この方法ではどうでしょう? ビープー音については調べてみます。

関連するQ&A

  • EXCEL VBA ポップアップを表示する方法

    ご質問させていただきます。 Sheet1のA2~A1701まで4桁の数字(各行で重複しない4桁の数字です)、 Sheet1のB2~B1701とSheet1のC2~C1701にはDDEで取り込んだリアルタイムデータ、 Sheet1のD2~D1701には、B2~B1701とC2~C1701のリアルタイムデータを使ってIF関数で条件判定をしてYESまたはNOを表示する関数式が入力されています。 やりたいことは、D列の条件判定でYESが表示された場合、YESが表示された行のA列の4桁の数字をポップアップで表示させることです。 このようなことはできるのでしょうか? メッセージボックスを使えば良いのかもしれませんが、当方VBA初心者のためメッセージボックスの使い方がよく分かりません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

  • エクセルVBA MSGBOXを30秒間出したい それをUWSCソフトで監視して命令を出したい

     エクセルでI列に値が入力されていて、その値が変わればMSGBOXを30秒間だけ出すようにしたいが、どうすればいいんでしょうか?MSGBOXの中身は ”BUY""SELL"で  Private Sub Worksheet_Change (By Val Target As Range) If Target.Column="I"Then Msgbox"buy""sell" End IF End Sub これでは、表示されません どう改良するんでしょうか? あと、30秒間だけ表示させるには、 option explicit public declare function gettickcout lib "kernel132"()As long で証明?して DimStartTime DimNowTime StartTim=GetTickCount MyMsgbox.Show0 DoWhileNowTime-StartTime<3000 NowTime=GetTickCount Do Event Loop Unload My Msgbox End sub だと思うんですが、二つを混ぜてするにはどうするのでしょうか?教えてください 

  • エクセルVBA MSGBOXを30秒間出したい それをUWSCソフトで監視して命令を出したい

     エクセルでI列に値が入力されていて、その値が変わればMSGBOXを30秒間だけ出すようにしたいが、どうすればいいんでしょうか?MSGBOXの中身は ”BUY""SELL"で  Private Sub Worksheet_Change (By Val Target As Range) If Target.Column="I"Then Msgbox"buy""sell" End IF End Sub これでは、表示されません どう改良するんでしょうか? あと、30秒間だけ表示させるには、 option explicit public declare function gettickcout lib "kernel132"()As long で証明?して DimStartTime DimNowTime StartTim=GetTickCount MyMsgbox.Show0 DoWhileNowTime-StartTime<3000 NowTime=GetTickCount Do Event Loop Unload My Msgbox End sub だと思うんですが、二つを混ぜてするにはどうするのでしょうか?教えてください 

  • msgboxの表示

    A列の値とC列の値をMsgboxに表示するにはどうしたらいいのでしょうか?C列で一番高い商品とその品名A列を表示させたいのですが・・ Sub hinmei() Dim i As Long For i = 2 To Range("C65535").End(xlUp).Row Dim x As Long Dim a As Long x = Cells(i + 1, 5) If Cells(i, 5).Value < x Then a = x End If Next MsgBox a End Sub

  • MsgBoxの表示について

     ユーザーフォームのチェックボックスの選択後(複数選択可)コマンドボタンのクリックで各チェックボックスのマクロを実行するようにしていますが、下記コードだとマクロの実行後もMsgBoxが表示されてしまいますが(当たり前ですが)、これをコマンドボタンのみをクリックした場合のみMsgBoxを表示させることは可能でしょうか?お教え下さい。 Windows7・SP1 Office2010・SP2 Private Sub CommandButton1_Click() Sheets("編集").Select If CheckBox9 Then Unload UserForm6 変更後編集データの保存 End If If CheckBox10 Then Unload UserForm6 変更前編集データの保存 End If If CheckBox11 Then Unload UserForm6 指定勤務有あり編集データの保存 End If If CheckBox12 Then Unload UserForm6 指定勤務有なし編集データの保存 End If If CheckBox2 Then Unload UserForm6 日付データの保存 End If If CheckBox3 Then Unload UserForm6 個人情報の保存 End If MsgBox ("保存する編集データを選択してください。"), vbExclamation End Sub

  • Excelで選択したセルのある位置をMsgboxで表示するにはどうしたらいいでしょうか?

    Dim r As Range Set r = Application.InputBox(Prompt:="セルを選択", Type:=8) rをMsgboxで表示するにはどうしたらいいでしょうか? rのアドレスを文字列として取りたいのです。

  • エクセルでセルの値がTRUEかFALSEか判定

    Q3:R19の表があります。 Q列にはTRUEかFALSEが入りますが、空白や文字列の場合もあります。 R列には文字列です。 Q列でFALSEのセルだけ、同じ行のとなりのR列の文字列を順に抜き出し、メッセージボックスに表示したいのです。 下記のようなVBAを書いてみましたが、Q列が空白や文字列の場合まで抽出されてしまいます。 これを排除するいい方法はないでしょうか? Sub test01()   Dim msg As String   Dim i As Long   With Sheets("LOG")     For i = 3 To 19       If .Range("Q" & i).Value = False Then '        Debug.Print  i & "-" & .Range("R" & i).Value         msg = msg & .Range("R" & i).Value & vbCrLf       End If     Next i   End With   If msg <> "" Then     MsgBox msg & vbCrLf & "上記により不可です。", vbCritical   End If End Sub

  • あえてエクセルを2つ起動してセルを参照する方法

    ご質問させていただきます。 Excel2007を2つ起動します(あえて2つ起動する必要があります)。1つのExcel上に2つのブックを開くのではありません。 1つ目のExcel2007をExcel(1)と呼び、2つ目のExcel2007をExcel(2)と呼ぶことにします。 Excel(1)で開くファイル名は「板とチャート」で、Excel(2)で開くファイル名は「ティック」です。 Excel(1)とExcel(2)は同一のデータベンダーとDDE接続しており、平日の午前9時~午後3時までリアルタイムでデータが更新されます。 それぞれ受信したデータをVBAやワークシート関数で加工して各シートに表示しています。 このDDE接続はデータベンダーが提供するものであり、プロシージャはパスワードでロックがかかっており、私は見る事もいじる事も出来ませし、そもそもVBAに関して初歩的な知識しかないため、DDE接続自体をよく理解しおらず、いじれません。 今回やりたいことを以下に記します。 Excel(2)のファイル名「ティック」ワークシート名「連続」のQ1,Q2,Q3,Q4,Q5,Q6セルのそれぞれの値をExcel(1)のファイル名「板とチャート」ワークシート名「板」のC5,C13,C21,C29,C37,C45に表示させ、同様に、Excel(2)のファイル名「ティック」ワークシート名「連続」のR1,R2,R3,R4,R5,R6セルのそれぞれの値をExcel(1)のファイル名「板とチャート」ワークシート名「板」のI5,I13,I21,I29,I37,I45に表示させたいのです。 なお、Excel(2)のQ1~Q6セル及びR1~R6セルの値はそれぞれIF関数で"A","B"または空欄にリアルタイムで変化します。 従いまして、その"A","B",空欄をExcel(1)のファイル名「板とチャート」ワークシート名「板」のC5,C13,C21,C29,C37,C45セル及びI5,I13,I21,I29,I37,I45セルにリアルタイムに反映させたいのです。 なお、Excel(2)のIF関数の"A","B"または空欄を判定する各セルはcalculateイベントで1秒間に複数回更新されるカウンターになっています。 従いまして、IF関数の"A","B"又は空欄は1秒間の間に変化することもあります。 以上の事を実現いたしたく、以下を試してみました。 Sub できるかな() Dim xlApp As Application Set xlApp = GetObject("C:\Users\hoully\Desktop\ティック.xlsm", "Excel.Sheet").Application Worksheets("板").Range("C5") = xlApp.Worksheets("連続").Range("Q1").Value End Sub 実行すると、VBAprojectにVBAproject(ティック.xlsm)が追加されるのですが、 「実行時エラー 9 インデックスが有効範囲にありません。」 と表示され、Worksheets("板").Range("C5") = xlApp.Worksheets("連続").Range("Q1").Valueが黄色になります。 Worksheets("板").Range("C5") = xlApp.application.Worksheets("連続").Range("Q1").Valueとやっても同じ事が起こりました。 次に、以下を試してみました。 Sub できるかな2() worksheets("板").range("C5").formula= "=INDEX([C:\Users\hoully\Desktop\ティック.xlsm]sheet2!Q1:R6,1,1))" End Sub 「実行時エラー1004 アプリケーション定義またはオブジェクト定義のエラーです」 と表示されてしまいます。 私はExcelもVBAも初心者で、非常に単純なプロシージャを作るにも本やネットを参照しなければ作れないレベルです。 そのため、どこが悪いのかよくわかりません。 どなたか教えていただけないでしょうか? よろしくお願いいたします。

  • Excel2000のセル内の文字列の数字の先の2桁を取り出す方法について

    年のいった初心者です。 以前の質問に対する回答有難うございます。また、教えてください。  エクセル2000です。セル内に数字の文字列で、4桁、6桁、8桁のものが有ります。4桁のものには"01"を、6桁のものには"60"を、表示し、8桁のものには数種類あり、8桁の場合は、各文字列で上位の2桁を表示したいのです。 =IF(LEN(A1)=4,"01",IF(LEN(A1)=6,"60",IF(LEN(A1)=8,?????? 4桁、6桁については以前に教えていただいた、関数等でいけたのですが、8桁のときが分かりません。困っています。お願いします。     A列    B列 1 7532 →→ 01 2 280573 →→ 60 3 34964821 →→ 34 4 06839775 →→ 06 5 67500023 →→ 67

  • 二桁の数値の表示方法?

    A1に数値を入力します。この数値は一桁(2とか4など)の場合と 二桁(10とか17など)の場合があり、この入力値をJ1とK1に (17ならJ1に1、K1に7と分けて、一桁の4場合はJ1空白K1に4) に分けて表示しています。IF(LEN($A$1)>=2,LEFT($A$1,1)," ")と RIGHT($A$1)を使用。 さらにM1でVLOOKUPの検索値に使用しています。 VLOOKUP用の被検索データは他のシートに作成済み。 A1に4を入力するとJ1は空白になります。 ここに0を表示させたいのですが、 A1のセルの書式設定の表示形式を文字列にして、 入力値を04とするとJ1は0を表示しますが、M1が表示されません。(空白になってしまう) A1のセルの書式設定の表示形式をユーザー定義で00にして 入力値を04とするとM1は表示されますが、J1が表示されません。(空白になってしまう) A1に17を入力すれば書式設定の表示形式は 文字列でも標準でもJ1、K1、M1すべて表示されます。 説明が長くなりましたが、A1に一桁の数字(数値?)入力したときに J1とM1が表示できるようにするにはどのようにすればできるのでしょうか。 ちなみに実際使っているものはシートが4つに分かれていて表示に関しては とても複雑になっています。参考に実際使用しているVLOOKUPの セルに入力されている関数はIF(LEN(入力1!$B$8)<=0,"",IF(ISERROR(VLOOKUP(入力1!$B$8&入力1!$C$8,内訳マスタ!$A:$E,4,0)),"",VLOOKUP(入力1!$B$8&入力1!$C$8,内訳マスタ!$A:$E,4,0)))このようなもので、VLOOKUPも二通りのデータ検索と表示をしております。 人に作ってもらったものなので、自分で何とかならないかと二桁入力の仕方とかを調べてみましたが、どうにもなりませんでした。 どなたかお手隙のときで結構ですので、アドバイス頂けますでしょうか。 このような二通りの表示は無理なら、そのようなことをお知らせいただけると幸いです。

専門家に質問してみよう