• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAでCSVファイルを読み込もうとしていますが、)

VBAでCSVファイルを読み込む方法とエラーの対処法

このQ&Aのポイント
  • VBAでCSVファイルを読み込む際に「ファイルが見つかりません」とエラーが表示される場合の対処法について教えてください。
  • VBAを使用してCSVファイルを読み込もうとした際に、「ファイルが見つかりません」というエラーが発生しました。このエラーの原因と対処方法について教えてください。
  • VBAでCSVファイルを読み込むときに「ファイルが見つかりません」というエラーが表示されます。このエラーの解決方法を教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • DOUGLAS_
  • ベストアンサー率74% (397/534)
回答No.4

1)お示しの コード は、恐らく、 a)「1つの CSVファイル を開いて、1行ずつ ワークシート に展開する」マクロ http://www.cocoaliz.com/excelVBA/index/30/ と b)「指定した フォルダ 内の CSVファイル 1つずつ に対して、所定の作業を繰り返す」マクロ http://q.hatena.ne.jp/1198813835 の #1 を参考にされたのだろうと拝察いたします。 2)(1) の憶測が当たっているとすると、下記の2点が、合理的な考え方になろうかと存じます。 ア)(b) の「所定の作業」に (a) を挿入する。 イ)(a) の中の「i」は ワークシート に展開する「行番号」なので、「i = 1」を「所定の作業」の外に出す。 3)ここで、「所定の作業」である「For ~ Next」に (a) をそのまま挿入し、「変数の宣言部」を前に出すと、eccschool さんがお示しの コード とほぼ同じになりますが、ここで、「Close #ch」の位置が間違っていることに気が付きます。 4)さて、話を元に戻しますが、(1) でご参考にされたと思われる元々の コード には、問題点があります。 ウ)先ず、(a) の中で Do While Not EOF(1) となっていますが、これは、[EOF 関数] の ヘルプ に >構文 EOF(filenumber) >引数 filenumber には、任意の有効なファイル番号・・・ とありますように、「ch = FreeFile」とするのでしたら、 Do While Not EOF(ch) とすべきです。 エ)また、(a) のままでは、CSVファイル に空白行が合った場合に エラー になりますので、 If csvStr <> "" Then という コード を付加するのがよいかと存じます。 オ)さらに、(b) のままでは、「targetFolder」に CSVファイル 以外の ファイル があった場合に エラー になりますので、 If fso.GetExtensionName(file) = "csv" Then という コード を付加するのがよいかと存じます。 5)最後に、上記の各点を改善してマクロ を実行してみると、 Open csvFile For Input As #ch のところで「ファイルが見つかりません」と怒られてしまいます。  原因は、#1 さんがお書きの、 >そこはフルパスでなければいけない です。 6)ということで、 ・プロシージャ 内で用いる『変数』は、宣言する。 ・[Set ステートメント] で オブジェクト を参照した後は「Set ~~ = Nothing」で「オブジェクト の解放」を行なう。 ということを除いて、上記をまとめると、下記のようなことになるかと存じます。 Sub readCsv() '最低「str()」だけは宣言しておかないと、 'str = Split(csvStr, ",") で エラー になる。  Dim str() As String  Set ShellApp = CreateObject("Shell.Application")  Set oFolder = ShellApp.BrowseForFolder(0, "フォルダ選択", 1)  targetfolder = oFolder.Items.Item.Path  Set fso = CreateObject("Scripting.FileSystemObject")  Set fileList = fso.GetFolder(targetfolder).Files  i = 1 '(イ)  For Each file In fileList   If fso.GetExtensionName(file) = "csv" Then '(オ)    csvFile = file.Name    ch = FreeFile    Open targetfolder & "\" & csvFile For Input As #ch '(5)    Do While Not EOF(ch) '(ウ)     Line Input #ch, csvStr     If csvStr <> "" Then '(エ)      str = Split(csvStr, ",")      Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str     End If     i = i + 1    Loop    Close #ch '(3)   End If  Next End Sub

すると、全ての回答が全文表示されます。

その他の回答 (3)

  • soaikats
  • ベストアンサー率58% (14/24)
回答No.3

未確認ですが、「ファイルがみつかりません」となるファイルは "."(カレントフォルダ)と".."(一つ上のフォルダ)では? まずは開けないファイルを調べてみてください。 例:  MsgBox file.Name  Debug.Print file.Name

すると、全ての回答が全文表示されます。
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

他の観点から Close #ch は、Do Loop の外に出るものと思います。 i = 1 の記述箇所は、ここで良いのか確かめられればと思います。 (複数ファイルがあったら、上書きする様な・・・)

すると、全ての回答が全文表示されます。
  • myRange
  • ベストアンサー率71% (339/472)
回答No.1

>「ファイルが見つかりません」とエラーが表示されます。 >どのように対処していいのかわかりません。 実際にあるのに見つからないというエラーなら、 ファイル名をセットする変数を見てみればわかると思いますが。 >Open csvFile For Input As #ch 変数cvsFileには、ファイル名しか入ってないですよね。 そこはフルパスでなければいけないのでは? Open targetfolder & "\" & csvFile For Input As #ch それから、ちょと気になったのですが、 読み込むファイルはひとつ? また、そのフォルダーには、CSVフィルのみ? CSVひとつのみだとうまくいくコードになってませんか? 以上です。

すると、全ての回答が全文表示されます。

関連するQ&A

専門家に質問してみよう