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

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

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

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

1回答

12374閲覧

VBA UTF8のCSVを読み込み、配列に格納したい

chanrina0920

総合スコア18

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

VBA

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

UTF-8

UTF-8は8ビット符号単位の文字符号化形式及び文字符号化スキームです。データ交換方式、ファイル形式としては、一般的にUTF-8が使われる傾向があります。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2017/11/04 15:47

###前提・実現したいこと
UTF8コードのCSVファイルを読み込み、配列にいれたいです。
その際、1行目はヘッダーなので、読み飛ばし、1行ずつ読み取り
配列にいれたいのですが、文字コードがUTF8となるとInputLineが使用できず
下記のようなコードを記載してみましたが
目的の処理をこの後どのように記載すればよいか困っています。

###発生している問題・エラーメッセージ
・CSVファイルの1行目を読み取らない処理が分からない
・CSVファイルを配列に入れる方法が分からない
※1行ずついれて、このあとループ処理でテンプレートに出力する処理を追加したいと考えています。

###該当のソースコード
Private Sub printCSV()
Dim buffer As String ' 一時的に文字列を格納
Dim Stream As Object

Dim fol_path As String
fol_path = ThisWorkbook.Path
fol_path = fol_path & "" & Format(Now, "yyyymmddhhmmss")
If Dir(fol_path, vbDirectory) = "" Then
MkDir fol_path
Debug.Print fol_path
End If

Dim fType, prompt As String Dim fPath As Variant Dim ws As Worksheet Set ws = Worksheets("CSV選択") '選択できるファイルの種類をxlsに限定 fType = "CSVファイル (*.csv),*.csv" 'ダイアログのタイトルを指定 prompt = "CSVファイルを選択して下さい" 'ファイル参照ダイアログの表示 fPath = Application.GetOpenFilename(fType, , prompt) Debug.Print fPath

' VB標準のADODB.Streamオブジェクトを作成する
Set Stream = CreateObject("ADODB.Stream")

' ストリームの文字コードをUTF8に設定する
Stream.Charset = "UTF-8"
' ファイルのタイプ(1:バイナリ 2:テキスト)
Stream.Type = 2
' ストリームを開く
Stream.Open
' ストリームにファイルを読み込む
Stream.LoadFromFile fPath
' ファイルの中身をbufferへ代入
buffer = Stream.ReadText
' ストリームを閉じる
Stream.Close
' イミディエイトへ出力
Debug.Print buffer
Dim myArray() As String
myArray = Split(buffer, ",") '---(1)

Debug.Print myArray(52)

'Set Stream = Nothing
End Sub

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

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

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

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

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

guest

回答1

0

ベストアンサー

ヘッダ行の読み飛ばしにはStream.SkipLineが使えるかと。
Stream.SkipLineで1行を読み飛ばすことができます。

(参考) SkipLine メソッド

ただし、改行コード(行区切り文字)に注意する必要があります。
通常のCSVだと改行コードはCrLfですが、UTF-8だとLfの可能性があります。
Stream.SkipLineの規定はCrLf単位での読み飛ばしになるため、もし、読み込むCSVファイルの改行コードがLfの場合、一気に最後まで読み飛ばされます。
その場合は、Stream.LineSeparatorに適切な改行コードを設定してください。

(参考) LineSeparatorsEnum

以下、サンプルです。

vba

1' 改行コードをvbLfに 2Stream.LineSeparator = 10 3' ヘッダを読み飛ばし 4Stream.SkipLine 5 6' ファイルの中身をbufferへ代入 7buffer = Stream.ReadText

後、1行づつ配列に入れたいということなので、Splitを使って適切な改行コードで分割してあげればよいかと思います。

vba

1' myArray = Split(buffer, vbCrLf) 2myArray = Split(buffer, vbLf)

投稿2017/11/04 18:09

sa-yu

総合スコア201

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問