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

ご質問させていただきます。

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初心者のためメッセージボックスの使い方がよく分かりません。
どなたか教えていただけないでしょうか?
よろしくお願いいたします。

A 回答 (5件)

メッセージボックスを出すと、その間VBAが止まってしまい、DDEのデータ受信にも支障が出るのでは?



下記の様に、メモ帳に追記なら、メモ帳は別のプロセスで動いているので、問題ないかもしれません。
http://oshiete.goo.ne.jp/qa/8084431.html

「YESが表示された場合」が、Worksheet_Changeイベントでは捉えられないらしく、、
Workbook.SetLinkOnData メソッド というのがあるそうですが、使ったことはないので、それ以上は分かりません。
Worksheet_Calculateは動作するかもしれませんが、何処が変わったかが取得出来ないので、今回の例では、D列全体をスキャンしないといけないのは同様です。
http://msdn.microsoft.com/ja-jp/library/office/f …
    • good
    • 0
この回答へのお礼

mitarashi 様

ご回答ありがとうございます。
なるほど、メモ帳という方法もあるのですね。勉強になりました。
平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。
この度は、ありがとうございました。

お礼日時:2013/08/25 07:31

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 で切り替えられるようにしておくと、便利かもしれませんね。例えばどこかのセルの値とか、ボタン類(コントロール)のオン/オフの状態により、動作を変えるなど。
    • good
    • 0
この回答へのお礼

MarcoRossiItaly様

ご回答ありがとうございます。
なるほど、確かにおっしゃる通りの問題点がありますね。
大変参考になりました。
(コントロール)のオン/オフに関しては、平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。
この度は、ありがとうございました。

お礼日時:2013/08/25 07:30

一括で表示するのでしたら



For i = 2 To 1701
If Range("D" & i) = "YES" Then
StrMsg = StrMsg & Range("A" & i).Value & vbCrLf
End If
Next i
MsgBox StrMsg

このような手段もあります。
    • good
    • 0
この回答へのお礼

再びのご回答ありがとうございます。
こちらの方も明日試してみます。

お礼日時:2013/08/25 07:27

リアルタイムデータが一行ずつ取り込まれ、かつ、取り込まれたときのアクティブセルがその行にあるのでしたら



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

こんな感じでできると思われますが、シートのセルがどこであれ変更されるたびに実行されますので、コメントにしているような条件を付けておいたほうがいいと思います。
    • good
    • 0
この回答へのお礼

kmetu様

ご回答ありがとうございます。
平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。
この度は、ありがとうございました。

お礼日時:2013/08/25 07:26

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

 以上
    • good
    • 0
この回答へのお礼

NYAFRAC様

ご回答ありがとうございます。
平日にならないとDDEリンクからリアルタイムデータを入手できないので、明日早速試してみます。
この度は、ありがとうございました。

お礼日時:2013/08/25 07:25

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