• ベストアンサー

VBAでのwebservice関数の更新方法

エクセルにてwebservice関数を使って、定期的に情報を更新したいと思っています。 VBAでESCを押すまで無限ループを回して、定期的(例えばsleepで5秒寝かせるなど)にwebservice関数を実行したいと思っています。 しかし、シートの再計算などをさせてもwebservice関数の内容が更新される気配がありません。 webservice関数をVBAからの指示で再実行させる方法があれば教えてください。

  • heth
  • お礼率88% (108/122)

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

  • ベストアンサー
  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.5

> webservice関数が参照しているURLが格納されているセルを上書きは繰り返してみましたが、webservice関数で取得される値は更新されないようです。 となると、VBAの中で関数を実行してセルに代入してみてはいかがでしょう。 Range("A1").Value = WorksheetFunction.WebService("URL")

heth
質問者

お礼

ありがとうございます。 たしかに、それでも出来るかもしれないと思いました! ただ、先に下の方法で出来てしまったので、次に困ったときに使用させてもらいます。 先ほどは、webservice関数が参照するURLが格納されているセルを更新していたけど、再読み込みされなかった ↓ webservice関数が入っているセル自体をコピペすると再読み込みされた。 たとえば、 A1に「=WEBSERVICE("B1")」と入れていたなら、 B1を更新するのではなく、 A1をA2にコピーすると、A2に結果が返ってくる という感じです。 皆さんの回答助かりましたが、2回回答くれたkkkkmさんをベストアンサーにさせてもらいます。

その他の回答 (3)

  • Nobu-W
  • ベストアンサー率39% (725/1832)
回答No.4

https://ncode.syosetu.com/n5084ej/57/ こんな手法もあるみたいですが・・・応用できません?

heth
質問者

お礼

ありがとうございます。 その記事の最初の方を読んで、webservice関数が入ったセルをコピーしてみたら?と思ってやってみたら、できました。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

URLを記載しているセルを上書きしてみればいかがですか。

heth
質問者

お礼

ありがとうございます。 webservice関数が参照しているURLが格納されているセルを上書きは繰り返してみましたが、webservice関数で取得される値は更新されないようです。

回答No.2

それっぽいのを見つけたので紹介だけだが、解決策は、 > 特定のキーを押下したら、マクロを起動させる https://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1330678118 と、 > VBAで一定間隔での繰り返し処置を実装 https://tech-draft.net/programming/vba-ontimer/ を改造・組み合わせだろうね。

heth
質問者

お礼

ありがとうございます。 繰り返しループを作る目的では、「onTimeメソッド」は、無限ループよりも良さそうでした。 ただ、キー押下でマクロ軌道じゃなくて、四角い図形にマクロ登録してボタン化しているので、起動はこちらを使おうと思います。 一番の問題は、ループの中で、webservice関数から戻ってくる値が更新されないことです。

