色が変わるというのでもいいのですが、ずーっと画面を凝視するのも疲れますし、音でアラート出せるとよかろうと思います。外部の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