Excel

CSVファイルを取り込んで並び替える

投稿日:2020年5月7日 更新日:

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]に出力されていることが確認できます。

今回の記事は以上です。

-Excel

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

Excelのリスト化でファイルが壊れる件

訳あってVBAでセルをリスト化する機会があり、今回はその時躓いたことを記事にしました。 [目次] 1.起こったバグ2.原因3.対処法 1.起こったバグ セルをリスト化するものとして、今回は以下のソース …

【SAS】SASで良く使うテクニック。その5 「SUM関数」~データセットの差分がいくつあるのか数えたい時~【Excel】

今回はSASで良く使うテクニックということで、データセットの差分がいくつあるのか数えたいときは「SUM関数」が役に立つ理由を解説していきます。 (参考:【SAS】SASで良く使うテクニック。その1 E …

【SAS】SASで良く使うテクニック。その7 「条件付き書式」~差分があるセルに色を付けたい時~【Excel】

今回はSASで良く使うテクニックということで、データセットのコンペアにおいて、差分があるセルに色を付けたい時ときは「条件付き書式」が役に立つ理由を解説していきます。 (参考:【SAS】SASで良く使う …

ActiveCellを使うと想定外の動きをする件【Excel】【VBA】

VBAでActiveCellを使ったコードを書いた際に、少し躓いたため今回記事にします。 まずは、シート上を以下のように準備します。A1セルはリスト化し、「1」「2」「3」が選択できる状態にします。 …

【SAS】SASで良く使うテクニック。その9 「Alt+E+S+V+E」~縦横の並び替えを行いたいとき~【Excel】

今回はSASで良く使うテクニックということで、縦横の並び替えを行いたい時は、「Alt+E+S+V+E」が役に立つ理由を解説していきます。 具体的な使用場面は、 データセットの場合、カラムは横並びですが …