グローバル変数を準備するVBAを記述する
複数サイトから取得した記事を格納するために、構造型の配列と記事の総件数のための変数を準備します。
[リスト1]グローバル変数を準備する
Private Type art '記事を格納する構造型変数の定義
title As String 'タイトル
link As String '詳細ページのURL
description As String '本文
pubDate As String '発行日時
genre As String 'ジャンル
End Type
Dim artList() As art '記事リストを格納する配列
Dim nofList As Integer '記事の総件数を格納
更新ボタン押下で動作するVBAを記述する
「cbUpdate」クリック時の処理として記述します。「Microsoft XML, v3.0」の参照設定を追加しておいてください。
[リスト2]更新ボタン押下で動作する
Private Sub cbUpdate_Click()
nofList = 0 '初期値は0件
Dim idx As Integer
Dim url As String, genre As String, status As String
'(1)対象サイト数だけ繰り返す
For idx = 1 To Range("url").Rows.Count
url = Range("url").Cells(idx) '入力URLの取得
genre = Range("genre").Cells(idx) '入力ジャンルの取得
status = getFeed(url, genre) 'サイト単位の処理
Range("status").Cells(idx) = status '処理結果の転記
Next
If nofList = 0 Then Exit Sub '総件数が0の場合は、処理を中断
'(2)前回の記事をクリア
Dim artRow1 As Integer
Dim artRow2 As Integer
Range("title_header").Offset(1).Activate
artRow1 = ActiveCell.Row
artRow2 = ActiveCell.SpecialCells(xlCellTypeLastCell).Row
If artRow1 <= artRow2 Then Rows(artRow1 & ":" & artRow2).Delete
'(3)記事リストから、ワークシートに転記
For i = 0 To UBound(artList)
ActiveSheet.Hyperlinks.Add _
anchor:=Range("title_header").Offset(i + 1), _
Address:=artList(i).link, _
TextToDisplay:=artList(i).title
Range("description_header").Offset(i + 1) = artList(i).description
Range("pubDate_header").Offset(i + 1) = artList(i).pubDate
Range("genre_header").Offset(i + 1) = artList(i).genre
Next
'(4)日付の新しい順にソートする
Range("title_header").Activate
ActiveCell.Sort _
key1:=Range("pubDate_header"), _
Order1:=xlDescending, _
Header:=xlYes
'(5)セル内を折り返して全体を表示
Selection.CurrentRegion.WrapText = True
End Sub
記事の総件数を初期化して、(1)では入力行の数だけ、外部ユーザ関数getFeedを呼び出し、結果をstatus領域に表示します。getFeedの中で記事の総件数は加算され、リストには記事が累積されます。最終的に総件数が0だった場合は、有効な記事がないため、処理を中断します。
(2)結果を転記するため、事前に表示領域をクリアします(第10回のWikipediaを参照)。
(3)記事リスト(artList)に格納されたデータを表示領域に転記していきます。この際、タイトルは、URLのリンクを付けて、ハイパーリンクとして設定します。
(4)記事の表示領域を発行日時の新しい順にソートするため、Sortメソッドを実行します(表題タイトルのセルをアクティブにすることにより、アクティブセル領域が選択されます)。発行日時をキーとし、降順に、タイトル行を含んだ領域として、ソートが実行されます。
(5)ニュースの内容は文字列が多いため、ソート時に選択された(Selection)アクティブセル領域(CurrentRegion)のWrapTextプロパティにTrueを設定し、記事の格納セル全てについて、データを折り返して全体を表示させます。