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

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

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

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

1079閲覧

VBA ファイルの操作に移行できない

hk3150

総合スコア11

VBA

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

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2021/04/16 07:45

前提・実現したいこと

VBAを使用して、IEからCSVファイルを開き、
別のエクセルファイルに転記したいのですが、
CSVを開いた後、エラーになり、処理が止まってしまいます。

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

実行時エラー9 インデックスが有効範囲にありません

該当のソースコード

VBA

1#If VBA7 Then 2Private Declare PtrSafe Sub Sleep Lib "kernel32" (ByVal ms As LongPtr) 3#Else 4Private Declare Sub Sleep Lib "kernel32" (ByVal ms As Long) 5#End If 6 7Sub SQL2() 8 9 Dim objIE As InternetExplorer 10 Dim objInpTxt As HTMLInputTextElement 11 Dim objTag As Object 12 13 Set objIE = New InternetExplorerMedium 14 objIE.Visible = True 15 objIE.navigate "http://(社内イントラ)" 16 17 Do While objIE.Busy = True Or objIE.readyState <> 4 18 DoEvents 19 Loop 20 21 Set objInpTxt = objIE.document.getElementsByName("inp_param")(0) 22 objInpTxt.Value = "(社内品番)" 23 24 For Each objTag In objIE.document.getElementsByTagName("input") 25 26 If InStr(objTag.outerHTML, "データ抽出") > 0 Then 27 objTag.Click 28 29 Do While objIE.Busy = True Or objIE.readyState <> 4 30 DoEvents 31 Loop 32 Exit For 33 End If 34 Next 35 36 For Each objTag In objIE.document.getElementsByTagName("input") 37 38 If InStr(objTag.outerHTML, "ダウンロードCSV") > 0 Then 39 objTag.Click 40 Exit For 41 End If 42 Next 43 44 45 Sleep 2000 46 47 SendKeys "%O", True 48 Call numLockOn  (numlockをonにするだけの為、割愛します。) 49 50 51 Workbooks("result.csv").Activate   ←ここでエラー 52  ...etc 53 54End Sub 55

試したこと

sendkeyを使用せず、IEの通知バーを手動で「開く」ボタンを押した時は...etc以降も問題なく動作するのですが、
sendkeyを使用して、VBAで処理した際には、エラー(インデックスが有効範囲にありません)となってしまい、止まってしまいます。
エラーで停止後、デバッグを押すと、自然とファイルが開かれ、 ...etc以降の処理も進むのですが、理由が分かりません。

開くボタンを押す方法かと思い、調べたのですが、sendkey以外で良い方法が見当たりませんでした。

よろしくお願いいたします。

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

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

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

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

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

meg_

2021/04/16 11:22

ファイルを開いている途中で参照していませんか?
jinoji

2021/04/18 14:06

SendKeys のあとで二度寝したらどうでしょう。
hk3150

2021/04/18 23:41

meg_さま jinojiさま おはようございます。 ご回答ありがとうございます。 自分もそうかと思い、今しがた試してみました。 二度寝中は「セキュリティスキャンを実行中...」で止まってしまうようです。 sleep時間を長くしたら長くした分だけセキュリティスキャンも同じ時間止まってしまい、 結局同じエラーでした。。。 最悪、error処理で「デバッグ」自体もsendkeysを使い、エンターを押してしまえば先へ進めるような 気がしてきました。。。。
guest

回答2

0

sleepだとInternetExplorerのプロセスまで止まってしまうのでしょうか。
doeventsも入れれば止まらなくなるかも。という事で
試してないのでわからないのですが、ちょっと大層ですが
ファイルは自動で開くにしていると思いますので
以下のようにするとどうでしょうか。

VBA

1Dim tBook As Workbook 2Do While True 3 For Each tBook In Workbooks 4 If tBook.Name = "result.csv" Then 5 Exit Do 6 End If 7 Next 8 Sleep 1 9 DoEvents 10Loop

後は、VBAでcsvを開くとかも選択肢にあるかと思いますがどうなのでしょう

投稿2021/04/19 22:35

編集2021/04/19 23:39
xail2222

総合スコア1508

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

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

hk3150

2021/04/20 02:08

xail2222さま、こんにちは。 ご回答いただきまして、ありがとうございます(_ _) ご教示頂きましたVBAを使用させて頂きました所、ファイルが開かれず、loopしてしまっているようでございました。 本件につきましては、一度保存してしまってから、最新ファイルを読み込み事で解決できました。 またよろしくお願いいたします。
xail2222

2021/04/20 03:01

開きませんでしたか。なるほど。 お手数をかけてすみませんでした。
guest

0

ベストアンサー

sleepのところをDo Until Loop にしてFileSystemobjectでfileのFileExists メソッドでファイルが確認できるまでDoEventsをループしたらどうでしょう?

投稿2021/04/19 22:14

OfficeNono

総合スコア15

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

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

hk3150

2021/04/20 02:05

OfficeNonoさま、こんにちは。 ご回答頂きまして、ありがとうございます。 do until loopですね、一度、そのように試してみます(_ _) また、本件、別の方法で解決しました。 何を思ったのか、同様の内容を二重で登録してしまっておりました。 またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問