• ベストアンサー

VBAでWEB上のデータを変数に代入するには?

VBAで仕事上のデータを処理するシステムを作成しており、 どうしてもWEB上のデータを変数に入れたいのですが、どのような方法が良いでしょうか? 取得したいデータは関税協会にある為替相場です。 http://www.kanzei.or.jp/check/rate_all/2012/20120318.htm 上記のページに行くとアメリカ合衆国の為替レートが81.33というのがわかります。 VBA上の変数に81.33という数値を入れる方法を教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.5

#2,#4 です。  いかにUPしましたのでダウンロード願います。  (2)のほうが処理速度は速いです。  (1) #2(Excel:クエリでWebデータを取り込む)のソース     https://box.yahoo.co.jp/guest/viewer?sid=box-l-5gyoz3775q364cwhmx2zwfjr5m-1001&uniqid=b95a35f3-307b-4636-9fa2-20caeb6851a9&viewtype=detail  (2) #4(ブラウザでサイトを開くことなく、プログラムからHTMLソースを取得する方法) EXCEL にボタンをつけてありますから・・・・ 別にExcelでなくても使用できます。     https://box.yahoo.co.jp/guest/viewer?sid=box-l-5gyoz3775q364cwhmx2zwfjr5m-1001&uniqid=3ada2b33-5481-467e-9f00-e3735b25ee1f&viewtype=detail +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>おそらく私が使い方を理解していないからだと思います 失礼ながら、ボタンを作成してマクロを動かすのもできない  というレベルだと このソースの中身の解析や  質問者さまが実現したい毎日かわるURL(為替のレート)  に対応するためのコードの作成は困難だと思います。  基礎的な技術を身につけて再度チャレンジしてみてください。

master817199
質問者

お礼

問題は自己解決できました。 多くのサンプルまで頂けて本当にわかりやすかったです。 本当にありがとうございました。

master817199
質問者

補足

ご丁寧にサンプルまで作っていただけて感激です。 ありがとうございます。 それと、私の返答の文章がおかしかったです、申し訳ありません。 ボタンを作成してマクロが作れないという意味ではなく、 ユーザーフォームにボタンを設置した場合に頂いたコードを貼り付けようとしたのですが、 うまく動かないので再度教えてくださいという意味でした。 ↓こんな感じにしたかったのです。 http://appstrading.com/gazou.JPG どちらにせよ勉強不足ではありますが、お時間があるときで結構ですので ユーザーフォームへの設置の仕方を教えていただけませんでしょうか? 何度もお願いをして大変恐縮ではありますが、よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.4

