ひできちの楽天ブログ

2026/01/19
XML
カテゴリ: プログラミング
ExcelシートにCSVファイルを読み込むVBA コードです。
もちろんExcel標準機能で可能なんですが
マウスワンクリックで終わらせたいと思ったので
Copilot AIに実装させました

要件
・UTF8ファイルに対応
・ファイル名、フォルダーパスはアクティブシートのセルの情報を使用する
ファイル名→A1
フォルダーパス→C1

・文字の"00001"が勝手に数字に変換されないこと

出来上がったソースコードは遅いですがちゃんと動作していますな
処理が遅すぎますが
データ量が少量ならば使えると思いますぞ

 ’----------------------------------------------------------------
Sub ImportCSV_UTF8_RFC4180_A8()

Dim folder As String
Dim fname As String
Dim fullpath As String
Dim txt As String
Dim lines() As String
Dim r As Long
Dim cols As Variant
Dim line As Variant
Dim ws As Worksheet

Set ws = ThisWorkbook.ActiveSheet

folder = ws.Range("C1").Value
fname = ws.Range("A1").Value & ".csv"
fullpath = folder & "\" & fname

'--- UTF-8 テキストとして読み込み(ADODB.Stream 使用)---
txt = ReadTextFileUTF8(fullpath)

'ファイルが空 or 読めなかった場合は終了
If Len(txt) = 0 Then Exit Sub

'--- 改行コードを統一 ---
txt = Replace(txt, vbCrLf, vbLf)
txt = Replace(txt, vbCr, vbLf)
lines = Split(txt, vbLf)

'--- A8 から表示 ---
r = 8

For Each line In lines
If Len(line) > 0 Then

cols = ParseCSV(CStr(line))

Dim c As Long
For c = LBound(cols) To UBound(cols)
With ws.Cells(r, c + 1)
.NumberFormat = "@"
.Value = cols(c)
End With
Next

r = r + 1
End If
Next

End Sub

'===========================================================
' UTF-8 テキスト読み込み(ADODB.Stream 使用)
'===========================================================
Function ReadTextFileUTF8(ByVal path As String) As String
Dim stm As Object
Dim txt As String

Set stm = CreateObject("ADODB.Stream")
With stm
.Type = 2 'text
.Charset = "UTF-8"
.Open
.LoadFromFile path
txt = .ReadText
.Close
End With
ReadTextFileUTF8 = txt
End Function

'===========================================================
' RFC4180 準拠 CSV パーサ(ダブルクォート完全対応)
'===========================================================
Function ParseCSV(ByVal s As String) As Variant
Dim result() As String
Dim buf As String
Dim i As Long, ch As String
Dim inQuote As Boolean
Dim idx As Long

ReDim result(0)
buf = ""
inQuote = False
idx = 0

For i = 1 To Len(s)
ch = Mid$(s, i, 1)

