Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6282 / 13645 ツリー ←次へ | 前へ→

【46174】ダイアログボックスの表示が出るのを待つには Wz 07/1/25(木) 13:29 質問[未読]
【46192】Re:ダイアログボックスの表示が出るのを待... Kein 07/1/25(木) 23:23 発言[未読]
【46197】Re:ダイアログボックスの表示が出るのを待... Wz 07/1/26(金) 11:41 お礼[未読]
【46198】Re:ダイアログボックスの表示が出るのを待... Kein 07/1/26(金) 12:54 発言[未読]
【46202】Re:ダイアログボックスの表示が出るのを待... Wz 07/1/26(金) 14:18 お礼[未読]
【46193】Re:ダイアログボックスの表示が出るのを待... ichinose 07/1/26(金) 0:03 発言[未読]
【46196】Re:ダイアログボックスの表示が出るのを待... Wz 07/1/26(金) 11:39 お礼[未読]

【46174】ダイアログボックスの表示が出るのを待つ...
質問  Wz  - 07/1/25(木) 13:29 -

引用なし
パスワード
   お世話になります。

現在ネット上のホームページのボタンを押して、データを保存するマクロを作成しています。

このボタンを押した後ですが、データ量が多いため保存のダイアログボックスが出るまで少し時間がかかります。
しかもデータ量が毎回一定しないので、ダイアログボックスが出る時間も一定しません。
ここで、ダイアログボックスが出るまでマクロを待機させ、出たら再開させるようなことはできるのでしょうか?
(IE上のダイアログボックスの表示が出たのを確認できるのかどうか)

ちなみに現在はApplication.Waitで長めに設定して待機しています。
(しかしこれでは結構な時間待たされてしまいます)

ちょっと出来るのかどうか微妙な感じですが、ヒントだけでもよろしくお願いします。

【46192】Re:ダイアログボックスの表示が出るのを...
発言  Kein  - 07/1/25(木) 23:23 -

引用なし
パスワード
   >ホームページのボタンを押して
出てくるダイアログに表示されているメッセージを、すべて正確にここへ書き込む
ことは出来ませんか ? もしファイルをダウンロードするためのものなら、
Win32APIを使って、直接保存先フォルダーへ落とすコードを作ります。
そうではなく何かの情報を表示しているなら、ボタンを押した先のURL(固定でないと
難しいが)へダイレクトにNavigateして、Document.Body.InnerText などを取得
する方向で組み立てます。
そのような判断をするために、ダイアログのメッセージが手がかりになるのですが、
もし公開できるサイトならURLを提示して説明して下さい。(URLは先頭の文字を
全角にするなどの加工をしないと、この掲示板に貼り付けることが出来ません)

【46193】Re:ダイアログボックスの表示が出るのを...
発言  ichinose  - 07/1/26(金) 0:03 -

引用なし
パスワード
   ▼Wz さん:
こんばんは。

>現在ネット上のホームページのボタンを押して、データを保存するマクロを作成しています。
>
>このボタンを押した後ですが、データ量が多いため保存のダイアログボックスが出るまで少し時間がかかります。
>しかもデータ量が毎回一定しないので、ダイアログボックスが出る時間も一定しません。
>ここで、ダイアログボックスが出るまでマクロを待機させ、出たら再開させるようなことはできるのでしょうか?
>(IE上のダイアログボックスの表示が出たのを確認できるのかどうか)
>
>ちなみに現在はApplication.Waitで長めに設定して待機しています。
>(しかしこれでは結構な時間待たされてしまいます)
まず、上記の動作を起こす例としてのHPやダイアログボックスを表示するまでのコードの提示をどうしてされないのですか?
そこまでのコードの提示が見ている方にとって、参考になるコードかもしれないのに
・・・。
さらに回答投稿が付いた場合、コードがあれば投稿もしやすいし、
この投稿を見ている方が問題点から解決までの過程を再現することができます。


質問者がそういう再現性を怠ると・・・。


まず、上記の動作をするHtmの説明からしなくてはなりません。
(こういうのって、探すとないんですよね!!)