#2 です。 #2 よりも効率的なやり方が見つかりましたので実験ソースを公開します。 下記のサイトを参考にしました。<!感謝>  ◆ブラウザでサイトを開くことなく、プログラムからHTMLソースを取得する方法です。    http://www.kanaya440.com/contents/tips/vbs/007.html このソースで実験してみたところ #2にくらべて かなり高速です。 Excel でなくても使えます。 #3の方もいっているとおり、あとは URL のアドレスをどうするのかが問題ですけど。 ++++++++++++++++++++++<サンプル 実験ソース >+++++++++++++++++++ Option Explicit Const cns_URL As String = "http://www.kanzei.or.jp/check/rate_all/2012/20120318.htm" Const FindString As String = "アメリカ合衆国", FindMoney As String = "ドル(USD)" Private m_strHTML As String Private m_FindOK As Boolean Private m_Anser As String Sub DollerYen_GET_PROC() Dim arryHTML As Variant Dim row As Integer Dim I As Integer Dim strWk As String m_FindOK = False m_Anser = Empty If GetHtmlSource(cns_URL, m_strHTML, False) = False Then GoTo MSG_DollerYen_GET_PROC End If arryHTML = Split(m_strHTML, vbLf) For row = 0 To UBound(arryHTML) 'Debug.Print (arryHTML(row)) If InStr(1, arryHTML(row), FindString) > 0 Then If InStr(1, arryHTML(row + 2), FindMoney) > 0 Then m_FindOK = True strWk = "" For I = 1 To Len(arryHTML(row + 4)) strWk = Mid(arryHTML(row + 4), I, 1) If IsNumeric(strWk) Or strWk = "." Then m_Anser = m_Anser & strWk End If Next I Exit For End If End If Next row MSG_DollerYen_GET_PROC: If m_FindOK Then MsgBox "アメリカ合衆国 ドル(USD) は(" & m_Anser & "円)です。" Else MsgBox "為替(アメリカ合衆国)の値が見つかりません。", vbExclamation End If Exit_DollerYen_GET_PROC: Exit Sub End Sub '#################################################################################### '# '# 関数名:GetHtmlSource '#----------------------------------------------------------------------------------- '# 機能 :指定のURLからHTMLソースを取得する '# 引数 :strURL I URL '# strRetVal O 取得した文字列 '# isSJIS I ソースが Shift-JIS の場合 True '# strID I ドメイン認証が必要な場合のユーザーID '# strPass I ドメイン認証が必要な場合のパスワード '# 戻り値:True 正常、False 失敗 '# '#################################################################################### Private Function GetHtmlSource(ByVal strURL As String, _ ByRef strRetVal As String, _ Optional ByVal isSJIS As Boolean, _ Optional ByVal strID As String, _ Optional ByVal strPass As String) As Boolean Dim oHttp As Object 'オブジェクト変数に参照をセットします On Error Resume Next Set oHttp = CreateObject("MSXML2.XMLHTTP") If (Err.Number <> 0) Then Set oHttp = CreateObject("MSXML.XMLHTTPRequest") End If On Error GoTo 0 If oHttp Is Nothing Then MsgBox "XMLHTTP オブジェクトを作成できませんでした。", vbCritical Exit Function End If 'ドメイン認証が必要な場合 If strID <> "" Then oHttp.Open "GET", strURL, False, strID, strPass Else oHttp.Open "GET", strURL, False End If oHttp.Send '失敗した場合は関数を終了します。 If (oHttp.Status < 200 Or oHttp.Status >= 300) Then Exit Function 'ソースを格納します If isSJIS Then 'ソースが Shift-JIS の場合 strRetVal = StrConv(oHttp.responseBody, vbUnicode) Else 'ソースが Unicode の場合 strRetVal = oHttp.responseText End If 'オブジェクト変数の参照を解放します Set oHttp = Nothing '戻り値をセットします GetHtmlSource = True End Function +++++++++++++++++++++++++++++++++++++++++++++

参考URL:
http://www.kanaya440.com/contents/tips/vbs/007.html
master817199
質問者

補足

NOBNNN様 色々調べてくださったようで詳細なご回答に感謝します。 是非実行したかったのですが、まだVBAの勉強をしたばかりでして せっかく頂いたコードを活用できずにいます、、 ボタンを設置して、それを押したらドル円の値を変数に入れる形にしたかったので ボタンを設置し、上記のコードを貼り付けましたが、プロシージャー内では無効というエラーがでてしまいます。 おそらく私が使い方を理解していないからだと思います。 もうちょっと勉強してみますが、もし追加で実行に移せるアドバイスを頂けたら嬉しいです。 お手数をおかけして申し訳ありませんが、もしお時間ありましたらお願いします。

全文を見る
すると、全ての回答が全文表示されます。
  • ki-aaa
  • ベストアンサー率49% (105/213)
回答No.3

こんにちわ 81.33という数字は、今日(2012/3/18)現在のものです。 アドレス xxx.kanzei.or.jp/check/rate_all/2012/20120318.htm 日が経てばまた違った値になります。 アドレスも作り直す必要かあります。 アドレスさえ作れば、数値を持ってくるのはそんなに難しいことではないです。 なので、アドレスがどういうルールで作られているか、 またはどういう方法で入力されているかを教えてください。

全文を見る
すると、全ての回答が全文表示されます。
  • NOBNNN
  • ベストアンサー率50% (93/186)
回答No.2