If ch = """" Then
If inQuote And Mid$(s, i + 1, 1) = """" Then
buf = buf & """"
i = i + 1
Else
inQuote = Not inQuote
End If

ElseIf ch = "," And Not inQuote Then
result(idx) = buf
idx = idx + 1
ReDim Preserve result(idx)
buf = ""

Else
buf = buf & ch
End If
Next

result(idx) = buf
ParseCSV = result
End Function


’----------------------------------------------------------------
Sub ImportCSV_UTF8_RFC4180_A8()

Dim folder As String
Dim fname As String
Dim fullpath As String
Dim f As Integer
Dim bin As String
Dim txt As String
Dim lines() As String
Dim r As Long
Dim cols As Variant

folder = Range("C1").Value
fname = Range("A1").Value & ".csv"
fullpath = folder & "\" & fname

'--- UTF-8 読み込み ---
f = FreeFile
Open fullpath For Binary As #f
bin = Space$(LOF(f))
Get #f, , bin
Close #f

txt = StrConv(bin, vbUnicode)

'--- 改行コードを統一 ---
txt = Replace(txt, vbCrLf, vbLf)
txt = Replace(txt, vbCr, vbLf)
lines = Split(txt, vbLf)

'--- A8 から表示 ---
r = 8

Dim line As Variant
For Each line In lines
If Len(line) > 0 Then

'★ RFC4180 CSV パース(ダブルクォート対応)
cols = ParseCSV(line)

Dim c As Long
For c = LBound(cols) To UBound(cols)
With Cells(r, c + 1)
.NumberFormat = "@"
.Value = cols(c)
End With
Next

r = r + 1
End If
Next

End Sub


'===========================================================
' RFC4180 準拠 CSV パーサ(ダブルクォート完全対応)
'===========================================================
Function ParseCSV(ByVal s As String) As Variant
Dim result() As String
Dim buf As String
Dim i As Long, ch As String
Dim inQuote As Boolean
Dim idx As Long

ReDim result(0)
buf = ""
inQuote = False
idx = 0

For i = 1 To Len(s)
ch = Mid$(s, i, 1)

If ch = """" Then
If inQuote And Mid$(s, i + 1, 1) = """" Then
buf = buf & """"
i = i + 1
Else
inQuote = Not inQuote
End If

ElseIf ch = "," And Not inQuote Then
result(idx) = buf
idx = idx + 1
ReDim Preserve result(idx)
buf = ""

Else
buf = buf & ch
End If
Next

result(idx) = buf
ParseCSV = result
End Function



’----------------------------------------------------------------
Sub ImportCSV_UTF8_NoGarble_KeepLeadingZeros()

Dim folder As String
Dim fname As String
Dim fullpath As String
Dim f As Integer
Dim txt As String
Dim lines() As String
Dim line As Variant
Dim r As Long, c As Long
Dim cols() As String

folder = Range("C1").Value
fname = Range("A1").Value & ".csv"
fullpath = folder & "\" & fname

'UTF-8 読み込み(Excelに任せない)
f = FreeFile
Open fullpath For Binary As #f
txt = Space$(LOF(f))
Get #f, , txt
Close #f

'UTF-8 → Unicode 変換(文字化け防止)
txt = StrConv(txt, vbUnicode)

'行分割
lines = Split(txt, vbCrLf)

'★ 表示開始行を A8 に変更
r = 8

For Each line In lines
If Len(line) > 0 Then
cols = Split(line, ",")
For c = 0 To UBound(cols)

'★ 先頭ゼロ保持のためテキスト形式を強制
With Cells(r, c + 1)
.NumberFormat = "@"
.Value = cols(c)
End With

Next
r = r + 1
End If
Next

End Sub



’----------------------------------------------------------------
Sub ImportCSV_UTF8_AsText_Safe()

Dim folder As String
Dim fname As String
Dim fullpath As String
Dim wbCSV As Workbook

folder = Range("C1").Value
fname = Range("A1").Value & ".csv"
fullpath = folder & "\" & fname

'UTF-8 で CSV を別ブックとして開く(既存セルは絶対に壊れない)
Workbooks.OpenText _
Filename:=fullpath, _
Origin:=65001, _
DataType:=xlDelimited, _
Comma:=True, _
TextQualifier:=xlTextQualifierDoubleQuote, _
FieldInfo:=Array(1, 2) '全列テキスト

Set wbCSV = ActiveWorkbook

'A6 以降を更新(A1〜A5 は絶対に触らない)
ThisWorkbook.ActiveSheet.Range("A6").Resize( _
wbCSV.Sheets(1).UsedRange.Rows.Count, _
wbCSV.Sheets(1).UsedRange.Columns.Count _
).Value = wbCSV.Sheets(1).UsedRange.Value

'CSV ブックを閉じる
wbCSV.Close False

End Sub





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2026/01/19 11:27:05 PM
コメント(0) | コメントを書く


【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! -- / --
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x
X

PR

×

バックナンバー

2026/09
2026/08
2026/07
2026/06
2026/05

キーワードサーチ

