- ベストアンサー
エクセルワークブックの数だけ処理を繰り返したいです
- 元のフォルダにある.xlsxの数だけ連番にしたファイル名で保存し、同じファイル名になったら連番にしたいです。
- 各.xlsxをワークブックのワークシート1のA1のファイル名にし、.csvに変換する方法を教えてください。
- 質問は、エクセルワークブックの数だけ処理を繰り返す方法についてです。元のフォルダにある.xlsxの数だけ連番にしたファイル名で保存し、同じファイル名になったら連番にしたいです。また、各.xlsxをワークブックのワークシート1のA1のファイル名にし、.csvに変換する方法を教えてください。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
返事が遅れてすみません。 こちらでは正しく動いているので、原因は解りません。 上げておくのでダウンロードして動かしてみて下さい。 https://1drv.ms/u/s!AnfEM367OeSdiG3oN79IlJuaR1ZZ?e=TjwTUu 考えれる可能性としては、1番左のシートのA1が空白になっている等ありませんか。 それでも解らない場合、 データ便 https://www.datadeliver.net/1 OneDrive https://www.microsoft.com/ja-jp/microsoft-365/free-office-online-for-the-web 等に上げていただければ見てみます。
その他の回答 (4)
- SI299792
- ベストアンサー率47% (774/1619)
いえ、こちらこそ質問を読み返しても、どこにも全シートと書いてありませんでした。私の読み間違いです。 多分原因は他シートを処理しようとしてA1が空白だったので異常動作したと思われます。 (原因が思い当たらずしばらく放置していました) 1番左だけを処理対象にしました。やってみて下さい。 Option Explicit ' Sub Macro1() Dim Sheet As Worksheet Dim FileName As String Dim Count As String ' FileName = Dir(ThisWorkbook.Path & "\*.xlsx") Application.ScreenUpdating = False ' Do While FileName > "" Workbooks.Open ThisWorkbook.Path & "\" & FileName, False, True Sheets(1).Select Count = 0 On Error Resume Next ' Do While Err = 0 FileName = ThisWorkbook.Path & "\" & _ Replace([A1] & "(" & Count & ")", "(0)", "") & ".csv" Open FileName For Input As #1 ' If Err <> 0 And Err <> 53 Then Error Err End If Close Count = Count + 1 Loop On Error GoTo 0 ActiveWorkbook.SaveAs FileName, FileFormat:=xlCSV ActiveWorkbook.Close False FileName = Dir Loop End End Sub
補足
新たにご教示いただきまして、ありがとうございます。 ただ、すいません。いただいたプログラムを走らせると、「実行時エラー1004 ファイルにアクセスできませんでした。」と出てしまい、エラーになってしまいます。 activeworkbook.save as 〜が該当の様です。 この箇所を、activeworkbook.savbas filename:=として保存すると、エラーは出てこないのですが、代わりに、名前の重複処理が出来なくなります。(名前が重複するファイルあるけど、保存する?というメッセージが出ます。) お手数ですが、他の方法をご教示いただげせんでしょうか? 申し訳ありませんが、宜しくお願い致しますm(_ _)m
- SI299792
- ベストアンサー率47% (774/1619)
>ワークシート1のA1に というのを見落としていました。 という事は、ワークシート1のA1だけ入っていて、他シートは入っていないのでしょうか。 全てのシートが対象だと思っていたのですが、1番左だけでいいのですか?
補足
言葉足らずで失礼しました。 はい、仰る通り、ワークシート1のA1だけで大丈夫です。
- SI299792
- ベストアンサー率47% (774/1619)
フォルダは、このワークブックを保存したフォルダと同じフォルダにしました。 Option Explicit ' Sub Macro1() Dim Sheet As Worksheet Dim FileName As String Dim Count As String ' FileName = Dir(ThisWorkbook.Path & "\*.xlsx") Application.ScreenUpdating = False ' Do While FileName > "" Workbooks.Open ThisWorkbook.Path & "\" & FileName, False, True ' For Each Sheet In Worksheets Sheet.Select Count = 0 On Error Resume Next ' Do While Err = 0 FileName = ThisWorkbook.Path & "\" & _ Replace([A1] & "(" & Count & ")", "(0)", "") & ".csv" Open FileName For Input As #1 Close Count = Count + 1 Loop ActiveWorkbook.SaveAs FileName, FileFormat:=xlCSV Next Sheet ActiveWorkbook.Close False FileName = Dir Loop End Sub
補足
ご意見いただき、ありがとうございます。 ただ、すいません。ご教示いただきましたプログラムを走らせたのですが、何も起きずに醜虜してしまいます。 〉Open FileName For Input As #1 で動作が止まってしまうみたいたのです。 大変申し訳ありませんが、もし宜しければ、他の方法をご教示いただけますと幸いです。
- imogasi
- ベストアンサー率27% (4737/17069)
こんな質問は、タイプとしてはよくあることだ。 (1)FSOを使う (2)Dirを使う の2方式あるが、For Eachが使える(1)がお勧め。 Googleで「fso folderのファイルを捉える」などで照会し https://excelwork.info/excel/fsofiles/ などの記事が出てくるから、その中の例の(一部を修正し) ーーー Sub Sample_Files() Dim fso As Object Dim myFiles As Object Dim myFile As Object Dim strFiles As String Set fso = CreateObject("Scripting.FileSystemObject") Set myFiles = fso.GetFolder("C:\Users\XXXX").Files ’xxxx以下は修正する i = 1 For Each myFile In myFiles strFiles = myFile.Name MsgBox strFiles i = i + 1 If i = 3 Then Exit Sub ’確認なので、3ファイルで打ち切る Next End Sub これで、結果が、おかしいところが無いようなら MsgBox strFiles のところを、ブックstrFilesのOpenに変える。 その次に、そのブックのOpen後の処理のコードを書く(質問のコードが使えるか、やって見たら)。 質問者だけの、固有の処理ニーズなので自力でやること。 回答者に全部やらすのは、勉強にもならず、自分でやってみること。 疑問があればそのコードについて質問すること。 参考 https://teratail.com/questions/201039 Early BindingとLate Bindingについて のうち、初心者に、やさしいと思う方をやっている。
お礼
ご連絡が遅くなり、失礼しました。 ありがとうございます!お蔭様で、動きました!どうやら、大本のxlsxが読み取り専用になっていたのが原因でした。 ありがとうございました!