先に#1 の方も答えていますが EXCELで実験してみました。 とりあえず 下記ソースをモジュールとして貼り付け、マクロを実行してみてください。 やり方は (1) http://kabu-macro.com/kouza/kabuka_shutoku/kueri.html (2) http://kabu-macro.com/kouza/kabuka_shutoku/macro_kabuka.html (3) http://www.d3.dion.ne.jp/~jkondou/excelvba/T2.htm を参考にしています。 ただ性能的には遅く、VB.NET2008 などで ご自分で別なDLL として作成したほうがいいかも 外部クラス参照でVBAからできるようにすれば可能です。 ++++++++++++++++++<サンプルソース> +++++++++++++++++++ Option Explicit Const cns_WkSheet = "_ExchengeSheet" Sub USD_Yen_GET() Dim FindFlg As Boolean: FindFlg = False Dim strAnser As String: strAnser = Empty Dim MyRange As Range Dim NowSheet As String NowSheet = ActiveSheet.Name With Worksheets.Add() .Name = cns_WkSheet End With With ThisWorkbook.Worksheets(cns_WkSheet) .Activate End With Call Exchenge_WEB_GET Set MyRange = Columns("A:B").Find(What:="アメリカ合衆国") '"アメリカ合衆国"の文字列を探す If Not (MyRange Is Nothing) Then '見つかったか? If MyRange.Offset(0, 1) = "ドル(USD)" Then 'レートの文字 "ドル(USD)"があるか? strAnser = MyRange.Offset(0, 2) FindFlg = True End If End If With ThisWorkbook.Worksheets(cns_WkSheet) Application.DisplayAlerts = False .Delete Application.DisplayAlerts = True End With ThisWorkbook.Worksheets(NowSheet).Select If FindFlg Then MsgBox "アメリカ合衆国 ドル(USD) は(" & strAnser & "円)です。" Else MsgBox "為替(アメリカ合衆国)の値が見つかりません。", vbExclamation End If End Sub Private Sub Exchenge_WEB_GET() ' ' Macro1 Macro ' マクロ記録日 : 2012/3/18 ' ' 外部データの取得 Webクエリ ' ' ActiveWorkbook.Worksheets.Add With ThisWorkbook.Worksheets(cns_WkSheet).QueryTables.Add(Connection:= _ "URL;http://www.kanzei.or.jp/check/rate_all/2012/20120318.htm", Destination:= _ Range("A1")) .Name = "20120318" .FieldNames = True .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = True .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = True .RefreshPeriod = 0 .WebSelectionType = xlEntirePage .WebFormatting = xlWebFormattingNone .WebPreFormattedTextToColumns = True .WebConsecutiveDelimitersAsOne = True .WebSingleBlockTextImport = False .WebDisableDateRecognition = False .WebDisableRedirections = False .Refresh BackgroundQuery:=False End With End Sub +++++++++++++++++++++++++++++++

全文を見る
すると、全ての回答が全文表示されます。
  • notnot
  • ベストアンサー率47% (4856/10272)
回答No.1