NotePadなどのテキストエディタに以下のコード

<html>
<head>
<title>Sample</title>
<script language="VBScript">
<!--
Option Explicit
Sub inputdata()
dim indata
dim idx,jdx
for idx=1 to 1000000
next
indata=Inputbox("input data")
if indata<>false then
document.getElementById("dataArea").innerText=indata
end if
End Sub
-->
</script>
</head>
<body>
<button id="myButton" onclick="inputdata()">ボタン</button>
<br>
<br>
<div id="dataArea">出力エリア</div>
</body>
</html>

をコピーして適当なフォルダにsample.htmとして作成してください。

・実行するとボタンと「出力エリア」というメッセージが表示されます
・ボタンをクリックしてください。メッセージを要求するダイアログが表示されます。
・適当に文字を入力し、OKボタンをクリックすると、入力した内容が「出力エリア」
 という箇所に上書きされます。

まっ、これだけのことをするhtmです。
中のVbscriptがネストされていませんが、コピー時のエラーを避けるために敢えて
しました。おのおのでネストはしてください。


Excel側です。

新規ブックにて、VBEにて、参照設定を行います。
「ツール」---「参照設定」にて、
「Microsoft HTML Object Library」と
「Microsoft Internet Controls」にチェックを入れてください。

Thisworkbookのモジュールに
'==========================================================
Public WithEvents idoc As HTMLDocument
'==========================================================
Private Sub idoc_onfocusout()
  ffg = True
  CreateObject("WScript.Shell").SendKeys "ichinose{ENTER}"
End Sub


標準モジュールに
'==========================================================
Public ffg As Boolean
Dim ie As InternetExplorer
'==========================================================
Sub main()
  With ThisWorkbook
   Set ie = CreateObject("InternetExplorer.Application")
   With ie
    .Visible = True
    .navigate ThisWorkbook.Path & "\sample.htm"
    Do While .Busy = True Or .readyState <> 4
      DoEvents
      Loop
    ffg = False
    Set ThisWorkbook.idoc = .document
    On Error Resume Next
    With ThisWorkbook
     .idoc.getElementById("myButton").Click
     Do While ffg = False
      DoEvents
      Loop
     Set .idoc = Nothing
     End With
    CreateObject("WScript.Shell").Popup "確認"
    On Error GoTo 0
    End With
   End With
  ie.Quit
  Set ie = Nothing
End Sub


sample.htmと同じフォルダに保存してください。


保存後に、mainを実行してください。

sample.htmを表示後、ボタンをクリックしています。
Inputbox表示後に「ichinose」と入力しています。

結果を確認してこの方法がWz さんの抱えている問題に対応できるか検討してみてください。


というように投稿する私もあまり確信が持てない方法なのにこんなに
記述しなければなりません。
本来は、この8割方の記述は、Wz さんにして頂くことだと思いますよ!!

【46196】Re:ダイアログボックスの表示が出るのを...
お礼  Wz  - 07/1/26(金) 11:39 -

引用なし
パスワード
   ▼ichinose さん:
返信ありがとうございます。
説明不足で大変申し訳ありませんでした。
HPは社内のサイトなため公開することができません。
出るダイアログは「ファイルのダウンロード」で
「開く」「保存」「キャンセル」があるものです。
そのダウンロードのダイアログが出たらマクロを再開させたいのです。

よく見かけますけど、確かに探すとなかなかないですね(汗)

