かなり長い説明になるかもしれませんが、ご容赦ください。Excel で発生している問題は、カスタム マクロ、VBA、およびファイル アクセスに関連しています。
背景: データの複数の CSV ワークブックを処理するマクロを作成しようとしています。RawData_x.csv までの RawData_1.csv という名前のファイルがあります。ここで、x は特定のフォルダーにあるファイルの数です。
マクロのコードは次のようになります。
Sub ImportData()
Application.ScreenUpdating = False
Dim strDir As String
Dim strFileName As String
Dim wbToCopy As Workbook
Dim intCol As Integer
Set master = ActiveSheet
**PLEASE SEE BELOW FOR 2 VERSIONS OF CODE THAT CAN GO HERE!**
strFileName = Dir(strDir & "\*.csv")
intCol = 2
Do While Len(strFileName) > 0
Set wbToCopy = Workbooks.Open(strFileName, , True)
//Do other things I need it to do here
wbToCopy.Close (False)
strFileName = Dir
intCol = intCol + 2
Loop
Application.ScreenUpdating = True
End Sub
問題 1 (小さな問題) : マクロを実行すると、ファイルが何らかの形で「変更」され、次に同じフォルダーで同じマクロを実行すると、ファイルが見つからないと報告されます。正確なエラーは次のとおりです。
実行時エラー '1004':
「RawData_1.csv」が見つかりませんでした。ファイル名のスペルを確認し、ファイルの場所が正しいことを確認します。
最近使用したファイルのリストからファイルを開こうとしている場合は、ファイルが名前変更、移動、または削除されていることを確認してください。
この問題の解決策を見つけました。私がしなければならないのは、すべての csv ファイルを含むフォルダーに移動し、リストの最初のファイルを開き、MS-DOS CSV ファイルとして「名前を付けて保存」することだけです。これが完了したら、マクロを実行して、すべてのファイルを開くことができます (「名前を付けて保存」した最初のファイルだけではありません)。
これは面倒ですが、世界で最悪のことではありません。Excel がこれを行っている理由がある場合は、知りたいです。この問題の解決策があれば、なおさらです。
問題 2 (大きな問題) これが私が解決したい主要なパズルです。上記のコードで欠落しているセクションは、Excel (またはマクロ) にファイルの場所を伝えるコードの一部です。次のようにパスをハードコーディングすることでこれを行うことができます。
方法 1:
strDir = "C:\whateverPath"
この方法は常に機能します (上記の問題 1 が発生した場合を除く)。
ただし、マクロを 1 回だけ使用するだけでなく、複数回使用する必要があり、インポートするデータ ファイルがさまざまなフォルダーにあるため、これは明らかに最適なマクロの記述方法ではありません。ということで、以下のように書いてみました。
方法 2:
Dim folderDialog As fileDialog
Set folderDialog = Application.FileDialog(msoFileDialogeFolderPicker)
folderDialog.AllowMultiSelect = False
folderDialog.Show
strDir = folderDialog.SelectedItems(1)
方法 1 の strDir と方法 2 の strDir を比較したところ、それらの値に識別可能な違いは見つかりませんでした。どちらにも正しいパス「C:\whateverPath」が含まれています。
ただし、方法 2 を使用すると、Excel は選択したフォルダー内のファイルを読み取ることができなくなります。上記と同じ実行時エラー 1004 が返されます。上記の問題 1 に対して見つけたクイック フィックスは、マクロの実行には何の役にも立ちません。
誰かがここで何が起こっているのか知っているなら、これを理解する助けをいただければ幸いです!