▼キーワード検索

カテゴリ

カテゴリ未分類

(41)

楽天サービス

(45)

ポイント生活

(51)

電子書籍

(30)

yahoo

(3)

クレジットカード

(36)

楽天Edy

(35)

楽天銀行デビットカード

(14)

nanacoカード

(8)

WAON

(2)

ジャパンネット銀行

(4)

ECサイト比較

(17)

majica カード

(5)

Tポイント

(3)

動画配信

(81)

デビットカード

(10)

PASMO

(2)

電気自由化

(2)

音楽配信

(9)

楽天ブックス

(9)

au WALLET

(9)

年末商戦

(4)

ふるさと納税

(2)

Yahooプレミアム会員特典

(7)

楽天ポイント獲得数報告

(5)

ポイント交換

(2)

クレカ入会特典

(6)

楽天市場

(7)

電子マネー

(12)

福袋・初売り

(2)

BABYMETAL

(7)

Yahooショッピング

(30)

Yahooクレジットカード

(6)

税金対策

(2)

楽天銀行プリペイドカード

(3)

楽天ペイ

(5)

ゾンビ

(4)

銀行カード

(2)

ヤフオク!

(1)

ポイント・キャンペーン

(23)

Amazon

(3)

Ponta

(2)

ギタリスト

(3)

プリペイドカード

(1)

クーポン・キャンペーン

(18)

暗号・分割・隠蔽

(2)

ガジェット

(43)

プログラミング

(15)

ネット銀行

(7)

Chrome 機能拡張

(1)

リアル銀行

(1)

数学と算数

(14)

格安SIM

(5)

将棋

(89)

クラウド

(14)

国語

(3)

ニュース

(26)

社会

(2)

電子決済

(2)

割引券

(0)

日記

(1)

TIPS

(4)

ソフトウェア

(18)

商品レビュー

(1)

映画視聴

(7)

洋楽

(2)

マンガ

(0)

お買い物パンダ

(1)

3Gケータイ3Gスマホ

(3)

互換オフィス

(4)

IT用語

(0)

地球温暖化

(53)

植民地時代

(0)

古代史

(1)

楽天ポイントビットコイン

(11)

ITの仕事

(1)

楽天購入品リスト

(0)

ご挨拶

(0)

楽天リワード

(1)

Visual Studio

(4)

wikipedia

(1)

コロナ

(1)

python

(4)

地球温暖化懐疑/否定論者

(14)

youtubeライブカメラ

(1)

自然災害

(4)

SNS

(1)

動物

(1)

楽天ブログ

(4)

藤岡幹大

(1)

グレタ

(2)

HTML

(1)

AIの活用

(0)

令和のコメ騒動

(2)

xEV

(2)

スポーツ

(1)

EV

(2)

VSCode

(0)

エネルギー

(1)

snowflake

(4)

Microsoft Copilot

(2)

VBA

(2)

Excel計算式

(1)

Windows

(1)

お気に入りブログ

【アンケート】楽天… New! 楽天家計簿スタッフさん

【重要】楽天写真館 … 楽天写真館スタッフさん

【新機能】ROOMで動… ROOM編集部さん

セルフレジで小銭を… ミスミ ジローさん

【楽天ポイントモー… 楽天ポイントモールさん

楽天ブログ StaffBlog 楽天ブログスタッフさん
楽天レシピスタッフB… 楽天レシピスタッフさん
楽天アフィリエイト… 楽天アフィリエイト事務局スタッフさん
楽天infoseeknewsス… infoseeknewsさん
インフォメーション… 楽天 ブックスさん

コメント新着

弱火の中火@ Re:ファイル名の先頭に指定文字を付加するバッチとな?(01/25) ひできちくん、最近楽天PLAYの記事見てな…

プロフィール

ひできち(hidekichi45)

ひできち(hidekichi45)


© Rakuten Group, Inc.
X
Mobilize your Site
スマートフォン版を閲覧 | PC版を閲覧
Share by: