2

かなり長い説明になるかもしれませんが、ご容赦ください。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 に対して見つけたクイック フィックスは、マクロの実行には何の役にも立ちません。

誰かがここで何が起こっているのか知っているなら、これを理解する助けをいただければ幸いです!

4

1 に答える 1

1

編集:私は問題を見つけたと思います。Set wbToCopy = Workbooks.Open(strFileName, , True) strFileName完全修飾パスを使用しません。したがって、.openメソッドを呼び出すと、VBA がCurDir値を使用して に追加していると思いますstrFileName。「名前を付けて保存」を実行するとCurDir、.csv ファイルを保存しているディレクトリに値が変更されます。実際にはCurDir、ファイルが配置されているディレクトリに値を変更する行為です。完全修飾ファイル名を使用すると.open、毎回実行されます。

前の提案: あなたのファイル名は完全修飾されていないと思います (エラー メッセージは'C:\whateverPath\RawData_1.csv' could not be found.notと読むべき'RawData_1.csv' could not be found.です)。

コードのエラーを追跡するのに苦労しました。これは一種のハックですが、行き詰まった場合は、これを使用してみてください:

Option Explicit
Sub ImportData()

Application.ScreenUpdating = False

Dim strDir As String
Dim strFolderName As String
Dim wbToCopy As Workbook
Dim intCol As Integer
Dim master As Excel.Worksheet

Dim FSO As Object
Dim FSO_FOLDER As Object
Dim FSO_FILE As Object
Dim FILE_EXT As String

FILE_EXT = "csv"
strFolderName = Get_Folder_Path() & "\"

''Create FileSystem Objects
Set FSO = CreateObject("Scripting.FileSystemObject")

Set FSO_FOLDER = FSO.GetFolder(strFolderName)

Set master = ThisWorkbook.ActiveSheet

''**PLEASE SEE BELOW FOR 2 VERSIONS OF CODE THAT CAN GO HERE!**

intCol = 2

If FSO_FOLDER.Files.Count > 0 Then

''Loop through each File in Folder
For Each FSO_FILE In FSO_FOLDER.Files

   ''Test extension
   If FSO.GetExtensionName(FSO_FILE.Name) = FILE_EXT Then

       Set wbToCopy = Workbooks.Open(strFolderName & FSO_FILE.Name, , True)

        ''//Do other things I need it to do here

        wbToCopy.Close (False)
        intCol = intCol + 2

   Else: End If

Next

Else

MsgBox "No Files Found at " & strFolderName

End If

Set FSO = Nothing
Set FSO_FOLDER = Nothing

Application.ScreenUpdating = True

End Sub

Function Get_Folder_Path() As String
Dim folderDialog As FileDialog
Set folderDialog = Application.FileDialog(4)
folderDialog.AllowMultiSelect = False
folderDialog.Show

Get_Folder_Path = folderDialog.SelectedItems(1)

End Function

Dirこれは、ネイティブ関数の代わりに FileSystem ライブラリを使用することに注意してください。また、ダイアログ ボックスのファイル名の代わりにフォルダー名を選択します。

于 2013-07-23T23:22:42.113 に答える