ハードコピー ゴメ
http://blog.goo.ne.jp/xmldtp/c/7b96da485e1d2f70627fb9d39fa007af
ExcelのVBAで、Domを使って、XMLを書き出す
XML / 2007-02-23 18:37:17
こういうサンプルを、このブログで、書いた気がしたけど、
見つからなかったので、書いておきます。
(まじめに探してないので、もし、あって、ダブっちゃってたらごめん)
■仕様
フォルダを選択するダイアログを出し、
指定されたフォルダの下に、test.xmlというフォルダ名で
以下の内容のXMLファイルを書き出す
<?xml version="1.0"?>
<rss version="2.0">
<channel/>
</rss>
(上記<>は、本当は半角です)
■下準備
ここのブログにあるように、参照設定をひらいたら、以下のようにMicrosoft XMLの、どれかひとつをチェックします。
■ソース
こんなかんじ
Sub Macro1()
Dim fDlg As FileDialog Dim fname As String Dim xdoc As New DOMDocument Dim xtree As IXMLDOMElement
Dim zyu As IXMLDOMElement Dim pi As IXMLDOMProcessingInstruction
'フォルダのダイアログを出す Set fDlg = Application.FileDialog(msoFileDialogFolderPicker) fDlg.InitialFileName = "C:¥"
'ファイル名決定
If (fDlg.Show = -1) Then 'OKのとき
fname = fDlg.SelectedItems(1) & "¥test.xml"
Else
fname = ""
End If
Set fDlg = Nothing
If (fname = "") Then
Exit Sub
End If
'XMLのはじまりを書く
Set pi = xdoc.createProcessingInstruction("xml", "version='1.0'")
Call xdoc.appendChild(pi)
'先頭のノード作成
Set xtree = xdoc.createElement("rss")
Call xtree.setAttribute("version", "2.0") '属性設定
Call xdoc.appendChild(xtree)
'その下のノードの作成
Set channel = xdoc.createElement("channel")
Call xtree.appendChild(channel)
'保存 xdoc.Save (fname)
End Sub
(上記 ¥ < > は、本当は半角)
■参考にしたサイト
http://www2.moug.net/bbs/exvba/20061207000017.htm
(フォルダダイアログの出し方:「あられすき」さんの)
コメント ( 0 ) | Trackback ( 0 )
ExcelマクロでXMLを読み込む方法(RSSを読み込む場合を例に)
XML / 2006-06-15 09:48:38
以前、YOU TUBEに追加された動画を、RSSから取得するためのExcelシート(マクロ)の作り方 というのを書きましたが、そこでの説明がなかったので、説明してみたいと思います。
■ExcelマクロでXMLを読み込む場合、参照設定が必要
XMLのライブラリはデフォルトでリンクされているわけではないので、参照設定で、XMLのライブラリを追加する必要があります。
XMLのライブラリは、Microsoft XMLというのなのですが、バージョンがいくつかあります。
3.0は2000,XP,2003どれも入っています。今回は、3.0をリンクすればOKです(それ以上でももちろんOKです)。追加の仕方は、上記リンク先を見てください。
■マクロの概要
マクロでやることは、以下のことです
(1)XMLファイルの読み込んで、必要なところを切り出す
(2)切り出した内容の書き出し
(3)タイマーをかけて一定時間たったら、再度メソッド実行
マクロのソースはここにありますが(文字化けしたら、シフトJISを指定してみてください)
(1)は、RSSRead()の「RSS読み込み」の部分で行っています
(2)は、writeItemでやっています
(3)は、RSSRead()の「次の時間まち処理」の部分で行っています
なお、ボタン1をクリックされると、「ボタン1_Click」にはいるように設定しています。
そこからRSSRead()に入るようになっています。
今回、(2)は、XMLとは関係ない、Excelの書き方の部分なので、今回は、(1)と(3)について説明します。
■ExcelマクロでのXMLの読み方
XMLを読んでいる部分は、こんなかんじです。
Dim xdoc As New DOMDocument Dim itemlist As IXMLDOMNodeList Dim node As IXMLDOMNode Dim url As String Dim i As Integer Dim addURL As String Dim addTitle As String
'(中略)
'/*=========================*/
'/* RSS読み込み */
'/*=========================*/
' データを取ってくる
xdoc.async = False
xdoc.Load (url) ' ここは、引数をStringに入れておかないとエラーになる
' itemタグを全員集合させる
Set itemlist = xdoc.getElementsByTagName("item")
sosa_sh.Range("C6") = "読み込み終了:" & CStr(itemlist.Length) & "件"
' 各itemに対して、書き出し
For i = 0 To itemlist.Length - 1
addURL = itemlist(i).selectSingleNode("link").nodeTypedValue
addTitle = itemlist(i).selectSingleNode("title").nodeTypedValue
Call writeItem(addURL, addTitle)
Next
一番初めに、DOMDocumentクラスの変数(ここではxdocに対して、
xdoc.async = False
と入れます。asyncにFalseが入っていると、読み込み終了後、次の処理をします。
trueだと、読み込みが終わんなくても、次の行に行ってしまいます。
なのでfalseにします。
実際読み込むのは
xdoc.Load (url)
です。
なお、urlは、ローカルのファイルでも、http://のネット上のファイルでも、どちらでもOKです。あらかじめ文字列にいれておきます(すみません、そこは省略してます。もしきになったら、リンク先のソースコードを見てください)。文字列に入れておかないと、エラーになってしまいました。
で、これで、読み込んできますので、ここで、
・レコードに該当するタグを検索して、各レコードを取得する
・レコード数分、必要な内容を取得して、書き出す
ということをします。今回のRSSの場合は、itemタグ(これが、レコードに対応するタグ)の中に入っている、linkとtitle(という項目)を取り出したいので、、
・getElementsByTagNameで、itemを指定し、レコードに相当するノードのリストを取得します。
で、レコード数分=ノートリストの個数分、
・必要な内容である、linkとtitleを取り出しwriteItemで書き出します。
このとき、getElementsByTagNameはノードに対して、使えなかったので、selectSingleNodeを使ってます。また、値の取得は、nodeTypedValueでやってます(他にも、取り出し方はありますが)。
■時間まち処理
時間まち処理をしている部分は、こんなかんじです。
Call Application.OnTime(Now + TimeValue("00:" & Format("99", intv) & ":00"), "RSSRead")
Application.OnTime(時間,呼び出す関数)で、その時間が来ると、「呼び出す関数」を呼び出します。今回は、繰り返したいので、自分の関数を呼び出してます。
ちなみに。。。 Call Application.OnTime(Now,次の呼び出す関数)とやると、その関数を産後まで終了した後、すぐに「次の呼び出す関数」を呼び出します。
と、説明は、こんなかんじとなります。
コメント ( 0 ) | Trackback ( 0 )
