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

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

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

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

Q&A

2回答

1578閲覧

VBA IE制御でファイル選択ダイアログにファイルパス入力

toshikii

総合スコア10

VBA

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

0グッド

1クリップ

投稿2018/12/22 13:18

前提・実現したいこと

VBA IE制御でファイル選択ダイアログにファイルパス入力したいのですが、ファイル選択ダイアログを表示させるところまではできるのですがファイル選択ダイアログを開いてからエラーもでることなく処理が止まってしまいます。
1.VBAからIEでページを開く
2.クリックボードに画像パスをコピー
3.画像選択ダイアログボックスを開くために、所定の箇所をクリック
4:開いたダイアログボックスにSendkeys でCtrl+v してクリックボードから画像パスを入力
5:SendKeys "%o", でファイル選択ダイアログの開くをクリック
6:処理終了
3までは動きますが3の処理から止まってしまいます。
4以降の処理ができません。

発生している問題・エラーメッセージ

エラーメッセージ なし

該当のソースコード

#If VBA7 Then Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) #Else Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) #End If Sub otamart() Dim objIE As InternetExplorer 'IEオブジェクトを準備 Set objIE = CreateObject("Internetexplorer.Application") '新しいIEオブジェクトを作成してセット Dim CB As New DataObject objIE.Visible = True 'IEを表示 Dim gazou As String gazou = "画像パス" Dim strUrl As String '次ページのURL strUrl = "https://webapp.otamart.com/sell" With CB 'クリックボードにコピー .SetText gazou .PutInClipboard End With objIE.navigate strUrl 'IEでURLを開く Do While objIE.Busy = True Or objIE.readyState < READYSTATE_COMPLETE '読み込み待ち DoEvents Loop Sleep (3000) objIE.document.getElementsByName("picture00")(0).Click Sleep (1000) SendKeys "^v", True SendKeys "%o", True End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

windows10 Excel 2013

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

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

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

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

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

guest

回答2

0

VBAのSendkeyメソッドは安定しないので、あまり使わない方がいいです。
ここは、発想を転換し、指定のurlの画像を一気に保存していまう方法にしてはどうでしょうか?
パソコンに保存してしまえば、その後は、自由自在に扱えると思います。
Windows APIを多用してしまいますが、悪くない方法だと思います。

VBA

1Option Explicit 2 3Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias _ 4 "URLDownloadToFileA" (ByVal pCaller As LongPtr, _ 5 ByVal szURL As String, _ 6 ByVal szFileName As String, _ 7 ByVal dwReserved As LongPtr, _ 8 ByVal lpfnCB As LongPtr) As LongPtr 9 10Declare PtrSafe Function DeleteUrlCacheEntry Lib "wininet" _ 11 Alias "DeleteUrlCacheEntryA" (ByVal lpszUrlName As String) As LongPtr 12 13Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) 14 15 16Sub ieCheck(objIE As InternetExplorer) 17 Dim timeOut As Date 18 19 '完全にページが表示されるまで待機する 20 timeOut = Now + TimeSerial(0, 0, 20) 21 22 Do While objIE.Busy = True Or objIE.readyState <> 4 23 DoEvents 24 Sleep 1 25 If Now > timeOut Then 26 objIE.Refresh 27 timeOut = Now + TimeSerial(0, 0, 20) 28 End If 29 Loop 30 31 timeOut = Now + TimeSerial(0, 0, 20) 32 33 Do While objIE.document.readyState <> "complete" 34 DoEvents 35 Sleep 1 36 If Now > timeOut Then 37 objIE.Refresh 38 timeOut = Now + TimeSerial(0, 0, 20) 39 End If 40 Loop 41 42End Sub 43 44Sub ieView(objIE As InternetExplorer, _ 45 urlName As String, _ 46 Optional viewFlg As Boolean = True, _ 47 Optional ieTop As Integer = 0, _ 48 Optional ieLeft As Integer = 0, _ 49 Optional ieWidth As Integer = 600, _ 50 Optional ieHeight As Integer = 800) 51 52 'IE(InternetExplorer)のオブジェクトを作成する 53 Set objIE = CreateObject("InternetExplorer.Application") 54 55 With objIE 56 57 'IE(InternetExplorer)を表示・非表示 58 .Visible = viewFlg 59 60 .Top = ieTop 'Y位置 61 .Left = ieLeft 'X位置 62 .Width = ieWidth '幅 63 .Height = ieHeight '高さ 64 65 '指定したURLのページを表示する 66 .navigate urlName 67 68 End With 69 70 'IE(InternetExplorer)が完全表示されるまで待機 71 Call ieCheck(objIE) 72 73End Sub 74 75 76 77Sub sample01() 78 79 Dim objIE As InternetExplorer 80 Dim imgURL As String, fileName As String, savePath As String 81 Dim cacheDel As LongPtr, result As LongPtr 82 Dim i As Long 83 Dim strFolderText As String 84 Dim sw As Object, myPath As Object 85 86 87 Set sw = CreateObject("Shell.Application") 88 Set myPath = sw.BrowseForFolder(&O0, "フォルダを選んでください", &H1 + &H10, "C:\") 89 If Not myPath Is Nothing Then 90 strFolderText = myPath.Items.Item.Path 91 Else 92 Set sw = Nothing 93 Set myPath = Nothing 94 Exit Sub 95 End If 96 Set sw = Nothing 97 Set myPath = Nothing 98 99 100 Call ieView(objIE, "https://transit.yahoo.co.jp/", False, 300, 300, 1800, 1200) 101 102 103 For i = 1 To objIE.document.images.Length 104 105 '画像URL取得 106 imgURL = objIE.document.images(i - 1).src 107 108 '画像ファイル名 109 fileName = Mid(imgURL, InStrRev(imgURL, "/") + 1) 110 111 '画像保存先(+画像ファイル名) 112 savePath = strFolderText & "\" & fileName 113 Debug.Print savePath 114 115 'キャッシュクリア 116 cacheDel = DeleteUrlCacheEntry(imgURL) 117 118 '画像ダウンロード 119 result = URLDownloadToFile(0, imgURL, savePath, 0, 0) 120 121 Next i 122 123 objIE.Quit 124 125 MsgBox "画像を指定のフォルダにダウンロードしました。" 126 127End Sub

投稿2018/12/24 09:11

kai_keitai

総合スコア344

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

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

0

SendKeysが不安定な場合、Wscript.Shell を使うほうがよいです。

VBA

1With CreateObject("Wscript.Shell") 2 '「Ctrl」+「v」を送信 3 .SendKeys "^v", True 4 5 DoEvents: Sleep 500: DoEvents 6 7 '「Alt」+「o」を送信 8 .SendKeys "%o", True 9End With

投稿2018/12/22 14:20

TanakaHiroaki

総合スコア1063

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

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

TanakaHiroaki

2018/12/23 01:08 編集

難易度が高いですが、Win APIを使用する別解もあります。 ファイル選択ダイアログのウィンドウハンドルを取得し、 ”SendMessage”で操作するとアクティブウィンドウ以外に メッセージを送ることが出来るので確実です。 http://rabbitfoot.xyz/file-dialog-autmation/
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問