VBAでCSVファイルを取り込んで並び替える処理を記事にします。
CSVファイルとマクロ有効ファイルを一つずつ準備します。
in00.csvの中身は以下の内容で準備します。
[ボタンシート]にマクロを呼び出すためのボタンを3つ準備します。
CSVファイルの中身を張り付けるための [貼り付けシート]を準備します。
F列に「=IF(COUNTIF(A1,”*日*”),1,0)」のように、Excel関数が入力された[並び替え前シート]を準備します。
A列の文字列に”日”が含まれているか確認し、含まれている場合は1を返し、含まれていない場合は0を返します。
[並び替え後シート]を準備します。[並び替え前シート]のF列の値を降順として、A列の文字列を並び替え、[並び替え後シート]に持ってきます。
続いてソースコードを準備していきます。
ボタンシート(Sheet1)上のボタンは各プロシージャを呼び出します。
'Sheet1
Private Sub CommandButton1_Click() '貼り付けボタン
Call 貼り付け
End Sub
Private Sub CommandButton2_Click() '並び替えボタン
Call 並び替え前
Call 並び替え後
End Sub
Private Sub CommandButton3_Click() 'csv出力ボタン
Call csv出力
End Sub
CSVファイルの中身を1行ずつ[貼り付けシート]のA列に貼り付けていきます。(Module1)
'Module1
Option Explicit
Sub 貼り付け()
Dim buf As String
Dim tmp As String
Dim i As Integer
Dim ws As Worksheet
i = 1
'このファイルパス内のin00.csvを#1として読み取りで開く
Open ThisWorkbook.Path & "\in00.csv" For Input As #1
'最終行まで読み取る
Do Until EOF(1)
'#1の一文をbufに代入
Line Input #1, buf
tmp = buf
'貼り付けシートをwsとする
Set ws = Worksheets("貼り付け")
'tmpをwsシート(貼り付け)の(A,i)に書き込む
ws.Range("A" & i) = tmp
'カウントアップ
i = i + 1
Loop
Close #1
End Sub
[並び替え前()]プロシージャは[貼り付けシート]の内容を[並び替え前]シートに移します。この際、[並び替え前]シートのF列が0または1となります。(Module2)
'Module2(前半)
Sub 並び替え前() '"貼り付け"シートの内容を"並び替え前"シートに移す
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim i As Integer
i = 1
'貼り付けシートをws1とする
Set ws1 = Worksheets("貼り付け")
'並び替えシートをws2とする
Set ws2 = Worksheets("並び替え前")
'ws1(貼り付け)のA列が空白になるまで繰り返す
Do While ws1.Range("A" & i).Value <> ""
'ws1(貼り付け)のA列の値をws2(並び替え)のA列に移す
ws2.Range("A" & i).Value = ws1.Range("A" & i).Value
'カウントアップ
i = i + 1
Loop
End Sub
[並び替え後()]プロシージャは[並び替え前シート]の中身を並び替えて[並び替え後シート]に貼り付けていく。[並び替え前シート]のF列が1だった場合は[並び替え後シート]の上から敷き詰めていく。
'Module2(後半)
Sub 並び替え後() '"並び替え前"シートの中身を並び替えて"並び替え後"シートに貼り付けていく。
Dim ws2 As Worksheet
Dim ws3 As Worksheet
Dim i As Integer
Dim j As Integer
i = 1
j = 1
'並び替え前シートをws2とする
Set ws2 = Worksheets("並び替え前")
'並び替え後シートをws3とする
Set ws3 = Worksheets("並び替え後")
Do While ws2.Range("A" & i).Value <> "" '"並び替え前"シートのA列の値が空白になるまで見ていく
If ws2.Range("F" & i).Value = 1 Then 'F列の値が1なら
ws3.Range("A" & j).Value = ws2.Range("A" & i).Value
ws3.Range("F" & j).Value = ws2.Range("F" & i).Value
j = j + 1 '"並び替え後"シートの行を一つずらす
End If
i = i + 1 '"並び替え前"シートの行を一つずらす
Loop
i = 1
Do While ws2.Range("A" & i).Value <> "" '"並び替え前"シートのA列の値が空白になるまで見ていく
If ws2.Range("F" & i).Value = 0 Then 'F列の値が0なら
ws3.Range("A" & j).Value = ws2.Range("A" & i).Value
ws3.Range("F" & j).Value = ws2.Range("F" & i).Value
j = j + 1 '"並び替え後"シートの行を一つずらす
End If
i = i + 1 '"並び替え前"シートの行を一つずらす
Loop
End Sub
[in00_out.csv]を新規作成し、[in00_out.csv]に[並び替え後シート]の中身を出力していく。(Module3)
'Module3
Sub csv出力()
Dim ws3 As Worksheet 'ワークシート型のws3を宣言
Dim j As Integer
Set ws3 = Worksheets("並び替え後")
j = 1
Open ThisWorkbook.Path & "\in00_out.csv" For Output As #1 '出力用として"\in00_out.csv"を開く
Do While ws3.Range("A" & j).Value <> "" 'A列が空白になるまで
Print #1, ws3.Range("A" & j).Value & vbCr; 'A列の値をcsvファイルに記述していく
j = j + 1 'jをカウントアップ(行を一つずらす)
Loop
Close #1 '"\in00_out.csv"を閉じる
End Sub
[貼り付け]ボタンをクリックします。
[貼り付けシート]上にCSVファイルの中身が張り付けられたことが確認できます。
[並び替え]ボタンをクリックします。
[貼り付けシート]の中身が[並び替え前シート]のA列に転記され、”日”を含む場合はF列が1を返していることが確認できます。
[並び替え後シート]を見ると、F列をもとに降順で並び替えられていることが確認できます。(”日”を含むキーワードが上に来ている。)
[csv出力]ボタンをクリックします。
[in00_out.csv]ファイルが新規作成されていることが確認できます。
[並び替え後シート]のA列が[in00_out.csv]に出力されていることが確認できます。
今回の記事は以上です。