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

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

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

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

Q&A

2回答

2651閲覧

VBAでajaxを実行し、responseをVBA上で使用したい

Zoohomi

総合スコア26

VB

VB(ビジュアルベーシック)はマイクロソフトによってつくられたオブジェクト指向プログラミング言語のひとつで、同社のQuickBASICが拡張されたものです。VB6の進化版といわれています。

VBA

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

JSON

JSON(JavaScript Object Notation)は軽量なデータ記述言語の1つである。構文はJavaScriptをベースとしていますが、JavaScriptに限定されたものではなく、様々なソフトウェアやプログラミング言語間におけるデータの受け渡しが行えるように設計されています。

Ajax

Ajaxとは、Webブラウザ内で搭載されているJavaScriptのHTTP通信機能を使って非同期通信を利用し、インターフェイスの構築などを行う技術の総称です。XMLドキュメントを指定したURLから読み込み、画面描画やユーザの操作などと並行してサーバと非同期に通信するWebアプリケーションを実現することができます。

0グッド

1クリップ

投稿2017/07/11 15:33

編集2022/03/19 21:59

あるウェブサイトのjsファイル内で、以下のコードが実行されます。

JavaScript

1 var param = new Array(); 2 param[param.length] = new param("key", 'abc'); 3 $.ajax({ 4 url: 'getKeyword', 5 type: "POST", 6 data: param, 7 success: function (response) { 8 if (!response.startsWith("null") && response.length > 0) { 9 // responseをオブジェクトに変換 10 var data = $.parseJSON(response); 11 //dataが目的のデータ。この時点でobject(array)となり、data[0~n]でキーワードを参照できます。 12 } 13 }, 14 error: function (e) { 15 //例外処理 16 } 17 });

このurl:getKeywordをVBA上から実行し、var data をVBA上コレクションなどに格納し、使用ことは可能でしょうか?
ご教授の程お願いいたしますm(_ _)m

<追記①>
http://piyopiyocs.blog115.fc2.com/blog-entry-433.html
で紹介されている方法を試しましたが、405エラーが出てしまいます。

vba

1 Private Sub CommandButton1_Click() 2 '----------------- 3 'リクエスト生成 4 '----------------- 5 'URL(必要に応じて変更) 6 Dim url As String 7 url = "https://example.com/getKeyword" 8 9 'パラメータ(必要に応じて動的に生成) 10 Dim paramStr As String 11 paramStr = "key=abc" 12 13 '-------------- 14 'POST実行 15 '-------------- 16 Dim xmlhttp As Object 17 Set xmlhttp = CreateObject("msxml2.xmlhttp") 18 xmlhttp.Open "POST", url, True 19 xmlhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded" 20 xmlhttp.send (paramStr) 'パラメータをぽいっちょと 21 22 '-------------- 23 '応答取得 24 '-------------- 25 Dim retCd As String 26 retCd = xmlhttp.Status 'ここでretCdに405が代入されます。 27 28 If retCd <> 200 Then 29 Debug.Print "error:" & retCd ' error:405 が出力されます 30 Else 31 Dim retHtml As String 32 retHtml = StrConv(xmlhttp.responseBody, vbUnicode, 1041) '結果HTML取得 33 Debug.Print retHtml 34 End If 35 End Sub

コメントにもある通り、error:405が出力されます。
この方法では取得不可能なのでしょうか・・?

<さらに追記②>
VBAから、実際に上記のajaxが呼び出されているページにnavigateで遷移してから、以下のコードを実行しました。

vba

1 Dim sb As New StringBuilder '自作のクラスです。他の言語のStringBuilderと同一の機能を持っています 2 3 sb.Add ("javascript:") 4 5 sb.Add (" function KeywordAlert(key) { ") 6 sb.Add (" var param= new Array(); ") 7 sb.Add (" param[param.length] = new param(""key"", key); ") 8 sb.Add (" $.ajax({ ") 9 sb.Add (" url: 'getKeyword', ") 10 sb.Add (" type: ""POST"", ") 11 sb.Add (" data: param, ") 12 sb.Add (" success: function (response) { ") 13 sb.Add (" if (!response.startsWith(""null"") && response.length > 0) { ") 14 ' responseが存在した場合、表示 15 sb.Add (" alert($.parseJSON(response)); ") 16 sb.Add (" } ") 17 sb.Add (" }, ") 18 sb.Add (" error: function (e) { ") 19 sb.Add (" //例外処理 ") 20 sb.Add (" } ") 21 sb.Add (" }); ") 22 sb.Add (" }; ") 23 ' キーワードをアラート 24 sb.Add (" KeywordAlert('abc'); ") 25 26 ' 実行 27 objIE.navigate sb.Text 28

このコードで、目的の文字列がアラートできました!
問題は、このアラートした文字列を、VBAの変数かなにかに突っ込むなどして、VBAで使用したいのですが、方法はありますでしょうか?
そもそも、navigateからjavascriptを実行する方法では連携不可能でしょうか?

ご教授のほど、宜しくお願いいたします。

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

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

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

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

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

guest

回答2

0

単純にサーバーのログ・405返却の仕様を確認するのがよいと思います。
想像ですが、user-agentなどのrequestヘッダーの情報不足で弾いているのでは?と思います。

投稿2022/03/19 12:59

mikix

総合スコア8

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

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

0

こういうことがしたいということですか。
Excel VBAで、REST(JSON)データ取得

投稿2017/07/12 01:07

workaholist

総合スコア559

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

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

Zoohomi

2017/07/12 20:46

ご回答ありがとうございます。 <追記①>のソースは、そのURLを参考にさせて頂きましたが、VBA上から行うと405エラーが返ってきます。 なぜでしょうか・・・。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問