高校三年生の合唱祭で何を歌いましたか?

こんにちは。
Dir関数を使用して、マクロ実行用ブックの存在するフォルダ内の他ブック(xls、xlsx)を
1個ずつ開く→内容の一部をコピー→別ブックでcsv保存
という動作をループで行いたいのですが、ひとつのブックが完了した後処理が次のブックへ移らず、最初のブックに対して永遠に同じ処理を繰り返してしまい困っております。
例)
A.xls B.xls  C.xlsというブックが存在するフォルダに対し処理を行った時、A.csv、B.csv、C.csvというファイルが生成してほしいのだが、A.csv、A.csv(2)、A.csv(3)……と同じブックのCSVが永遠に生成されてしまう。

各ブック上での処理マクロ自体は動作が完了しており、個別のブックに直接マクロを記述し実行すると問題なくcsvが生成されてくれるのですが、複数ブックに対し…の方がうまくいきません。
解決についてご教授頂ける方、ぜひご回答頂けましたら幸いです。
下記にループ部分のみのコードを記載させて頂きます。(不足があるかもしれないのですが、各ブック用のマクロがかなり長文だったため…)

Sub テスト()

Dim i As Long
Dim a As Long
Dim b As Long
Dim c As Long
Dim x As Long
Dim TmpSheet As Worksheet, wc As Integer
Dim wLastGyou As Long

Dim Path As String
Dim myFile As String
Path = ThisWorkbook.Path & "\"

myFile = Dir(Path & "*.xls*")
Do Until myFile = ""

Workbooks.Open Path & myFile

'各ブックでの処理ここから

(※ここでマクロ実行用ブックの存在するフォルダ内のxlsm以外のブック(xls、xlsx)を
1個ずつ開く→内容の一部をコピー→別ブックで保存→元ブックを閉じる
という動作を繰り返します。)

'各ブックでの処理ここまで
' myFile = Dir()  '←現在無効にしているこのコードにすると実行時エラー5、プロシージャの呼び出し、または引数が不正です。というエラーになります
Dir (Path & "*.xls")  '←こちらのコードにすると同ブック上で永遠にループします
Loop

End Sub

どうぞよろしくお願い致します。

質問者からの補足コメント

  • ご回答ありがとうございます。以下、途中のマクロです。

    Dim i As Long
    Dim a As Long
    Dim x As Long
    Dim aa As Long
    Dim TmpSheet As Worksheet, wc As Integer
    Dim wLastGyou As Long

    Dim Path As String
    Dim myFile As String
    Path = ThisWorkbook.Path & "\"
    myFile = Dir(Path & "*.xls*")
    Do Until myFile = ""
    'If myFile <> ThisWorkbook.Name Then
    If InStr(myFile, ".xlsm") = 0 Then
    Workbooks.Open Path & myFile

    No.1の回答に寄せられた補足コメントです。 補足日時:2017/12/14 21:30
  • Set TmpSheet = Worksheets.Add(Before:=Sheets(1))

    With Worksheets(2)
    If .Cells(34, 1) <> "" Then
    For a = 3 To 9
    Worksheets(1).Cells(b + 7, 1).Value = Worksheets(2).Range("E6").Value
    Next a
    End If
    End With

    With Worksheets(1)

    wLastGyou = .UsedRange.Rows.Count

      補足日時:2017/12/14 21:32
  • Columns(1).SpecialCells(xlCellTypeBlanks).EntireRow.Delete
    x = .UsedRange.Cells(.UsedRange.Count).Row
    For aa = x To 1 Step -1
    If .Cells(aa, "D").Text = "0" Then .Rows(aa).Delete
    Next

    End With


    Dim first As Object
    Set first = ActiveWorkbook

    Worksheets(1).Select
    Worksheets(1).Move

    Dim wb As Workbook, fn As String, ix As Long, temp As String

      補足日時:2017/12/14 21:33
  • With ActiveWorkbook
    temp = Path & Format(first.Sheets(1).Range("D5").Value)
    fn = Dir(temp & ".csv")
    If fn = "" Then
    fn = temp & ".csv"
    Else
    Do While fn <> ""
    ix = ix + 1
    fn = Dir(temp & "(" & Format(ix + 1, "0") & ")" & ".csv")
    Loop
    fn = temp & "(" & Format(ix + 1, "0") & ")" & ".csv"
    End If

      補足日時:2017/12/14 21:34
  • .SaveAs fn, _
    FileFormat:=xlCSV

    .Close

    fn = ""
    ix = 0


    End With


    first.Activate
    first.Save
    first.Close

    '=====各処理ここまで
    End If
    myFile = Dir() '←このコードにすると、1つ目のブックは成功し、その次から実行時エラー5、プロシージャの呼び出し、または引数が不正です。というエラーが出ます
    'Dir (Path & "*.xls") '←こちらのコードにすると同ブック上で永遠にループします
    Loop

    End Sub

    見づらくて申し訳ありません;

      補足日時:2017/12/14 21:38

A 回答 (4件)

既に回答が出ていますが、Dirを二重に使用している点が問題なのでしょうね。


単純にファイル名の有無を調べるだけなら、

FileSystemObjectオブジェクト - FileExistsメソッド
http://officetanaka.net/excel/vba/filesystemobje …

こちらを組み込んだ方が宜しいのかもですね。
    • good
    • 1
この回答へのお礼

途中のDirをこちらのコードで書き換えなければならないという事ですね…
代替案までありがとうございます、挑戦してみます!
長らくログインできず、困っておりましたが、問題解決まで気にかけてくださりありがとうございました!

お礼日時:2017/12/23 12:33

No.3です。



問題は解決したという事で宜しいのかな?
    • good
    • 0

Dir(条件)が重複する場合は、Dir()は使えません。



myFile = Dir()
この意味は「前回行ったDirと同一条件で、該当する別ファイルを探し、ファイルをmyFileに代入」です。
前回行ったDirは、残念ながら上の方にあるmyFile = Dir(Path & "*.xls*")ではなくて、途中にある
fn = Dir(temp & ".csv")
とか
fn = Dir(temp & "(" & Format(ix + 1, "0") & ")" & ".csv")
とか
fn = temp & "(" & Format(ix + 1, "0") & ")" & ".csv"
でしょうから、そこで想定外のファイルを開こうとしておかしくなったのだと思います。
    • good
    • 1
この回答へのお礼

Dir使用の際の条件を見落としておりました…
例示まで詳しくありがとうございます!

お礼日時:2017/12/23 12:31

>' myFile = Dir()  '←現在無効にしているこのコード



本来はこちらで良いのでしょうけど、気になるのは

>Path = ThisWorkbook.Path & "\"
>myFile = Dir(Path & "*.xls*")

まず自分自身を再度開こうとする事があるのではないか?
開く前に

Do Until myFile = ""
If myFile <> ThisWorkbook.Name Then
Workbooks.Open Path & myFile

'~処理~

End If
myFile = Dir()
Loop

と自分自身を避ける必要の有無についてはこちらでは判断しかねますが、一応回答してみます。

あと本題については開く際のBook名は変数:myFile に格納されているでしょうけど、

>別ブックで保存→元ブックを閉じる

この辺をどうやっているのか?がわかりませんしね。
なので回答は難しいかもですよ。
変数を用いてとか、myFile を加工しているのかなど憶測はたてられそうですが、解決に繋がるとも言えないし。
この回答への補足あり
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報