csvファイルを作成するVBAマクロが、一部のファイルについて不作成であった原因は?
問題の所在
以下の記事で作成したマクロVBAを、他のお客様で実戦投入したら、、、、一部の仕訳インポートエクセルで、csvファイルが作成されない!
当事務所用)仕訳インポートの下処理で、フォルダ内のブックファイルのうちシート「取込」をcsv形式で保存し、上2行を削除するVBAのコードは?
まあ、*取込2.csv が不作成だったエクセルファイルは一目で判明するので、当該分を手動で追加作成もできるが、このVBAの精度を確認したくなり、、、また Copilotに聞いてみた! (^o^)
(質問文は以下:)
以下のVBAを実行したが、 Excelファイル(*当月分.xlsx)のいくつかが、csv形式の元ファイル名_取り込2.csvという形式で保存されない。その原因は?
Sub ExportCleanAndDeleteTokumiCSV() Dim folderPath As String Dim fileName As String Dim wb As Workbook Dim ws As Worksheet Dim csvFileName As String Dim cleanedCsvFileName As String Dim tempWB As Workbook Dim csvName As String ‘ このVBAファイルと同じフォルダを対象 folderPath = ThisWorkbook.Path & “\” ‘ Step ①: 「*当月分.xlsx」ファイルを処理 fileName = Dir(folderPath & “*当月分.xlsx”) Do While fileName <> “” Set wb = Workbooks.Open(folderPath & fileName, ReadOnly:=True) On Error Resume Next Set ws = wb.Sheets(“取込”) On Error GoTo 0 If Not ws Is Nothing Then ws.Copy Set tempWB = ActiveWorkbook csvFileName = folderPath & Replace(fileName, “.xlsx”, “”) & “_取込.csv” tempWB.SaveAs Filename:=csvFileName, FileFormat:=xlCSV tempWB.Close SaveChanges:=False End If wb.Close SaveChanges:=False Set ws = Nothing fileName = Dir() Loop ‘ Step ②: 「*取込.csv」ファイルを加工して「_取込2.csv」に保存 csvName = Dir(folderPath & “*取込.csv”) Do While csvName <> “” Set tempWB = Workbooks.Open(folderPath & csvName) With tempWB.Sheets(1) .Rows(“1:2”).Delete End With cleanedCsvFileName = folderPath & Replace(csvName, “_取込.csv”, “_取込2.csv”) tempWB.SaveAs Filename:=cleanedCsvFileName, FileFormat:=xlCSV tempWB.Close SaveChanges:=False csvName = Dir() Loop ‘ Step ③: 元の「*取込.csv」ファイルを削除 csvName = Dir(folderPath & “*取込.csv”) Do While csvName <> “” Kill folderPath & csvName csvName = Dir() Loop MsgBox “すべての処理(CSV保存・加工・削除)が完了しました!” End Sub
(回答文は以下:)
なるほど、非常に丁寧に構成されたVBAですね。いくつかの「_取込2.csv」が生成されない原因として、以下のような可能性が考えられます:
🧩 原因の可能性
1. 元の Excel ファイルに「取込」シートが存在しない
Set ws = wb.Sheets(“取込”) の部分で、シートが存在しない場合は ws が Nothing になり、CSV保存処理がスキップされます。
その結果、Step②で対象となる「取込.csv」ファイル自体が生成されないため、「取込2.csv」も作られません。
✅ 対策:Debug.Print fileName & ” → 取込シートあり: ” & Not ws Is Nothing を入れて、どのファイルに「取込」シートがないか確認するとよいです。
2. CSV保存時にファイル名が不正または競合している
Replace(fileName, “.xlsx”, “”) の部分で、拡張子以外に「.」が含まれていると、意図しないファイル名になる可能性があります。
例:2025.08_当月分.xlsx → 2025_08_当月分_取込.csv ではなく 2025.08_当月分_取込.csv になるかもしれません。
✅ 対策:Replace(fileName, “.xlsx”, vbNullString) の代わりに Left(fileName, Len(fileName) – 5) を使うとより安全です。
3. CSVファイルが開けない/破損している
Step②で Workbooks.Open(folderPath & csvName) が失敗すると、以降の処理がスキップされます。
特に、Step①で保存されたCSVが空だったり、改行コードが不正だったりすると、Excelが開けないことがあります。
✅ 対策:On Error Resume Next を Step②にも入れて、開けなかったファイル名をログ出力すると原因特定が容易になります。
4. ファイル名の競合やアクセス権の問題
同名ファイルが既に存在していて上書きできない場合や、フォルダに書き込み権限がない場合も保存に失敗します。
✅ 対策:Dir(cleanedCsvFileName) で事前に存在確認し、Kill で削除してから保存する方法もあります。
🛠️ 改善のヒント
以下のようなログ出力を追加すると、原因特定がしやすくなります:
vba
Debug.Print “処理中: ” & fileName
If ws Is Nothing Then
Debug.Print “→ 取込シートが見つかりません”
Else
Debug.Print “→ CSV保存: ” & csvFileName
End If
また、Step②の Workbooks.Open に失敗した場合のログも追加すると良いでしょう。
もしよければ、実際に保存されなかったファイル名の例や、ファイル名の命名規則(日本語や記号の使用など)を教えていただければ、さらに深掘りできますよ。
===================
結論
当該不作成のエクセルブックでは、シート「取り込み」になっていた。
これをシート「取込」にリネイムして保存し、再度、マクロを実行したら、100%できた!
理由
特記事項なし
補足
これまで、複数のcsvファイルを名寄せするマクロでも、数回に1回、落ちてしまう挙動のときもあった。
また、マクロ実行中に、「クリップボードエラー」というポップアップが表示されたりしているので、それが原因かとも思ったが、、、、いや、よくできたマクロです。
■