プロが教える店舗&オフィスのセキュリティ対策術

以下のようなCSVファイルが複数あります。
VBAを実行するとファイル選択画面になり、複数のCSVファイルを選択して、
Sheet1に順番に読み込んでその際、2個目以降のCSVファイルでは1行目の項目名を破棄して、
2行目からのデータのみ繋げていくようにしたいです。
その時にG列の文字化けを防ぐため書式を文字として読み込み、
最終的にE列の2行目以降のデータにて昇順で並べ替えしたいです。

各CSVファイルには約1,500データほどあります。
一度に選択するCSVファイルは5~20個ほどです。

VBAでのプログラムを教えて頂けないでしょうか。

CSVファイル例
   A      B    C   D   E      F    G
1 顧客コード フリガナ  氏名  敬称 郵便番号   住所1  住所2  
2 000123  〇〇〇〇  〇▲  様  256-0000  〇〇県  1-3-5  
3 000124  ▲□▲〇  ◇●  様  258-3311  □▲県  2-6-9
4 000180  〇▲◇▲  ●▲  御中 258-3325  ●□県  3-8-2
5 000186  〇●▲〇  ●〇  様  258-8236  〇■県  2-4-4 
             ・
             ・
             ・

A 回答 (3件)

質問が多すぎて、またどこが分からないのか分かりませんねぇ。



http://www.moug.net/tech/exvba/0060086.html

このあたりを参考にしてみてはいかがでしょうか?

私なら
①選択ファイル数分ループ
②1ファイル目のみ全件読み込み、2ファイル目以降は一行目は読み飛ばしながら、あらかじめ用意した配列変数に入れる
③あとは読み込んだファイルをシートに出力
④書式やソートなどを最後に。

こんな感じでしょうか…。
    • good
    • 1
この回答へのお礼

返事が遅くなり申し訳ありません。
ご指摘の通り、内容が複雑すぎてました。
ご提案内容を参考にもう一度自分で考えてみます。
ご回答ありがとうございました。

お礼日時:2017/09/07 16:06

VBA使わないでやるやり方です。

(ぜんぜん質問の趣旨と違っててごめんなさい)

1.csvファイルをひとつのフォルダにまとめる。例えばc:\work
2.コマンドプロンプトを開く
3.上記のフォルダに移動する。 (cd c:\work)
4.コピーコマンドでcsvをひとつのテキストファイルにまとめる。(copy *.csv csvfile.txt)
5.できたテキストファイルをExcelで開く。列の書式を指定する。
6.ソートして、重複するヘッダ項目の行を削除する。
    • good
    • 3
この回答へのお礼

ご返事遅くなり申し訳ありません。
回答ありがとうございました。
当方、VBAでもう一度トライします。

お礼日時:2017/09/07 16:08

まあ、こんなところでしょうか?


ファイル選択・ダイアログは、マルチセレクトですから、複数のファイルを選べます。

'//標準モジュール
Sub ImportCSV_Sort()
 Dim Fnames As Variant
 Dim fn As Variant
 Dim FNo As Integer
 Dim TextLine As String
 Dim i As Long, j As Long, b As Long
 Dim buf
 Dim flg As Boolean
 Dim LastRow As Long
 Fnames = Application.GetOpenFilename _
   ("CSVFile (*.csv), *.csv", 1, "ファイルインポート", , True)
 If VarType(Fnames) = vbBoolean Then Exit Sub

 For Each fn In Fnames
  b = Cells(Rows.Count, 1).End(xlUp).Row
  If b > 2 Then flg = True
  '--
  FNo = FreeFile()
  Open fn For Input As #FNo
  If b = 1 Then
   i = 0 '先頭から
  Else
   i = 1
  End If
  Do While Not EOF(FNo)
   Line Input #FNo, TextLine
   buf = Split(TextLine, ",")
   For j = 1 To UBound(buf) + 1
    If j <> 7 Then
     Cells(b + i, j).Value = buf(j - 1)
    Else
     Cells(b + i, j).Value = "'" & buf(j - 1) 'プレフィックス文字列書式
    End If
   Next j
   If flg And i = 1 Then
    i = 0    '行を飛ばす
    flg = False
   End If
   i = i + 1
  Loop
  Close #FNo
 Next fn
 If MsgBox("ソートしますが、よろしいですか?", vbOKCancel) = vbCancel Then Exit Sub
 ActiveSheet.Sort.SortFields.Clear
 With ActiveSheet.Range("A1").CurrentRegion
  .Sort Key1:=.Cells(1, 5), Order1:=xlAscending, _
    Header:=xlYes, OrderCustom:=1, MatchCase:=False, _
    Orientation:=xlTopToBottom, SortMethod:=xlPinYin
 End With
End Sub
    • good
    • 2
この回答へのお礼

ご回答ありがとうございます。 ご返事が遅くなり申し訳ございません。
希望通りの動作が得られました。
ありがとうございました。

お礼日時:2017/09/11 14:42

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A