- 締切済み
異なるフォルダのファイルを順番に開く
office2016 今、異なる5つのフォルダでタスクスケジューラにてファイルを開いて実行しているのですが、たまにエラーで停止してしまいます。原因は、1つ目のファイルの処理が終了しないのに2つ目のファイルが起動されたことによるもの?と想定しています。タスクスケジューラの実行時間をずらしても解決はできそうなのですが、もっと確実な方法で対処したく。 5つのファイルは、それぞれ、ファイルが開かれたらoracleからマスターデータを取得して、ある処理実行したらサーブして終了、ファイルを閉じる という構成になっています。 5つのファイルは下記のマクロで構成しています。 Private Sub Workbook_Open() ’いろんな処理 ThisWorkbook.Close End Sub ファイル名が同じものがある関係で、 1つ目のファイルを開き、実行して閉じられたら 2つ目のファイルを開き、実行して閉じられたら 3つ目… という風に順番に実行する様な構成にしたく、とりあえず2つのファイルを順番に起動するマクロを検討しました。 file_open1が1つ目のファイルを開くマクロ file_open2が2つ目のファイルを開くマクロ なのですが、1つ目のファイルが開いて閉じるところまでは動作しますが、2つ目のファイルが開きません。 2つ目のファイルを開く条件、 OpenCheck = 0 And Workbooks("ファイルオープン.xlsm").Worksheets("sheet1").Range("A1") = 1 でA1セルには1が設定されていて、Debug.Print OpenCheckの結果も0になってます。なぜ2つ目のファイルが起動されないのかの原因と、もっとシンプルに起動可能な構成があれば教えていただきたく。 Sub file_open1() Path = "\\A" Workbooks.Open (Path & "\" & "a.xlsm") Workbooks("ファイルオープン.xlsm").Worksheets("sheet1").Range("A1") = 1 Dim wbName As String Dim OpenCheck As Boolean wbName = "a.xlsm" OpenCheck = call_BookOpenCheck(wbName) ' If OpenCheck = 0 And Workbooks("ファイルオープン.xlsm").Worksheets("sheet1").Range("A1") = 1 Then file_open2 Else End If Debug.Print OpenCheck End Sub Sub file_open2() Workbooks("ファイルオープン.xlsm").Worksheets("sheet1").Range("A2") = 1 ' Dim wbName As String Dim OpenCheck As Boolean wbName = "b.xlsm" OpenCheck = call_BookOpenCheck(wbName) Path = "\\B" Workbooks.Open (Path & "\" & "b.xlsm") Debug.Print OpenCheck End Sub Public Function call_BookOpenCheck(wbName As String) As Boolean Dim temp As Workbook '■■ブックが開いていない状態として保存 call_BookOpenCheck = False For Each temp In Workbooks '■■指定されたブックが開いているかチェックする If temp.Name = wbName Then '■■■指定されたブックが開いていればTrueでFunctionを抜ける call_BookOpenCheck = True Exit Function End If Next temp End Function 5つのフォルダとフィル名は下記の様な感じです。 フォルダ ファイル名 1 A a 2 B b 3 C a 4 D d 5 E e
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- masnoske
- ベストアンサー率35% (67/190)
> 1つ目のファイルを開き、実行して閉じられたら 閉じられるまでの間ループで待機する必要があるのでは?
- kkkkkm
- ベストアンサー率66% (1734/2604)
No1の追加です。 あと ファイルオープン.xlsmが次々にファイルを開くためのマクロのあるブックだとしたら Workbooks("ファイルオープン.xlsm").Worksheets("sheet1").Range("A1") = 1 は それぞれのブックの Private Sub Workbook_Open() ’いろんな処理 ここに入れておくか ThisWorkbook.Close End Sub もしくは Private Sub Workbook_BeforeClose(Cancel As Boolean) イベントに記載します。 ファイルオープン.xlsmのsheet1の Private Sub Worksheet_Change(ByVal Target As Range) のイベントで次のファイルを開くようにしておくとかはいかがでしょう。 1秒ほど待って開くようにしておくと安全な気もします。
お礼
回答ありがとうございます。 提案いただいた内容でいろいろやってみたのですが、まだ完成していません。 時間切れなので、またいろいろ検討してみます。
- kkkkkm
- ベストアンサー率66% (1734/2604)
同じファイル名が連続して開くような感じではなさそうなので Private Sub Workbook_Open() で ’いろんな処理 の前にThisWorkbook以外のブック(もしくはひとつ前に開いたブック)が開いていないかどうか1秒間隔程度で調べるループを実行してThisWorkbook以外のブックが開いていない状態になったときに「いろんな処理を」を実行するようにすればいかがでしょう。
お礼
回答ありがとうございます。 ”閉じられるまでの間ループで待機する必要” これがヒントになりました。 いろいろやってみたのですが、まだ完成していません。 ヒントをてがかりにやってみます。