VBAで、以下を行いたいです。
あるドライブのフォルダに、csvファイルが複数あります。全てのcsvのファイル名は、以下の形式です。
日本語5文字+数字5桁+日本語5文字+数字5桁
例として、あいうえお12345かきくけこ67890、のような感じです。
例で挙げた名前のファイルであれば、Excelファイルの最終行のA列に12345、B列に67890、C列にcsvファイルのB3セルの左から5文字めまでを、D列以降には、csvファイルのC1〜C20までをコピーします。
これをフォルダにあるcsvファイルの数だけ、行います。
教えて頂けます様に、よろしくお願いします。
No.1ベストアンサー
- 回答日時:
こんばんは。
最終行のA列に12345| B列に67890 |C列にcsvファイル
「B3セルの左から5文字めまで」
「D列以降には、csvファイルのC1〜C20まで」
をコピーします。
となっていますが、csvファイルのC1~C20 を、右横方向に埋めていくことだと推理してみました。
それと、文章的に不足している部分は、こちらの想像で補完しますが、試しにつくってみました。CSVをExcelで開けずに取り出すことを考えて作りました。
このような内容の前提で作りました。
file名:あいうえお12345かきくけこ67890.csv
A列 B列
12345 67890、
C列
B3セルの左から5文字めまで, 例:abcdefg
abcde
D列
C1〜C20 を、D列からW列までコピー
なお、一部、正規表現でファイル名を取得する所*は、多少、失敗を誘発する可能性があるところです。 必ず、その条件に当てはまらないと、データは取得できません。
'// 標準モジュールのみ対象。
Sub GetDataFromCSV()
'*******ユーザー設定 *******
Const mPATH As String = "C:\Users\Test1\" '末尾は必ず、¥を入れてく多剤。
If Right(mPATH, 1) <> "\" Then MsgBox "パス名に'\' がありません。", vbCritical: Exit Sub
Dim RegEx As Object
Dim FName As String
Dim Ary As Variant, a As String, b As String
Dim buf As Variant, buf2 As Variant
Dim Lr As Long, i As Long, j As Long, k As Long, m As Long
ReDim Ary(0)
Ary(0) = ""
FName = Dir(mPATH & "*.csv", vbNormal)
Do While FName <> ""
If FName <> "." And FName <> ".." Then
ReDim Preserve Ary(i) '動的変数にする
Ary(i) = mPATH & FName
i = i + 1
End If
FName = Dir
Loop
If UBound(Ary) < 1 Then MsgBox "ファイル名を取得出来ませんでした。", vbExclamation: Exit Sub
Lr = Cells(Rows.Count, 1).End(xlUp).Row '最後の行を探す
If Lr = 1 And Cells(1, 1).Value = "" Then Lr = 0
Dim objFS As Object
Set objFS = CreateObject("Scripting.FilesystemObject")
Dim Ms
Set RegEx = CreateObject("VBScript.RegExp")
With RegEx
.Global = True: .IgnoreCase = False: .MultiLine = True
End With
RegEx.Pattern = "([0-9]{5})"
Dim objText As Object
For j = 1 To UBound(Ary)
FName = Dir(Ary(j))
Set Ms = RegEx.Execute(FName)
If Ms.Count = 0 Then MsgBox "ファイル名取得に失敗しました。", vbExclamation: Exit Sub
a = Ms(0).SubMatches(0) '*
b = Ms(1).SubMatches(0) '*
Cells(j + Lr, 1).Value = a: Cells(j + Lr, 2).Value = b
Set objText = objFS.OpenTextFile(Ary(j), 1, 0)
Do While objText.AtEndOfLine <> True
buf = objText.Readline
buf2 = Split(buf, ",")
m = m + 1
If m = 3 Then Cells(j + Lr, 3).Value = Left$(buf2(1), 5)
Cells(j + Lr, m + 3).Value = buf2(2) 'C列
If m > 19 Then Exit Do '20過ぎたら離脱
Loop
objText.Close
m = 0
Next j
Set RegEx = Nothing
Set objFS = Nothing
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Access(アクセス) CSVファイルの「0落ち」にVBA 6 2023/02/02 15:27
- Excel(エクセル) エクセルのVBAについて とあるサイトのコードを参考に、CSVの文字化けを直すVBAを作成しているの 7 2022/11/04 14:15
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- Visual Basic(VBA) 複数csvを横に追加していくマクロについて 2 2023/04/25 09:19
- Access(アクセス) access,vbaでフォルダ内のファイルをテーブルにインポート、ファイル名もフィールドに追加したい 1 2022/08/31 11:11
- Visual Basic(VBA) VBAで特定の場所にあるCSVファイル(複数)から特定場所を抜き出してExcelに転記したいです。 11 2023/05/23 16:29
- その他(プログラミング・Web制作) データ解析ソフトRでのファイル入力read.csvがエラーになります 7 2022/03/27 22:11
- Visual Basic(VBA) サブフォルダ(データ)にある複数の.xlsxファイルのSheet3のA2セルの値で01から左側をB2 2 2022/08/14 15:46
- Visual Basic(VBA) VBA初心者です。電話番号の数字の前に0を表示させたいです。 2 2022/12/14 03:58
- Excel(エクセル) Excel VBAでフォルダが何層にもなっていて最下層の中にCSVファイルがあり最上層のファイルを指 4 2022/06/08 20:41
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセル初心者です 関数の入れ...
-
エクセルで二つの数字の小さい...
-
LOOKUP関数を使えばいいのでし...
-
VBAで文字列を数値に変換したい
-
PowerPointで表の1つの列だけ...
-
エクセルの表から正の数、負の...
-
エクセル 文字数 多い順 並...
-
エクセルで最初のスペースまで...
-
2つのエクセルのデータを同じよ...
-
Excelで半角の文字を含むセルを...
-
エクセルの項目軸を左寄せにしたい
-
Excel、市から登録している住所...
-
エクセル(勝手に太字になる)
-
50人を数回、グループ分けする...
-
エクセルで文字が混じった数字...
-
エクセルの並び変えで、空白セ...
-
オートフィルターをかけ、#N/A...
-
VBA 連続行データを5行ずつ隣の...
-
Excelで、A列にある文字がB列...
-
エクセルで2列のセルを連続して...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルで二つの数字の小さい...
-
PowerPointで表の1つの列だけ...
-
エクセルで最初のスペースまで...
-
2つのエクセルのデータを同じよ...
-
エクセル(勝手に太字になる)
-
「B列が日曜の場合」C列に/...
-
エクセル 文字数 多い順 並...
-
EXCELで 一桁の数値を二桁に
-
エクセル 同じ値を探して隣の...
-
VBAで文字列を数値に変換したい
-
エクセルの並び変えで、空白セ...
-
Excelで半角の文字を含むセルを...
-
エクセルで文字が混じった数字...
-
Excel、市から登録している住所...
-
A列がない・・・A列が非表示に...
-
エクセルの表から正の数、負の...
-
[関数得意な方]教えて下さい・...
-
エクセルの項目軸を左寄せにしたい
-
エクセル 時間帯の重複の有無
-
Excelにてある膨大なデータを管...
おすすめ情報