質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

3227閲覧

VBA CSVデータ(UTF-8(BOM)付き)の読込

km0815.lj

総合スコア12

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

1クリップ

投稿2022/10/06 05:22

編集2022/10/06 05:24

前提

Excel VBA で CSVデータを読み込みExcelシートに出力する

CSVデータがSJISの場合、下記のソースで文字化けせずに読込ができますが
UTF-8(BOM有)の場合、文字化けします。

実現したいこと

ソースコードを大きく変更することなく、文字化けさせないようにするには
どのようにすればよいのでしょうか。

また、CSVデータ件数が多く、1件づつ読み込む方法では時間がかかるため、
以下の読込方法をできれば使いたい。

VBA

1 Open "C:\temp\data2.csv" For Binary As #1 2 ReDim buf(1 To LOF(1)) 3 Get #1, , buf 4 Close #1

CSVデータ
・ヘッダーはダブルコーテーションなし
・データはダブルコーテーションあり、カラム内に改行コードあり
・行末はカンマで終わっている

(例)data2.csv

列1,列2,列3,
"0001","漢字1-1 漢字1-2","AAAAA",
"0002","漢字2ー1 
漢字2ー2","BBBBBBBBB",
"0003","漢字3ー1 漢字3ー2","漢字漢字",

該当のソースコード

VBA

1'CSVデータがSJisではOKのコード 2Public Sub test() 3 Dim buf() As Byte 4 Dim tmp As Variant, tmp2 As Variant 5 Dim i As Long 6 Dim t1 As String 7 Dim t2 As String 8 9 Open "C:\temp\data2.csv" For Binary As #1 10 ReDim buf(1 To LOF(1)) 11 Get #1, , buf 12 Close #1 13 14 t1 = "," & vbCrLf 15 t2 = """," & vbCrLf 16 17 buf2 = StrConv(buf, vbUnicode) 18 buf3 = Replace(buf2, t1, t2) 19 20 tmp = Split(buf3 & "," & vbCrLf, """," & vbCrLf) 21 22 For i = 0 To UBound(tmp) - 1 23 If i > 0 Then 24 tmp2 = Split(tmp(i), """,""") 25 Else 26 tmp2 = Split(tmp(i), ",") 27 End If 28 29 tmp2(0) = Replace(tmp2(0), """", "") 30 tmp2(UBound(tmp2)) = Replace(tmp2(UBound(tmp2)), """", "") 31 Cells(i + 1, 1).Resize(1, UBound(tmp2) + 1).Value = tmp2 32 Next i 33End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

Excle2016

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

ADODB.Streamを使う方法
【VBA】BOM付きUTF-8形式でテキストファイルを読み込み・出力する方法

vba

1 With CreateObject("ADODB.Stream") 2 .Charset = "UTF-8" 3 .Open 4 .LoadFromFile "C:\temp\data2.csv" 5 buf = .ReadText 6 .Close 7 End With

QueryTableを使う方法
【EXCEL VBA】UTF-8のCSVファイルを高速に読み込みたい | EXCEL VBA 研究所(入門)

BOMの有無に対応しているかは試したことないので不明
シートに出力するならこちらの方が高速らしい。

投稿2022/10/06 05:48

hatena19

総合スコア33699

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

km0815.lj

2022/10/06 08:24

ご回答ありがとうございます。 45000件程度、100桁程度のCSVデータで、 SJISを読み込む元のソースでは一瞬で読み取りが終わりますが、 時間が少しかかりました(5分程度)。 ただ、BOM有もBOM無も問題なく読込できましたので、 こちらで対応させて頂きます。 ありがとうございました。 ※この部分は buf2 = StrConv(buf, vbUnicode) buf3 = Replace(buf2, t1, t2) 以下に修正 'buf2 = StrConv(buf, vbUnicode)  コメントアウト buf3 = Replace(buf, t1, t2)    'buf2をbufに変更
guest

0

Microsoft が提供している Visual Basic .NET 用のクラスライブラリ TextFieldParser を使ってはいかがですか? Shift_JIS, UTF-8, Unicode いずれにも対応できます。

VBA でも使えるそうです。

VBAでCSVを読み込む
https://www.earthlink.co.jp/engineerblog/technology-engineerblog/6542/

投稿2022/10/06 05:31

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

km0815.lj

2022/10/06 09:10

ご回答ありがとうございます。 リンク先の内容は、初心者の私には少しハードルが高く。。。 hatena19様の回答で対応することに致しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問