ここから本文です

仕事で月に一回、大きいCSVファイルを読み込んで 作業をしているのですが、c...

nor********さん

2020/7/406:25:56

仕事で月に一回、大きいCSVファイルを読み込んで

作業をしているのですが、csvを読みこむときに

文字列と標準に分ける作業がとても面倒です。

Excel VBAで一括できますでしょうか?

先頭列が 文字列であれば 文字列
標準であれば標準に 列 書式を設定したいです。

Excel VBAで簡単にできますでしょうか?

Excel VBA,test.csv&quot,文字列,標準,0 To UBound,RefreshStyle,For Input As

閲覧数:
31
回答数:
3

違反報告

ベストアンサーに選ばれた回答

Prometheusさん

2020/7/408:49:45

今は、マクロを走らせているブックが保存してあるフォルダの「Test.csv」というファイルを読み込む場合です。

Sub Sample()
Dim p As String, i As Long, x As String
Dim sh As Worksheet, qt As QueryTable
p = ThisWorkbook.Path
Open p & "\Test.csv" For Input As #1
Line Input #1, x
Close #1
a = Split(x, ",")
ReDim c(UBound(a))
For i = 0 To UBound(a)
If a(i) = "標準" Then
c(i) = 1
Else
c(i) = 2
End If
Next i
Set sh = ThisWorkbook.ActiveSheet
Set qt = sh.QueryTables.Add(Connection:="TEXT;" & p & "\Test.csv", Destination:=sh.Range("A1"))
With qt
.TextFilePlatform = 932
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.RefreshStyle = xlOverwriteCells
.TextFileColumnDataTypes = c
.Refresh
.Delete
End With
End Sub

簡単な説明ですが、その前に、今回の読み込みについての詳しい説明は、以下のサイトを参照してください(文字コードが違うなどについては、以下のサイトを見れば、訂正できます)。

https://www.tipsfound.com/vba/18014

p = ThisWorkbook.Path

まず、「p」にマクロを走らせているブックが保存されているフォルダを入れています。

したがって、固定のフォルダでしたら、「p = "D:\Programming\Test"」などと、質問者の環境に合わせてください。

Open p & "\Test.csv" For Input As #1

そのフォルダに保存されている「Test.csv」ファイルを、読み込み専用で開いています。

Line Input #1, x

1行読み込みます。

Close #1

閉じます。

a = Split(x, ",")

「Split()」関数は、配列変数に格納します。

たとえば、読み込んだ1行が、「標準,文字列,標準,文字列」だったとすると、「a(0) = "標準"」、「a(1) = "文字列"」、「a(2) = "標準"」、「a(3) = "文字列"」となります。

ReDim c(UBound(a))

配列変数を新規に作成します(「UBound()」は、配列変数の添え字(「()」内の数字)の最大値を返します。したがって、上記の場合でしたら、「a(3) = "文字列"」の「3」が返ってくるわけです)。

For i = 0 To UBound(a)
If a(i) = "標準" Then
c(i) = 1
Else
c(i) = 2
End If
Next i

「a」の値が、「標準」だったら、「c」に「1」を、それ以外(=「文字列」)の場合は、「c」に「2」を入れます。

Set sh = ThisWorkbook.ActiveSheet

マクロを走らせているブックのアクティブシート(前面に出ているシート)を、「sh」にセット。

Set qt = sh.QueryTables.Add(Connection:="TEXT;" & p & "\Test.csv", Destination:=sh.Range("A1"))

「csv」ファイルをセル「A1」から読み込みます。

もちろん、「p & "\Test.csv"」の部分が、読み込むファイルですので、質問者の環境に合わせてください。

With qt
.TextFilePlatform = 932
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.RefreshStyle = xlOverwriteCells
.TextFileColumnDataTypes = c
.Refresh
.Delete
End With

ここについては、サイトの説明をご覧ください。

そちらの方が分かりやすいです。

ただ、重要なのは、「.TextFileColumnDataTypes = c」の部分です。

ここでは、1列目から、「文字列(=「2」)」や「標準(=「1」)」などの設定ができるのですが、それを、先ほど作成した配列変数で設定しているところがミソです。

質問した人からのコメント

2020/7/4 08:54:10

回答ありがとうございます!

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

2020/7/407:59:39

2020/7/3と入力されているセルがExcelに読み込まれた時点で勝手にシリアル値にされてしまった場合、それを文字列にしたら44015になっちゃいますが、それは大丈夫ですか?

Sub test()
Range("A:A,B:B,E:F").NumberFormatLocal = "@"
End Sub

返信を取り消しますが
よろしいですか?

  • 取り消す
  • キャンセル

なかっちさん

2020/7/406:38:47

セルの書式設定を入れた雛形のシートを作って、それで読み込んだらだめなの?

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる