[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『音を出す』(むーの)
お教えください。
I1〜I300まで、条件が整えば(-1)と表示されます。
同じくJ1〜J300まで、条件が整えば(1)と表示されます。
いずれも条件に満たなければ空欄になります。
−1や1が入った場合にのみビープ音を出すには
どうすればよろしいでしょうか?
おのおの違う音であればなお良いのですが。。
片方のみ出る、もしくは空欄でも出てしまいお手上げです。
ご教示よろしくお願いいたします。
< 使用 アプリ:E2000、使用 OS:Windows10 >
1.そのセルの値は数式で表示されるのですか? 2.それとも、条件付書式でセットされるのですか? 3.あるいは、別マクロで、直接、条件によって、そのセルに書きこまれるのですか?
1.なら、その数式を教えてください。 2.なら、登録された条件を教えてください。 3.なら、そうしているコードをアップしてください。
また
>>片方のみ出る、もしくは空欄でも出てしまいお手上げです。
これはマクロ処理ですか? そうであれば、そのマクロも、アップしてください。
(β) 2016/06/27(月) 16:48
追加で。
現在、どのような仕組み(マクロ?)でやっているのか不明ですが、I1〜I300 や J1〜J300 全体をみれば +1 だったり -1 だったり 空白だったり、そういった組み合わせの状況が複数存在していますよね。(たぶん)
そういう場合はどうするのですか?
(β) 2016/06/27(月) 17:21
2.それとも、条件付書式でセットされるのですか? 条件付き書式になっています。−1=青、1=赤と。
3.あるいは、別マクロで、直接、条件によって、そのセルに書きこまれるのですか? >いいえ、マクロによって取り込んだ数値によりセルの値は表示されます。
具体的に申しますと、FXのMT4より約1秒ごとに価格データを取り込み、1分間ためて、1分足を完成させて
(始値、高値、安値、終値)の4本値からI列、J列で判定しています。色は付くのですが
複数通貨ペアを監視していますと、音が出たら便利だなと思ってこちらにご相談に上がりました。
ですから、−1=青、1=赤 同時に出ることはありません。 空欄の方が多いです。
I1〜I300とは5時間=300分を目安にということになります。
もしかしたら、1枚のシートに複数のマクロは無理なのでしょうか?
あまりに初心者で申し訳ございません。よろしくお願いいたします。
(むーの) 2016/06/28(火) 00:04
>>1枚のシートに複数のマクロは無理なのでしょうか?
いえ、FXは素人ですが、これをマクロで対応することは可能だと思います。 ただし、要件と仕様が明確になれば です。
・シートレイアウトを明確にしてください。 ・提示されたI列の式、J列の式、これらは、具体的に、どの行にセットされた数式ですか。
>>FXのMT4より約1秒ごとに価格データを取り込み、1分間ためて、1分足を完成させて
完成されたものを、具体的には、どの行の、どことどこに書き込んでいますか? また、書き込みの手法は何を使っておられますか?
(β) 2016/06/28(火) 00:41
時間 始値 高値 安値 終値 売り 買い 102.433 1:45 102.433 102.433 102.433 102.433 102.433 1:46 102.433 102.433 102.433 102.433 102.433 102.433
Cで1秒ごとに読み込み、Eが時間、LとMの間違いでしたがここに先ほどの計算式が入ります。
(むーの) 2016/06/28(火) 00:56
詳細レイアウトについては、とりあえず後回しにしましょう。 要は、1分ごとに、新しいデータが書きこまれる、その新しく書きこまれたデータに関して判定するわけですね。 (先にコメントしましたが すでに、前に書きこまれた行でも +1 や -1 があるわけですよね。 でも、それらではなく、今、追加されたものを判定 ということですね)
で、質問している、【C列への取り込み】の方式ですけど、どんな仕組みですか? また、それを受けての 【始値 高値 安値 終値】(E,F,G,H列でしょうか)への書き込みは どんな方法で実行しておられますか?
すべて、DDEでしょうか? もし、DDEだとすると、
・私自身が DDE に詳しくない。 ・当方に環境もないので、かりにコードを書いたとしても検証するすべがない。 ・DDEでの更新は、シートの Changeイベントが発生しない。 ・過去(win95あたり?)には、シート.OnData というものがサポートされていて DDE や OLE での更新に対して イベント処理が可能だったらしいけど、昨今のエクセルバージョンで、そのコードを書いてもエラーにはならないものの 実際には反応しない という記事を、よく目にする。 ・DDE自体、マイナーな存在になっていて、最近の事例紹介が、ほとんど見つからない。
ということもあって、βがVBAでやるなら、自前の監視処理をゴリゴリ書くか、 シート上に書かれた計算式が再計算されたかどうかのタイミングで処理することになると思います。 (後者で可能なら後者にしたいと思っていますが)
(β) 2016/06/28(火) 01:25
(先にコメントしましたが すでに、前に書きこまれた行でも +1 や -1 があるわけですよね。 でも、それらではなく、今、追加されたものを判定 ということですね)>はい、その通りです。
すべて、DDEでしょうか?>はい、すべてDDEです。
で、質問している、【C列への取り込み】の方式ですけど、どんな仕組みですか?
また、それを受けての 【始値 高値 安値 終値】(E,F,G,H列でしょうか)への書き込みは どんな方法で実行しておられますか?>以下に貼り付けます。
Option Explicit
Public STOP_B As Boolean
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub ストップ()
STOP_B = False End Sub
Sub スタート()
Dim i As Integer Dim t As Integer Dim n As Integer Dim R As Range Dim timenow As Variant i = 6 n = 6 STOP_B = True Do While True t = 0 timenow = Format(Now(), "HH:mm") '約3秒スリープする While t < 100 Call Sleep(10) DoEvents t = t + 1 Wend If timenow = Format(Now(), "HH:mm") Then
Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 Else Sheet1.Cells(n, 5).Value = timenow '時間 Sheet1.Cells(n, 6).Value = Sheet1.Cells(6, 3).Value '始値 Set R = Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)) Sheet1.Cells(n, 7).Value = WorksheetFunction.Max(R) '高値 Sheet1.Cells(n, 8).Value = WorksheetFunction.Min(R) '安値 Sheet1.Cells(n, 9).Value = Sheet1.Cells(i - 1, 3).Value '終値
Sheet1.Range(Sheet1.Cells(6, 3), Sheet1.Cells(i, 3)).Clear
i = 6 Sheet1.Cells(i, 3).Value = Sheet1.Range("C3").Value i = i + 1 n = n + 1 End If If STOP_B = False Then MsgBox "お疲れ様でした" Exit Sub End If Loop End Sub
Function xSleep(ByVal dwMilliseconds As Long)
Call Sleep(dwMilliseconds) End Function
こういったものです。これはネットで無料で見つけたものですので、詳細は不明です。
(むーの) 2016/06/28(火) 03:17
コードアップありがとうございました。 仕掛けの全貌がクリアにみえました。 で、私がゴリゴリ書こうとしていた監視ループ、すでにできていたんですね。 なので、これに音出しを追加すればいいと思います。
今日は、あと1時間ほどで外出、戻りは夕方になります。 外出までにコードが出来上がればアップしますが、出来上がらなければ夕方以降になります。
でも、ベースがすでにありますので、その前に、他の回答者さんから回答があるかもしれませんね。
ところで、このモジュールは標準モジュールに書かれているんですね?
(β) 2016/06/28(火) 07:21
とりあえず。
現在のコードの
Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
これの下あたりに
Private Declare Function Beep Lib "kernel32" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
を追加。
Sheet1.Cells(n, 9).Value = Sheet1.Cells(i - 1, 3).Value '終値 の下に
If Sheet1.Cells(n, "L").Value = -1 Then Beep 2000, 100 ElseIf Sheet1.Cells(n, "M") = 1 Then Beep 500, 100 End If
これをいれてみてください。
Beep ヘルツ,ミリ秒 です。 このあたりはお好みの高さ、長さにしてください。
音を鳴らしたいタイミング、勘違いしていたら指摘願います。 また、1分ごとの処理が 100ミリ秒追加でかかります。 精度として具合わるければ、別スレッドで動きそうな音出しコードに変えるか、あるいは別エクセルで音を出す ということも考えられますが、まずは試してください。
なお、コード中のコメント、3秒スリープ、実際には 1秒スリープですから、直しておいたほうがいいですよ。
(β) 2016/06/28(火) 08:16
(むーの) 2016/06/28(火) 14:57
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.