作成 2006/8/13

楽天RSSの使い方3

アラート音を鳴らす

色が変わるというのでもいいのですが、ずーっと画面を凝視するのも疲れますし、音でアラート出せるとよかろうと思います。外部のwavファイルを再生します。やり方はいくつかあるようですが、ここではWindowsのAPIを利用する方法を紹介します。標準モジュールに以下の関数を定義します。

リスト 音の再生(Module1)

Public Declare Function PlaySound Lib "winmm.dll" Alias "PlaySoundA" _
        (ByVal pszSound As String, _
         ByVal hmod As Long, _
         ByVal fdwSound As Long) As Long

Public Const SND_SYNC = &H0 '同期再生
Public Const SND_ASYNC = &H1 '非同期再生
Public Const SND_LOOP = &H8 '繰り返し再生
Public Const SND_PURGE = &H40 '停止

Public Sub PlaySoundCur(ByVal file As String)
    PlaySound ThisWorkbook.Path & "\" & file, 0, SND_ASYNC
End Sub

winmm.dllのPlaySound関数を利用します。引数にファイルのフルパスをわたせば再生できます。しかし、フルパスで指定すると、サウンドファイルとEXCELファイルを移動したときに、パスの書き換え等面倒です。PlaySoundCur関数は、EXCELファイルと同じディレクトリにあるサウンドファイルをファイル名を指定して再生します。呼び出し側はこんな感じです。

リスト alert.wavを呼び出す処理(Sheet1)

PlaySoundCur ("alert.wav")

前の続きで、基準比が1%を超えたら音も出すという処理を入れたのはこんな感じ。

リスト 関数呼び出し(Sheet1)

Private Sub Worksheet_Calculate()
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    For Each myRange In Range("基準比")
                                
        If Not IsError(myRange) Then
            If myRange.Value > 0.01 Then
                If myRange.Interior.ColorIndex <> 6 Then
                    alert = True
                    myRange.Interior.ColorIndex = 6
                End If
            End If
        End If
    Next

    If alert = True Then
        PlaySoundCur ("alert.wav")
    End If

    Application.ScreenUpdating = True
    Application.EnableEvents = True

End Sub

なお、1%を超えた後、変動があるたびにクリアボタンを押さないかぎり、何度も何度もアラート音がなるのを防止するために、背景色が指定されていないことをチェックしていますが、さすがにアドホック(その場しのぎ)すぎるので、マジメに作るときにはもうちょっとなんとかした方がいいでしょう。

・上のモジュールのソースはどこかのWebページのソースをコピペしたものですが、どこを参考にしたのかわからなくなりました(ぐーぐっても、同様の内容のページはあっても、関数やコメントまで同じまさにそれというページが見つからない)。同様の話は2chのスレやMLでもあったですし、まぁよくあるソースということで、コピペだけど許してね。それは俺のソースだ!という方はご連絡ください。出所明記します。
・本当は、サウンドファイルは、相対ディレクトリでなくEXCELブックに埋め込みたいかも。でも上のAPI呼び出しちゅうのもわかってないぐらいの僕ですし、今はこれが精一杯。

タイマーを使う

毎回毎回リセットボタンを押すのは面倒なものです。タイマーを使って、ボタンを押したところからの基準比でなく、数秒前、何分前からの基準比を表示するといったことが可能です。VBAで簡単なタイマー処理を行うには、Application.OnTime が利用できます。

Application.OnTimeの引数には、次に呼ばれる時刻(Date)と、呼ばれる関数を指定します。次のような感じになります。この例では5秒ごとにTimerProc関数が呼び続けられることになります。

リスト Application.OnTimeの例

Private Sub TimerProc()
    
    '行いたい処理
    
    nextTime = Now() + TimeValue("00:00:05")
    Application.OnTime nextTime, "Sheet1.TimerProc"
    
End Sub

しかし、最初の一発目をどこかで呼ばないと動きません。ここでは、チェックボックスのコントロールを配置し、そこから呼ぶのにしましょう。処理はCommandButtonReset_Clickを呼び出すのにしましょう。ここではチェックボックスのオブジェクト名はTimerCheckBoxとしました。

画面 タイマー用のチェックボックス

お決まりの?Application.ScreenUpdating 、Application.EnableEventsなどの処理も追加して、タイマー処理を追加したソースはこんな感じになります。

リスト タイマー処理

Private Sub TimerCheckBox_Click()
    If TimerCheckBox.Value = True Then
        TimerProc
    End If
End Sub

Private Sub TimerProc()
    
    Application.ScreenUpdating = False
    Application.EnableEvents = False
    
    If TimerCheckBox.Value = True Then
                
        CommandButtonReset_Click
        
        nextTime = Now() + TimeValue("00:00:05")
        Application.OnTime nextTime, "Sheet1.TimerProc"
            
    End If
        
    Application.ScreenUpdating = True
    Application.EnableEvents = True
    
End Sub

・5sで1%も上がるなんて、ほとんどないので、時間間隔やアラート条件は適当に調節してください。

コードを置換する

楽天RSSはたくさんの銘柄を登録して、監視するのに便利です。しかし、コードや市場を入力するのは仕方ありませんが、その他のデータもイチイチ全部入力していると骨が折れます(一列データを増やしたとかでもまた大変)。ここでは、コードと市場から他のデータを自動的に入力する方法を紹介します。これも方法はいくつかありますが、ここではVBScriptの正規表現オブジェクトを使って、正規表現で置換することにします。

画面 範囲を選択して「コード置換」ボタン


コードはこんな感じです(エラーチェックはない)。

リスト 「コード置換」ボタンを押したときの処理

Private Sub CommandButtonReplace_Click()
    Application.ScreenUpdating = False
    Application.EnableEvents = False

    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    re.Pattern = "=RSS\|\'....\..{1,2}\'\!"
                
    For Each myRange In Selection
        code = Cells(myRange.Row, 1).Value
        market = Cells(myRange.Row, 2).Value
        
        If code <> "" And market <> "" Then
            replaceStr = "=RSS|'" & code & "." & market & "'!"
            myRange.Formula = re.Replace(myRange.Formula, replaceStr)
        End If
    Next
    
    Application.ScreenUpdating = True
    Application.EnableEvents = True
End Sub

"=RSS\|\'....\..{1,2}\'\!"の部分が正規表現で、"=RSS|の後に文字が4つあり、続いてカンマ(.)、その後に文字が1〜2コある"という文字列をあらわしています。この文字列を、"コード.市場"という文字列に置き換える処理になっています。

なんか疲れてきたので、こんなところにしておきます。正規表現の説明は、"EXCEL VBA 正規表現 VBScript.RegExp"などでウェブ検索すると説明してるページがいろいろあります(なげやり)。

以上、楽天RSSを使ったときに、最初につまづきそうなポイントについて紹介しました。全くの初心者だと手順がわからないし、VBAベテランにとっては、楽天RSS以外のVBAの話もまじっててなんだこりゃ、みたいな解説になってしまいましたが、半分自分メモということで、まぁいいかな。

ここまでのサンプルは以下です。
sample4.zip

→次 [楽天RSSの使い方4]へ

←前 [楽天RSSの使い方2]へ
↑TOP [楽天RSSの使い方]へ
/HOME [ミスターマーケットの気まぐれ]へ