作成 2006/8/13

楽天RSSの使い方2

簡単な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
補足:
・Range("D5").Copy Range("F5")だとRSSの式がコピーされてしまうので、xlPasteValuesを指定して、値だけをコピーしています。
・これだと、コピー後、コピー先のRangeに画面が移動しちゃうんで(短くていいなぁとおもってCopyメソッドを使ってみたが)、やっぱFor Eachでまわしてコピーした方がいいかも。

セルに名前をつける

次に、リセットボタンを押したときの価格(ここでは基準価格と呼ぶことにします)からの変動率を表示するようにしてみます。次の画面のように、現在値と出来高の間に一列挿入し、基準比というセルを作ります。

画面 基準比を表示

基準比のデータのセル(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のセル変更では呼ばれませんし。

ここまでのエクセルファイルはこちらです。

sample2.xls

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

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