質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

1回答

3573閲覧

VBAによるYahoo!Web APIで<ResultSet部分の取込み方法教えてください。

kakeru

総合スコア63

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/12/04 09:29

編集2015/12/05 22:33

下記をエクセルVBVで動かしてます。

vba

1 2 3Function getTitleFromISBN2(ISBN As String) As String 4 Dim xml, result As Object 5 Dim url, status As String 6 Dim xlmtxt As String 7 8 url = "http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch?appid=*****************************&isbn=" & ISBN 9 10 11 12 13 Set xml = CreateObject("Microsoft.XMLDOM") 14 xml.async = False 15 xml.Load (url) 16 17 18' Set result = xml.SelectSingleNode("/ResultSet") 19 20 21' If result.SelectSingleNode("totalResultsAvailable").nodeTypedValue = 0 Then '検索件数0なら 22' getTitleFromISBN = "該当なし" 23' Exit Function 24' End If 25 26 Set result = xml.SelectSingleNode("/ResultSet/Result/Hit") 27 getTitleFromISBN2 = result.SelectSingleNode("Name").nodeTypedValue 28 29 30 31 32End Function

ahoo!Web APIからは

xml

1 2 3<?xml version="1.0" encoding="UTF-8"?> 4 5-<ResultSet firstResultPosition="1" totalResultsReturned="1" totalResultsAvailable="11" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="urn:yahoo:jp:itemSearch" xsi:schemaLocation="urn:yahoo:jp:itemSearch http://shopping.yahooapis.jp/ShoppingWebService/V1/itemSearch.xsd"> 6 7(function() {window.klTabId_kis='ie_2852_0x4b58d38';})();(function () { var klTabIdEventName = "klTabId_kis"; if (document.createEvent) { var fireEvent = document.createEvent("Event"); fireEvent.initEvent(klTabIdEventName, true, true); window.dispatchEvent(fireEvent); } else if (document.createEventObject) { // Due to ie8 limitations (it doesn't support user custom events) // we use document.documentElement.klTabId_%PRODUCT% attribute for custom event emulation. // Incrementing this attribute emits 'propertychange' event, // for supporting ie8 you should attach 'propertychange' handler on document.documentElement // and skip all calls except then event.propertyName == klTabIdEventName if (document.documentElement[klTabIdEventName]) { document.documentElement[klTabIdEventName] = 1; } else { document.documentElement[klTabIdEventName]++; } } })(); 8 9-<Result> 10 11 12-<Request> 13 14<Query/> 15 16</Request> 17 18<Modules/> 19 20 21-<Hit index="1"> 22 23<Name>ブライトンネット VAIOデジタイザースタイラスペン替え芯 BM-VDTSIN/S</Name> 24 25<Description/> 26 27<Headline/> 28以下略

見たいに帰ってきます。
Nameは

Set result = xml.SelectSingleNode("/ResultSet/Result/Hit") getTitleFromISBN2 = result.SelectSingleNode("Name").nodeTypedValue

でとれるのですが

-<ResultSet firstResultPosition="1" totalResultsReturned="1" totalResultsAvailable="11"

部分のfirstResultPosition等の値を取り込む方法が判りません。
教えて頂けないでしょうか。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

getAttributeで取れませんでしたっけ?

投稿2015/12/04 10:05

dojikko

総合スコア3939

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

kakeru

2015/12/04 10:40

```VBA Set result = xml.SelectSingleNode("/ResultSet") test_firstResultPosition = resul.getAttribute("firstResultPosition") MsgBox (test_firstResultPosition) コード ``` を追加して見ましたが、2行目でVBAが終了してしまいました。
dojikko

2015/12/04 20:23

取りたいのはElementのAttributeですよね? Dim Pos For Each e In [XMLDocument].getElementsByTagName("ResultSet")   Pos = e.getAttribute("firstResultPosition") Next コードがあってるか?ですが とりあえずステップ実行で何に何が入っているのかを確認しながらやってみてください
kakeru

2015/12/05 08:00

有難うございます。 1回しかループしませんでしたがPosに望みのデータが入りました。 1個しか無いと判ってれば、For Each以外の方法有りますか、有りましたらご教授願います。
kakeru

2015/12/07 07:55

dojikkoさん有難うございました。 1回しか無い場合は下記で行ける事が判りましたので、完了といたします。 Set e = xml.getElementsByTagName("ResultSet")(0) Pos = e.getAttribute("totalResultsAvailable")
dojikko

2015/12/07 08:29

そのコードは、本当に1件必ずあると保証されているんならいいですが、なんらかの原因でElementが取れなかった時にエラーになってしまうので、決め打ちは良くないです 無駄なループに見えるかもしれませんが、0件でもエラーにならないのがForEachで処理することのメリットだと思いますので..
kakeru

2015/12/07 09:01 編集

有難うございます。 今回のYahoo!Web APIは検索結果の件数を返すのでどんな場合も1件だけ発生しますが、条件によって出ない場合が有る時はForEachで処理すべきなんですね。 ソート済で1番目がほしい時は For Each e In [XMLDocument].getElementsByTagName("ResultSet")   Pos = e.getAttribute("firstResultPosition")   Exit For Next になりますね、For Next の使い方からすればおかしな構文ですがエラー対策上必要て事ですね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問