それまでのコードも、ほとんどがSendKayとApplication.Waitで構成されてるので
不要かと思いまして省略してしまいました(^^;
具体的なコードは下記の通りです。

'-------------------------------------------------------------
Set objIE = CreateObject("InternetExplorer.application")
  objIE.Visible = True
  objIE.navigate "HTTP://ほにゃらら"  'URLを開く

   Application.Wait Now + TimeValue("00:00:05")

  objIE.document.all("csv").Click  'csvボタンを押す

   Application.Wait Now + TimeValue("00:02:00")

  'しばらくするとダウンロードのダイアログが出ます
'-------------------------------------------------------------

いただいたソースで試してみましたがダイアログがInputBoxだったのでちょっと違う感じです。
ただ参照設定とDoEventsのLoopで待機出来そうなので、いろいろ試してみます。

自分の説明不足で迷惑をかけてしまって本当にすいません。
丁寧な返答ありがとうございました。

【46197】Re:ダイアログボックスの表示が出るのを...
お礼  Wz  - 07/1/26(金) 11:41 -

引用なし
パスワード
   ▼Kein さん:
>>ホームページのボタンを押して
>出てくるダイアログに表示されているメッセージを、すべて正確にここへ書き込む
>ことは出来ませんか ? もしファイルをダウンロードするためのものなら、
>Win32APIを使って、直接保存先フォルダーへ落とすコードを作ります。
>そうではなく何かの情報を表示しているなら、ボタンを押した先のURL(固定でないと
>難しいが)へダイレクトにNavigateして、Document.Body.InnerText などを取得
>する方向で組み立てます。
>そのような判断をするために、ダイアログのメッセージが手がかりになるのですが、
>もし公開できるサイトならURLを提示して説明して下さい。(URLは先頭の文字を
>全角にするなどの加工をしないと、この掲示板に貼り付けることが出来ません)

返信ありがとうございます。
説明不足で申し訳ありません。
出てくるメッセージはファイルをダウンロードするためのものです。
公開できるサイトではないので、URLは提示できませんが
ごく一般的な「ファイルのダウンロード」というダイアログで
このファイルを開くか、または保存しますか?という文章で
「開く」「保存」「キャンセル」のどれかを押すやつです。

ということはWin32APIを使うということですね。
そのへんはよくわからないのですが、勉強してみたいと思います。

ちなみに直接保存先フォルダーへ落とすコードを作るということなので、
VBAにボタンを押させてSendKayで自動操作という方向性とは違いそうですね。
そこは未知の領域なのでじっくりやってみようかと思います。

ありがとうございました!

【46198】Re:ダイアログボックスの表示が出るのを...
発言  Kein  - 07/1/26(金) 12:54 -

引用なし
パスワード
   >未知の領域なのでじっくりやってみよう
理屈を言うようだけど、未知なら手かがリの一つでも知らないと
"じっくりやる"ことすら出来ないと思いますが・・。
Win32APIを使うコードのサンプルは

Declare Function URLDownloadToFile Lib "urlmon" _
  Alias "URLDownloadToFileA" (ByVal pCaller As Long, _
  ByVal szURL As String, ByVal szFileName As String, _
  ByVal dwReserved As Long, ByVal lpfnCB As Long) As Long

Sub MyFile_DL()
  Dim SaveFileName As String
  Dim DownloadFile As String
  Dim Ret     As Long

  SaveFileName = "C:\Test.htm"
  DownloadFile = "http://www.msn.co.jp/home.htm"
  Ret = URLDownloadToFile(0, DownloadFile, SaveFileName, 0, 0)
  DoEvents
  If Ret = 0 Then
    MsgBox "ダウンロードできました。"
  Else
    MsgBox "エラーが発生しました。"
  End If
End Sub

【46202】Re:ダイアログボックスの表示が出るのを...
お礼  Wz  - 07/1/26(金) 14:18 -

引用なし
パスワード
   ▼Kein さん:
なんと、簡潔なコードをありがとうございます!
すごく参考になりました。

ただ社内サイトのほうがCGIでして、直接のURLがなく
ボタンを押すことでダウンロード用CSVファイルが生成されるようです。
そのため直接URLを叩くことができないことがわかりました。

しかしながらCGIのソースをよく見てみたらボタンを押すことでPOSTメソッドで命令が送られているので
VBAでこれをURLに対して直接送ってみれば、ボタンを押したのと同じ動作になるかもしれません。

調べてみたら結構いろいろ出てきたので、もう少し深く掘り下げてみたいと思います。
貴重なヒントありがとうございました!

6282 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free