簡単なRSSのシートを作っていってみます。まず、はじめの一歩としてこんなん作りました。
画面 最初の一歩
C2〜E2の各セルには以下のような値が入っています。
=RSS|'2337.OJ'!銘柄名称 =RSS|'2337.OJ'!現在値 =RSS|'2337.OJ'!出来高
ボタンを押したときに現在値を別のセルにコピーするようにしてみましょう。
画面 ボタンを押したらコピー
まずEXCEL VBAの「コントロールツールボックス」から「コマンドボタン」を選んでシート上に配置します。で、ボタンのプロパティーで値をカスタマイズします。ここではオブジェクト名をCommandButtonReset、Caption(表示名)をリセットに変更しました。
ボタンの配置とか細かい手順は、VBAの入門サイトや本などで見てください(妥協)
CommandButtonResetボタンを押したときの処理を以下のように記述します。リスト ボタンを押したときにコピー(Sheet1)
Private Sub CommandButtonReset_Click() Range("D5").Copy Range("F5").PasteSpecial Paste:=xlPasteValues End Sub補足:
次に、リセットボタンを押したときの価格(ここでは基準価格と呼ぶことにします)からの変動率を表示するようにしてみます。次の画面のように、現在値と出来高の間に一列挿入し、基準比というセルを作ります。
画面 基準比を表示
基準比のデータのセル(E5)は以下のようにします。%表示はセルの書式設定でパーセンテージを選択します。
=+(D5-G5)/G5
ここでちょっと困ったことがあります。リセットボタンを押したときの処理は、
Range("D5").Copy Range("F5").PasteSpecial Paste:=xlPasteValues
と書いていたのですが、一列挿入したために、もうコピー先がずれちゃってます。楽天RSSはもともと表示を柔軟にカスタマイズするためのツールです。こんなちょっとしたセルの移動で、イチイチ、VBAのソースを変更してられません。幸いEXCELにはセルの範囲に名前をつけるという機能があります。それを使いましょう。
D5〜D9ぐらいのセルを範囲選択して、左上の名前ボックスで「現在値」と入力します。次にG5〜G9ぐらいのセルを範囲選択して同様に名前ボックスで「基準価格」と入力します。でもって、ボタンを押したときの処理を次のように変更します。
リスト 複数のセルを名前で指定(Sheet1)
Private Sub CommandButtonReset_Click() Range("現在値").Copy Range("基準価格").PasteSpecial Paste:=xlPasteValues End Sub
名前は単一のセルに対してもつけれますが、複数のセル(=範囲=Range)についてもつけれます。これで、少々データの場所を移動しても大丈夫です。
あと、上の画面では、基準比のとこが赤いフォントになっています。これはVBAで自分で処理を書いてもできますが、簡単な条件で色を変えるというのであれば、条件付書式が利用できます。条件付書式は、セルを選択して、メニューの書式→条件付書式で指定できます。
画面 条件付書式
RSSの変更イベントを拾う Worksheet_Calculate
次に、基準比が1%を超えたら背景を黄色にするようにしてみましょう。これだけの条件であれば、上記の条件付書式でもできますが、話の流れ上、ここではVBAのソースを書いて行います。
画面 1%を超えたら背景を黄色に
楽天RSSのセルのデータが変更されたイベントはWorksheet_Calculate()で取得できます。ソースはこうなります。
リスト 1%以上なら黄色に(Sheet1)
Private Sub Worksheet_Calculate() For Each myRange In Range("基準比") If myRange.Value > 0.01 Then myRange.Interior.ColorIndex = 6 End If Next End Sub
なおWorksheet_Calculateイベントは頻繁に呼ばれます。またVBA中から変更したセルの依存セルが再計算された、とかで、呼ばれまくることがあります。なので Application.EnableEvents=False を呼ぶことで、関数実行中は重ねて関数が呼ばれないようにします。また、大量にセルを書き換えていると、画面がチラチラすることがあるので、Application.EnableEvents=False を呼んで、関数実行中は画面を更新しないようにします。でもって、関数を抜けるときにTrueをセットしなおしておきます。こんな感じで処理を囲みます。
リスト 呼ばれまくり、チラチラ防止(Sheet1)
Private Sub Worksheet_Calculate() Application.ScreenUpdating = False Application.EnableEvents = False '処理 Application.ScreenUpdating = True Application.EnableEvents = True End Sub
あと、RSSでデータが取れなかったときとか、セルがエラーになる場合があります。すると基準比のセルを評価しているとこでエラーになります。IsError関数(場合によってはIsNumericなども)を使って、エラーセルをはじきます。で、上記処理を加味した Worksheet_Calculate 関数はこんな感じになります。
リスト エラー対応版(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 myRange.Interior.ColorIndex = 6 End If End If Next Application.ScreenUpdating = True Application.EnableEvents = True End Sub
あと、リセットボタンを押したときに、色をクリアする処理も入れときましょう。
リスト クリア処理(Sheet1)
Private Sub CommandButtonReset_Click() Range("現在値").Copy Range("基準価格").PasteSpecial Paste:=xlPasteValues For Each myRange In Range("基準比") myRange.Interior.ColorIndex = 0 Next End Sub
なおWorksheet_Calculate()だと変更元のセルがどこか特定できません。なので、ここでは、チェック対象の範囲を毎回全部チェックしています。Worksheet_Change(ByVal Target As Range)とかだと、変更元が取れるんですが、楽天RSSのセル変更では呼ばれませんし。
ここまでのエクセルファイルはこちらです。
→次 [楽天RSSの使い方3]へ