[[20160627161813]] 『音を出す』(むーの) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『音を出す』(むーの)

お教えください。
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


早速の返答ありがとうございます。
1.そのセルの値は数式で表示されるのですか? 

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


C D E F G H I J K L M
USDJPY
101.592

		時間	始値	高値	安値	終値			売り	買い
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


すみません、列がずれてしまいました。A,Bは空欄です。
(むーの) 2016/06/28(火) 00:58

 詳細レイアウトについては、とりあえず後回しにしましょう。
 要は、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 や -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


すばらしい!M列の音が出ました。 Lはまだ確定値がないのでこれからですが行けそうです。
まずは、お手数おかけしましたが、ありがとうございました。
(むーの) 2016/06/28(火) 15:29

ご報告いたします。15:00から21:00までの6時間、問題なくデータ取得、判定、
そして、L,M列とも音が出ています。
ありがとうございました。自分一人ではここまでは到達できませんでしたので、
深く感謝いたします。このような形で実現できましたことを、β様に御礼申しあげます。
ありがとうございました。
(むーの) 2016/06/28(火) 21:08

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.