関連するQ&A

  • VBAでの複素数関数

    複素数の関数を使い計算処理を行っているのですが、VBAの複素数関数処理がかなり遅い(計算処理を行う個所が非常に多く、何度もループし、VBA関数を呼び出しています。)ので、スピードを上げる方法をどなたかご存知であれば、教えていただきたいのです。 よろしくお願い致します。

  • Find系メソッド、Findメソッドに相当するワークシート関数または、VBA関数は?

    Excelのワークシート関数または、VBA関数で、DAOのFind系メソッドやADOのFindメソッドに相当する機能はありますか? (Forループで回せば似たようなことはできるのですが、非効率なので・・・) # 表計算とRDBは別物ってツッコミはなしということで。(^^;

  • プログラムで関数は使わない方が速くなる?

    大きなプログラムを書く際、プログラムの見通しが良くなり、後から修正しやすくするため、 同じ計算が複数回出る際には関数を多用したものを作成してきました。 ところが、プログラムの計算速度を上げたいと思い、計算時間を比較してみたところ、 関数を使わない方が圧倒的に速くなることが分かりました。 Matlabを使って、 for j = 1:100000 for i = 1:1000 y = i*i * j *j; end end の計算を行った際の計算時間と、ループ内の計算を関数で置き換えた for j = 1:100000 for i = 1:1000 y = zikan_sokutei_function ( i, j ); end end function [ kei ] = zikan_sokutei_function ( i, j ) kei = i * i * j * j; end の計算を行った時間は、 それぞれ、0.5秒と1分7.3秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が実に135倍も増大したということです。 上記と同じプログラムを使ってVBAで比較したところ、 それぞれ、8.29秒と20.70秒、という結果になりました。 つまり関数で置き換えたことで、計算時間が2.5倍も増大したということです。 また、関数を使わない場合には、Matlabが最速で、関数を使う場合にはVBAが最速であるという結果になっています。 これは関数を全く使わない方が、圧倒的に高速に計算を実行できるという結果になっていますが、 こういうものなのでしょうか? 2倍程度なら許容範囲ですが、100倍以上も遅くなるのであれば、 関数は全く使うべきではない、ということになりますが、なぜこれほどまでに時間がかかるのでしょうか? Matlabの方がVBAよりも数値計算に適しているため、VBAよりも実行速度は速くなるべきだと思いますが 関数を使った場合には、これが逆転してしまうという、かなり腑に落ちない結果となりましたが、 こういうものなのでしょうか?

  • VBA 再実行

    エクセルVBAでループによる以下のような定期実行を行っています。 >1時間に一度株価のデータを取りに行きます。 >データ取得後、他のPCに(VBAでソフトを起動させて)アップロードします。 *このアップロードの時に、ソフトが別の処理をしていると起動しません。 VBAで起動はさせるものの、ソフトが実行しないという状態になります。 そこで、一度行った処理を時間をおいて再度実行させたいのです。 できれば、30秒後と1分後に2回再実行するというようにしたいと思っています。 どなたか、お力添え頂けませんか

  • エクセルVBAでms単位でのタイマ(wait)

    エクセルVBAで制御をやりたいと思っています。 描画を切ったらそれなりの実行速度が出るのは確認済みなのですが、実行環境のスペックによってかなりばらつきがあるので、ちゃんとしたタイマを実装したいと思っています。 秒単位のスリープ的なものは検索して何件か見つけたのですが、ms単位でのwaitは見つかりません。 何かいい方法をご存じないでしょうか。 PS: 多重ループを毎回はさんで負荷をかけて実行速度を下げるやりかただと、環境依存が強すぎました。 Pentium4でちょうどいいのウェイトに使ってた関数がcore i7だと瞬殺だったりで、これは使えないなと。

  • VBAでVLOOKUP関数のように動作させたい

    VBA初心者の者です。 勉強として、VBAでVLOOKUPのよう作動させてみようと思い、以下のようにコードを書きました。 Sub 試験() Dim i As Integer, mx As Integer mx = 2 For i = 2 To 10 If Worksheets("Sheet2").Cells(mx, 1) = Worksheets("Sheet1").Cells(i, 1) Then Worksheets("Sheet2").Cells(mx, 2).Value = Worksheets("Sheet1").Cells(i, 2).Value mx = mx + 1 Else Worksheets("Sheet2").Cells(mx, 2).Value = 0 mx = mx + 1 End If Next i End Sub ※sheet1が参照範囲、sheet2が検索値です。 これを実行させたところ問題にきづきました。 sheet1の参照範囲がループによって1ずつ増加していく点です。 (ループ一周目の参照範囲 A2~A10) (ループ二週目の参照範囲 A3~A10) 上記のように参照範囲を1ずつ増加させず、常に sheet1 のA2からA10 まで 参照させたいのですが、どのようにすればよいのでしょうか? ワークシート関数は使わない方向で考えています。 アドバイスお願い致します。

  • VBAでデータ更新作業自動化

    エクセルで、シート1に顧客データ(会員番号、氏名、住所等)が有り、シート2の入力セルに会員番号を入力すると、シート1の顧客データがVLOOKUP関数により呼び出されるというエクセルファイルがあります。シート1の顧客データは、別システムでデータ更新しており、USBメモリにCSVファイルとして定期的に抽出しています。このCSVファイルのシート1の最新顧客データを元のエクセルファイルのシート1にすべてコピー&ペーストすることで最新の顧客データを更新しています。 このたび、その作業の自動化を図るにあたり、元のエクセルファイルのシート2で作成したボタンを押下することにより、自動実行したいのです。 お忙しいところ大変申し訳ないですが、そのような他ファイルに及ぶVBAの記述を教えていただけたらありがたいです。よろしくお願いします。

  • countif/sumifのようなVBA関数

    こんにちは エクセルVBAで配列aをワークシート関数countifで計算したいのですが、できないようです。代わりになるVBA関数はないでしょうか?もしくは、代替可能な方法はないでしょうか?sumifの代わりもご教示ください! よろしくお願いします。 --------------- a(0)=1 a(1)=10 a(2)=100 msgbox worksheetfunction.countif(a,">50") 'ここでエラーとなる。 -- エクセル2003

  • VBA オートフィルタの自動更新

    ご教示お願いします。 セルB2~B100まで数値が入っています。 この数値をオートフィルタにて、2秒間隔で降順に並べ変えるということをVBAで実行したいです(2秒間隔でVBAを実行させたい)。 ※セルB2~B100の数値を変化させている為、オートフィルタにて随時更新する必要があるので、2秒間隔で降順に並べ変えたいという意図です。

  • VBAユーザー関数を外部から制御

    ExcelのVBAで、標準モジュールにワークシートで使うユーザー関数を記述しています。 ユーザー関数は、使い勝手を組み込みのワークシート関数と同様にするため、 Application.Volatile (True) で自動再計算するようにしており、数百カ所以上のセルに使用しています。 しかし、他のVBAモジュールでユーザー関数の戻り値が変わるような操作をすると、その都度 数百か所以上が再計算されるため、非常に時間がかかります。 ユーザー関数のApplication.Volatile (False) にすると瞬間で終了する処理が、数分かかる場合も あります。 他のVBAモジュールから、一時的にユーザー関数の処理内容を変更するようなことは可能でしょうか。

専門家に質問してみよう