
VBAでCSVファイルを読み込もうとしていますが、
「ファイルが見つかりません」とエラーが表示されます。
どのように対処していいのかわかりません。
教えてくください。
Sub readCsv()
Dim csvFile As String
Dim ch As Integer
Dim csvStr As String
Dim str() As String
Dim i As Integer
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
For Each file In fileList
csvFile = file.Name
ch = FreeFile
Open csvFile For Input As #ch
i = 1
Do While Not EOF(1)
Line Input #ch, csvStr
Close #ch
str = Split(csvStr, ",")
Range(Cells(i, 1), Cells(i, UBound(str) + 1)) = str
i = i + 1
Loop
Next
End Sub
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
No.3
- 回答日時:
未確認ですが、「ファイルがみつかりません」となるファイルは
"."(カレントフォルダ)と".."(一つ上のフォルダ)では?
まずは開けないファイルを調べてみてください。
例:
MsgBox file.Name
Debug.Print file.Name
No.2
- 回答日時:
他の観点から
Close #ch は、Do Loop の外に出るものと思います。
i = 1 の記述箇所は、ここで良いのか確かめられればと思います。
(複数ファイルがあったら、上書きする様な・・・)
No.1
- 回答日時:
>「ファイルが見つかりません」とエラーが表示されます。
>どのように対処していいのかわかりません。
実際にあるのに見つからないというエラーなら、
ファイル名をセットする変数を見てみればわかると思いますが。
>Open csvFile For Input As #ch
変数cvsFileには、ファイル名しか入ってないですよね。
そこはフルパスでなければいけないのでは?
Open targetfolder & "\" & csvFile For Input As #ch
それから、ちょと気になったのですが、
読み込むファイルはひとつ?
また、そのフォルダーには、CSVフィルのみ?
CSVひとつのみだとうまくいくコードになってませんか?
以上です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) ExcelVBAに関する質問 3 2023/02/17 10:47
- Visual Basic(VBA) このVBAでExcelアプリケーションを作成は必要ですか? 3 2023/07/19 21:13
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- Excel(エクセル) Excelにて、フォルダ内のTextファイルをマクロで統合すると文字化けしてしまう時の解消コード 4 2023/01/01 07:32
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) vbaの構文の修正相談(xmlファイルを順に開いてコピペ作業) 1 2023/04/22 01:18
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excelマクロのファイルサイズ
-
タイムスタンプの更新の方法2
-
エクセルVBAでの呼出操作を...
-
Visual C++ 2008 (Win32)を使っ...
-
AccessからExcelファイルのシー...
-
マクロのアラームサウンドについて
-
VB2005でエクセルファイル内...
-
VBSのFor文
-
EXCEL VBAにおけるサンプルコ...
-
フォルダー内の最新更新エクセ...
-
VBA ディレクトリ名をワイルド...
-
大量にあるHTMLファイルのソー...
-
ファイルのアップロードと表示
-
VB2008 Expressで、Excelファイ...
-
エクセルvbaでdocuworksprinter...
-
リストボックスに関連してファ...
-
エクセルのプロパティーでセキ...
-
frxファイルの役目
-
【VBA】テキストファイルを指定...
-
エクセルのショートカットキー...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
動かなくなってしまった古いVBA...
-
「エクセルファイルが開いてい...
-
FileDialog オブジェクトでファ...
-
VBAでフォルダ内のhtmlファイル...
-
VB6でUTF-8ファイルの読取りを
-
vbaサブフォルダーをワイルドカ...
-
webブラウザからローカルファイ...
-
ffftpでファイル取得が0バイト...
-
サブフォルダ含むフォルダ内の...
-
ファイルを複数選択した時のフ...
-
VBAでCSVファイルを読み込もう...
-
複数のワークブックのVBAを変更...
-
excel マクロ PDF化の際のエラ...
-
Wordのプロパティ・総ページ数...
-
フォルダ階層・ファイル名・ペ...
-
フォルダ内のファイル存在監視...
-
AccessからOLEオブジェクト型の...
-
VB.net XMLの作成方法 Iniの代替
-
【ACCESS VBA】アクセスからデ...
-
vbs ブック共有を解除
おすすめ情報