プロが教える店舗&オフィスのセキュリティ対策術

エクセルのVBAについて
とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているのですが、ファイルがあるのに「ファイルが開けませんでした。3002」とエラーが出てしまいます。どこをどう直したら良いのでしょうか?

Sub CSV変換
Dim iFile As String
Dim oFile As String
iFile = ThisWorkbook.Path & "\" & Range("O1").Text & "*.csv" 'UTF-8の読み込むファイル名
oFile = ThisWorkbook.Path & "\" & Range("O1").Text & ".csv" 'Shift-JISで書き出すファイル名 '
Dim csv As String 'CSVを読み書きする文字列変数 'UTF-8を読み込む
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open .LoadFromFile iFile
csv = .ReadText
.Close
End With
'テキストファイルで書き出す(普通にShift-JISになる)
With CreateObject("Scripting.FileSystemObject")
.CreateTextFile(oFile, True)
.write csv
.Close
End With
End Sub

質問者からの補足コメント

  • ファイル名は毎回変わるため、O1のセルに入ってる文字を含むcsvファイルを読み込ませたいため、*を入れております。
    この作業を複数回やる必要があるため、自動化したくVBAを作成しております。

      補足日時:2022/11/06 21:09
  • tatsumaru77さま
    回答ありがとうございます。そのやり方でも大丈夫です。出来ればコードを教えて頂けますでしょうか?

      補足日時:2022/11/07 11:30

A 回答 (7件)

No6です。


以下のマクロを標準モジュールに登録してください。
フォルダ:INPUTの下にあるすべてのCSVファイル(utf-8)をShift-jisに変換し、OUTPUTの下へ出力します。

Sub CSV変換()
Dim iFile As String 'UTF-8の読み込むファイル名
Dim oFile As String 'Shift-JISで書き出すファイル名 '
Dim fname As String 'Dir()で取得したファイル名
Dim FSO As Object
Dim csv As String 'CSVを読み書きする文字列変数 'UTF-8を読み込む
Set FSO = CreateObject("Scripting.FileSystemObject")
fname = Dir(ThisWorkbook.Path & "\INPUT\*.csv", vbNormal)
Do While fname <> ""
iFile = ThisWorkbook.Path & "\INPUT\" & fname
With CreateObject("ADODB.Stream")
.Charset = "UTF-8"
.Open
.LoadFromFile iFile
csv = .ReadText
.Close
End With
oFile = ThisWorkbook.Path & "\OUTPUT\" & fname
'テキストファイルで書き出す(普通にShift-JISになる)
With FSO.CreateTextFile(oFile, True)
.Write csv
.Close
End With
fname = Dir()
Loop
MsgBox ("完了")
End Sub
    • good
    • 0
この回答へのお礼

ありがとうございます!!
お陰様で出来ました^_^

お礼日時:2022/11/07 20:33

CSVの文字化けを直すことではなく、文字コードの変換ですね。

(utf-8->shift-jis)

マクロのあるフォルダの下にINPUTとOUTPUTの2つのフォルダを作成し
INPUTの下に変換元のCSVファイル(utf-8)を置いて、
マクロを実行すると、OUTPUTの下に変換後のファイル(shift-jis)が作成されるようにするのはいかがでしょうか。
変換元のファイルは、複数置くことが可能です。
変換後のファイル名は、変換元のファイル名と同じ名称で出力されます。
「エクセルのVBAについて とあるサイトの」の回答画像6
    • good
    • 0

No1です。



>文字を含むcsvファイルを読み込ませたいため、*を入れております。
文法と違うことを勝手に記述しても、プログラムは忖度してくれたりはしません。(エラーになるだけです)

ADODB.Streamに渡すのは、正しいファイルパスである必要があります。
また、No1にも書いたように「*」はファイル名としては使えない文字です。

多分、「ファイルを検索して処理を行いたい」ということだと想像しますが、もし、そうであるのならそのようにコードを記述する必要があります。
例えば、
 ・Dir関数でファイルを検索し
  (Dir関数などではワイルドカードを使えます)
 ・該当するファイルが見つかったら、そのファイルを対象に処理を行う
といった手順です。

「複数の該当ファイルがあれば、全部同様の処理を行う」というのであれば、上記をループ処理にすれば可能ですが、プログラムをそのように記述しておく必要があります。
◇ Dir関数を利用したループの例
http://officetanaka.net/excel/vba/function/Dir.htm
    • good
    • 0

「O1」の内容が"ABCD"として


読み込み用のファイル
「ABCD*.csv」に該当するファイルは1つだけ存在する前提で良いですか。


ABCD99.csv(UTF-8)を読み込みABCD.csv(Shift-JIS)へ出力する。
    • good
    • 0

読み込むときにワイルドカードは指定できません。



Range("O1").Text にはどのような値が設定されているのでしょうか。
仮に"ABCD"という内容が設定されていると
ThisWorkbook.PathがC:\test とすると
C:\test\ABCD.*csv を読み込んで
C:\test\ABCD.csv へ書き込むことになります。

C:\test\ABCD.*csvは指定できないので*をとると
C:\test\ABCD.csvを読み込み
C:\test\ABCD.csvへ書き込むことになりますが、それで良いですか。
    • good
    • 0

文字コードの変更ならメモ帳でできますが、それではだめなのでしょうか。

    • good
    • 0

こんにちは



>「ファイルが開けませんでした。3002」とエラーが出てしまいます。
素直にそこをチェックしてみるのが宜しいかと。

ご提示のコードではファイルパスに「~~¥××*.csv」と「*」が入るようになっていますが、それが原因ではありませんか?
(ファイル名には使用できない文字のはずですので・・)


ついでながら、
>.Open .LoadFromFile iFile
試していないのではっきりとはしませんが、改行無しでセンテンスの区切りと見做してくれるのか疑問です。
そうしない理由が不明ですが、明示的に改行を入れておく方が良いと思います。
(最低でも「:」を入れておくとか)
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A