ExcelのVBAであれば、このあたりで調べてください。 http://www.google.co.jp/search?q=excel+web%E3%82%AF%E3%82%A8%E3%83%AA+vba Excel以外だとちょっと大変だと思います。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • NY為替相場と東京為替相場の違い

     NY為替相場と東京為替相場の違いなんですが、僕は、NY為替相場はアメリカで円をドルに交換する時に適用されるもので、東京為替相場とは日本国内でドルを円に交換する時に適用されるものだと思いますが正しいでしょうか。又又、両者のレートの違いの主な原因は関税でしょうか。教えてください。

  • VBAを用いて、ウェブからデータを取り込みたい

    エクセルVBAでウェブからデータを取り込みたいと思い、いろいろ挑戦していますが、以下のやり方(1)と(2)は失敗中です。 取り込みたいのは、ウェブページ中に描かれてある「表」の部分のデータです。 アドバイスをお願いいたします。 ◆◆◆◆◆失敗(1)◆◆◆◆◆ ActiveSheet.QueryTables.Add(Connection:="url;http://***省略***.htm", Destination:=Range("A1")) の方法の場合、取得したデータをエクセルシートに張り付けた場合に生じる文字化けがなおらず挫折・・・ QueryTableは文字コードを指定して読み込めないので困難という結論に至りました。 ちなみに目的のウェブページはshift-JISでcharsetされてますが、取得したいデータ部分はSQLサーバーでUTF-8で記述されていると思われます。 →http://okwave.jp/qa/q7864296.html ◆◆◆◆◆失敗(2)◆◆◆◆◆ ユーザーフォーム機能から、WEBブラウザーコントロールを用いて目的のウェブページを表示する方法では、表示したウェブページの情報をエクセルシートに転記する方法が分からず挫折・・・ url_report = "http://****省略.htm" WebBrowser1.Navigate url_report 'ここから先、どうすればエクセルシートにデータ取得できる? 上記(1)や(2)以外で他のやり方も含め、経験者の方のアドバイスをお願いいたします。 ウェブページ中の表データをエクセルシートにVBAで自動取得したいのですが・・・何か良い方法がありますでしょうか? ((+_+))

  • 基準化したデータより得られた回帰式に新たな説明変数を代入する際の取り扱いについて

    基準化したデータより得られた回帰式に新たな説明変数の数値を代入し、従属変数の数値を計算(予測)する際、その代入される説明変数も基準化されている必要があると思いますが、その基準化の方法はどのように行えばよいのでしょうか? 例えば、サンプル数10、従属変数1、説明変数4というデータセットがあり、全変数を基準化し回帰係数を求めたとします。 得られた回帰式を用い新しいデータの説明変数の数値を代入することにより説明変数の値を予測したいと思います。 この際、この新たなデータも基準化される必要があると思うのですが、基準化する際には回帰係数を求めるために用いた10個のサンプルより計算された各説明変数の平均及び標準偏差を用いて、基準化を行うのでしょうか? 具体的には10個のサンプルから計算された説明変数a,b,c,dの平均がそれぞれ2,4,6,8、及び標準偏差が10,20,30,40であったとします。 新たなデータの説明変数a,b,c,dの値が3,6,9,12であった場合は、それぞれ(3-2)/10, (6-4)/20, (9-6)/30, (12-8)/40の値を計算し、その数値を回帰式に代入するのでしょうか? 長くなってしまい申し訳ありませんが、どなたか詳しい方がいましたら是非教えていただきたくお願いします。

  • [VBA] CountIfに変数を使いたい

    ある数値データがA1:A100まであるとします。これをいくつかの変数に基づいて数えたい場合、どうしたらいいのでしょうか? x=1 For i = 1 To 10 Cells(i, 5) = WorksheetFunction.CountIf(Range("A1","A100),">-(x)") x=x+10 Next i のような式を作ったんですが、うまく働いてくれません。たぶん変数xが使えないからだと思いますが、他にいい方法が浮かびません。いい方法がありましたら教えてください。よろしくお願いします。

  • VBAにてVLOOKUPの検査値を変数で指定

    VBAにてVLOOKUP(検査値、範囲、列番号、検索の型)を使用する時、検査値を変数として扱いたいのですが、どのような方法が良いのでしょうか。 セルに=VLOOKUP($D$3,名簿,2,0)と入力しD3を検査値とし名簿内より2にある社員番号を取り出しているのですが、これをVBAにて実施させ、セルには式ではなく社員番号を表示させたいのです。DATAとしてはD3から下にいくつか入力されているので、検査値を変数で扱う事によりD3以降全てのDATAを取り扱うようにしたいのです。 宜しくお願いします。

  • VBA(多くの数値データの最小値5つを格納する方法)

    VBA(多くの数値データの最小値5つを格納する方法) 現在テキストファイルの数値データを取り出し最小値5つを書き出す動作をVBAで行うつもりでいます。 例  5    9    33    11    1    0.3    0.02     ・     ・     ・     ・ といった形の数値データ行がテキストファイルに存在します。 今現在すべての数値データを格納してエクセルに書き出しそれを並び替え最小値5つ(0を除く)を見て作業を行っております。 この作業をより効率化するために、VBAを用いて0を除いた最小値5つをエクセルシートに書き出すようにしたいのですが、VBAの知識が足らず対策が思い浮かびません。 ・VBAで行いたいこと(わからない部分) 格納するデータを5つに設定して、数値データを順次読み込み最終的に数値データ群の最小値5つ(0を除く)を配列に格納している状態にしたい。 初歩的かもしれませんが、ご回答お願いいたします。

  • VBAでコマンドプロンプトの結果を変数に代入

    コマンドラインソフトのffmpegを使って、動画の再生時間などを取得したいのですが VBAでコマンドプロンプトの結果を変数に代入する方法について教えてください。 "D:\xxxx\ffmpeg\bin\ffmpeg" -i "d:\xxxx\aaff.mp4" 2>&1 | grep Duration これをコマンドプロンプトで実行すると d:\xxxx\aaff.mp4の再生時間などがコマンドライン上に表示されます。 これを変数に代入するために、 http://officetanaka.net/excel/vba/tips/tips27.htm このページを参考にして Sub Sample1() Dim WSH, wExec, sCmd As String, Result As String Set WSH = CreateObject("WScript.Shell") ''(1) sCmd = """D:\xxxx\ffmpeg\bin\ffmpeg"" -i ""d:\xxxx\aaff.mp4"" 2>&1 | grep Duration" Set wExec = WSH.Exec("%ComSpec% /c " & sCmd) ''(3) Do While wExec.Status = 0 ''(4) DoEvents Loop Result = wExec.StdOut.ReadAll ''(5) MsgBox Result Set wExec = Nothing Set WSH = Nothing End Sub を実行しました。 しかしResultには何の文字列も代入されませんでした。 恐らく、このページのタイトルにもあるように「MS-DOSコマンドの標準出力を取得する」 とあるので、標準出力しか取得できないのではないかと思います。 それでは一般的なコマンドラインソフトの実行結果を変数に代入するにはどうしたら良いでしょうか?

  • VBAオブジェクト変数またはWithブロック変数

    Access VBAについてお教えください。 VBAを使用しています。下記のようなコードでDOMの値を取得しようと思っています。 If IsNull(IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText) Or _ IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText = "" Then stocker = "" Else stocker = IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText End If IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータがある場合は、 問題なくstockerに値をセットすることができます。 ただし、IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータ(要素)が なにも無い場合は、エラーが発生します。 「実行時エラー91;オブジェクト変数またはWithブロック変数が設定されていません」 IE.Document.getElementsByTagName("table").Item(1).rows(1).cells(0).innerText)にデータが無い場合は、NULLが 帰ってくるとサイトで見かけたので、IF文を使って回避しようと思いましたが、成功しませんでした。 何が悪いと考えられるでしょうか?

  • 公務員 マクロ経済学

    公務員試験のマクロ経済学をやっているのですが 日本の企業が、日本国内の設備投資を行うために保持していたアメリカ合衆国の公債を大量に売却すると国際為替市場ではドルが売られ円が買われることから為替レートは円高になる と書いてあったのですが、アメリカ合衆国の公債を大量に売却すると国際為替市場ではドルが売られ円が買われる、の部分は、アメリカの公債を売るとドルが市場に出てドル安になる、と考えているのですが円が買われるという部分が理解できません。またドル安の部分の考え方も正しいのでしょうか? 詳しくなくていいので宜しくお願いします

  • Excel VBAで読み込んだテキストから任意のデータを取得するには?

    Excel VBAで外部テキストをTextBoxに読み込み、そのテキストの中から任意の場所の数値を取得する(変数に代入する)にはどのようにしたらいいのでしょうか? 例えば、外部テキストが以下のようなかんじだったとします。 ここから--------------------- ・・・ 通勤時間A root 60 root 120 root 45 root 225 root 30 通勤時間B root 90 root 150 root 75 ・・・ ここまで--------------------- このテキストの中から通勤時間Aを検索し、その下の行にある、60,120,45,225,30という数値を変数に代入したいのです。 テキストをTextBoxに読み込む方法はわかりますが、数値の検索方法がわかりません。どうすればいいでしょうか? (テキストをTextBoxに読み込まなくても数値を検索する方法があればそちらの方法もお願いします)。

このQ&Aのポイント
  • Windows11で機種変更した後、スタートアップCD-ROMでセキュリティー対策ツールを利用しようとすると、利用できないというメッセージが表示されます。どうやって利用できるようにするか教えてください。
  • スタートアップCD-ROMを使用してセキュリティー対策ツールを利用する際に、Windows11の機種変更によって利用できないというエラーメッセージが表示されます。利用できるようにするにはどうすれば良いでしょうか。
  • スタートアップCD-ROMを使ってセキュリティー対策ツールを利用しようとすると、Windows11の機種変更により利用できないという警告が表示されます。どのようにすれば利用できるようにすることができるでしょうか。
回答を見る