VBAを使用してCSVの取込・出力を行う方法

ヘッダー広告
スポンサードリンク
システム開発を行っているとCSV操作を行う機会はかなり多くあると思います。
もちろんEXCEL・ACCESSのVBAでもCSVファイルを取り込んだり、または出力したりする機能を開発する機会は多くあります。
今回はVBAでCSVファイルを取り込んだり出力したりする方法についてサンプルコードをお伝えしたいと思います。

CSVファイルの取込


早速ですが、VBAでCSVファイルを取り込むには私は以下のような方法で実現しています。
クラスを使っているのですが、慣れるとかなり便利ですので、出来れば積極的に使うことをおすすめします。

取り込む対象のファイルはこのような形式のファイルを想定しています。

CSVファイル取込クラス


まずCSV取込クラスのご紹介です。

Option Explicit

Private m_FilePath As String
Private m_SheetName As String
Private m_StartRow As Long
Private m_ColmCount As Long
Private m_SepChar As Variant
Private m_Data() As String
Private m_DataCount As String

'入力ファイルパス
Public Property Get FilePath() As String
  FilePath = m_FilePath
End Property
Public Property Let FilePath(ByVal newFilePath As String)
  m_FilePath = newFilePath
End Property

'入力開始行
Public Property Get StartRow() As Long
  StartRow = m_StartRow
End Property
Public Property Let StartRow(ByVal newStartRow As Long)
  m_StartRow = newStartRow
End Property

'列数を指定
Public Property Get ColmCount() As Long
  ColmCount = m_ColmCount
End Property
Public Property Let ColmCount(ByVal newColmCount As Long)
  m_ColmCount = newColmCount
End Property

'区切り文字
Public Property Get SepChar() As Variant
  SepChar = m_SepChar
End Property
Public Property Let SepChar(ByVal newSepChar As Variant)
  m_SepChar = newSepChar
End Property

'データ件数
Public Property Get DataCount() As Long
  DataCount = m_DataCount
End Property


'データの出力
Public Property Get Data(ByVal Row As String, ByVal Colm As String) As String
  Data = m_Data(Row, Colm)
  
End Property

Public Sub doAction()
  
  Dim i As Long
  Dim j As Long
  Dim DataCount As Long
  Dim Cnt As Long
  Dim intNo As Integer
  Dim Data As String
  Dim SplitString() As String
  
  DataCount = CreateObject("Scripting.FileSystemObject").OpenTextFile(m_FilePath, 8).Line
  If DataCount - m_StartRow <= 0 Then
    Exit Sub
  End If
  
  ReDim m_Data(DataCount - 1 - m_StartRow, ColmCount - 1)
  
  intNo = FileSystem.FreeFile()
  Open m_FilePath For Input As #intNo
  
  i = 0
  Data = ""
  Cnt = 0
  Do Until EOF(intNo)
    Line Input #intNo, Data
    
    If i >= m_StartRow Then
        
        SplitString = Split(Data, SepChar)
        For j = 0 To UBound(SplitString)
          If j >= ColmCount Then
            Exit For
          End If
          m_Data(Cnt, j) = SplitString(j)
        Next j
      
      Cnt = Cnt + 1
    End If
    i = i + 1
  Loop
  
	  m_DataCount = Cnt
  
  'ファイルクローズ
  Close #intNo

End Sub

クラスを操作するプロシージャ


こちらは上記で作成したクラスファイルを呼び出すプロシージャとなります。

<br>
Option Explicit

Private Const FILE_PATH As String = "C:\Temp\Data.txt"
Private Const IN_COLM_COUNT As Long = 3

Public Sub Sample()
    
    Dim ImpCsv As ImportCSV
    Dim i As Long

    '入力ファイルの取込
    Set ImpCsv = New ImportCSV
  
    ImpCsv.FilePath = FILE_PATH
    ImpCsv.StartRow = 1
    ImpCsv.SepChar = ","
    ImpCsv.ColmCount = IN_COLM_COUNT
    ImpCsv.doAction
     
    With ThisWorkbook.Worksheets("Sheet1")
    
        For i = 0 To ImpCsv.DataCount - 1
                
            .Cells(i + 1, 1) = ImpCsv.Data(i, 0)
            .Cells(i + 1, 2) = ImpCsv.Data(i, 1)
            .Cells(i + 1, 3) = ImpCsv.Data(i, 2)
            
        Next
    
    End With
    
    Set ImpCsv = Nothing
    
End Sub

プログラム説明


●ImportCSVクラス
 1.ImportCSVクラスのプロパティ
  ImportCSVクラスには以下項目のゲッター・セッターを用意しています。

                          
フィールド名フィールド説明
FilePath取込対象ファイルのフルパスを設定します。
StartRow取込を開始する行を設定します。
ColmCountデータ項目数を設定します。
SepChar項目ごとの区切り文字を設定します。
DataCount取り込んだ結果のデータ件数を出力します。
Data取り込んだデータを出力します。2次元配列で出力対象データを選択します。

 2.ImportCSVクラスのメソッド
  ImportCSVクラスのセッタープロパティ設定後はdoActionメソッドを呼び出してCSVを取り込みます。

以上がImportCSVクラスの説明となります。シンプルなクラスとなっています。

●Sampleプロシージャ
 こちらはImportCSVクラスにデータ形式を設定し、doActionを実行、結果を出力するというだけの処理です。
 クラスを使っていることから、可読性の高いプログラムとなっていると思います。

このようにVBAでCSVファイルを取り込むことが可能です。
今はEXCELに出力するようなプログラムとなっていますが、Sampleプロシージャを少し変更することで、ACCESSに出力することも可能です。
また、カンマ区切りではなく、タブ区切りになった場合には、SepCharプロパティに『vbTab』を設定してあげれば、ImportCSVクラスを修正することなく実現が可能です。

CSVファイルの出力


続いて、VBAでCSVファイルを出力するには以下のような方法で実現しています。
こちらもクラスを使って色々な案件に使えるように汎用化し、プログラムの作成工数を抑えるようにしています。

出力対象のデータはこのようなデータを想定しています。
今回はEXCELのシートにあるデータを出力します。

CSVファイル出力クラス


まずCSV出力クラスのご紹介です。

Option Explicit

Private m_DirPath As String
Private m_FileName As String
Private m_SheetName As String
Private m_StartRow As Long
Private m_EndRow As Long
Private m_StartColm As Long
Private m_EndColm As Long
Private m_SepChar As String

Private m_HeaderOut As Boolean

'出力先フォルダ
Public Property Get DirPath() As String
  DirPath = m_DirPath
End Property

Public Property Let DirPath(ByVal newDirPath As String)
  m_DirPath = newDirPath
End Property

'出力ファイル名
Public Property Get FileName() As String
  FileName = m_FileName
End Property

Public Property Let FileName(ByVal newFileName As String)
  m_FileName = newFileName
End Property

'対象シート名
Public Property Get SheetName() As String
  SheetName = m_SheetName
End Property
Print
Public Property Let SheetName(ByVal newSheetName As String)
  m_SheetName = newSheetName
End Property

'出力開始行
Public Property Get StartRow() As Long
  StartRow = m_StartRow
End Property

Public Property Let StartRow(ByVal newStartRow As Long)
  m_StartRow = newStartRow
End Property

'出力終了行
Public Property Get EndRow() As Long
  EndRow = m_EndRow
End Property
Print
Public Property Let EndRow(ByVal newEndRow As Long)
  m_EndRow = newEndRow
End Property

'出力開始列
Public Property Get StartColm() As Long
  StartColm = m_StartColm
End Property
Print
Public Property Let StartColm(ByVal newStartColm As Long)
  m_StartColm = newStartColm
End Property

'出力終了列
Public Property Get EndColm() As Long
  EndColm = m_EndColm
End Property
Print
Public Property Let EndColm(ByVal newEndColm As Long)
  m_EndColm = newEndColm
End Property

'区切り文字
Public Property Get SepChar() As String
  SepChar = m_SepChar
End Property
Print
Public Property Let SepChar(ByVal newSepChar As String)
  m_SepChar = newSepChar
End Property

Public Sub doAction()
  
  Dim i As Long
  Dim j As Long
  Dim intNo As Integer
  Dim Data As String
  
  intNo = FileSystem.FreeFile()
  Open DirPath & FileName For Output As #intNo

  For i = m_StartRow To m_EndRow
  
    Data = ""
    For j = m_StartColm To m_EndColm
      Data = Data & ThisWorkbook.Worksheets(m_SheetName).Cells(i, j) & ","
    Next
    Data = Left(Data, Len(Data) - 1)
    Print #intNo, Data

    StartRow = StartRow + 1
  Next
  
  'ファイルクローズ
  Close #intNo

End Sub


CSV出力クラスを操作するプロシージャ


こちらは上記で作成したCSV出力クラスファイルを呼び出すプロシージャとなります。

Option Explicit

Private Const OUT_DIR_PATH As String = "C:\temp\"
Private Const FILE_NAME As String = "OutData.txt"
Private Const IN_COLM_COUNT As Long = 3

Public Sub SampleOut()

    Dim MakeCsv As MakeCsv
    Dim i As Long

    '入力ファイルの取込
    Set MakeCsv = New MakeCsv
    
    MakeCsv.DirPath = OUT_DIR_PATH
    MakeCsv.FileName = FILE_NAME
    MakeCsv.SheetName = "Sheet1"
    MakeCsv.StartRow = 1
    MakeCsv.EndRow = 4
    MakeCsv.SepChar = ","
    MakeCsv.StartColm = 1
    MakeCsv.EndColm = 3
    MakeCsv.doAction
    
    Set MakeCsv = Nothing
    
End Sub


プログラム説明


●MakeCSVクラス
 1.MakeCSVクラスのプロパティ
  MakeCSVクラスには以下項目のゲッター・セッターを用意しています。

                                
フィールド名フィールド説明
DirPathCSVファイルを出力するパスを設定します。
FileName出力するCSVファイルのファイル名を設定します。
SheetName出力したいデータが存在するシート名を設定します。
StartRow出力するデータが開始する行を設定します。
EndRow出力するデータが終了する行を設定します。
StartColm出力するデータが開始する列を設定します。
EndColm出力するデータが終了する列を設定します。
SepChar出力する際の区切り文字を設定します。

 2.MakeCSVクラスのメソッド
  MakeCSVクラスのセッタープロパティ設定後はdoActionメソッドを呼び出してCSVを出力します。
  MakeCSVクラスはImportCSVクラスと異なり、クラス自体がシートからデータを取得するようになっています。

以上がMakeCSVクラスの説明となります。こちらもシンプルなクラスとなっています。

●SampleOutプロシージャ
 こちらはMakeCSVクラスにデータ形式を設定し、doActionを実行するだけの処理です。
 CSVの取込時より更に簡単な処理となっており、より可読性の高いプログラムとなっていると思います。

CSV出力も取込と同様にMakeCSVクラスのパラメータに設定する値を変更することで、簡単に求めているデータ形式のCSVファイルが作成することが出来ます。

これが私が行っているVBAでのCSV操作になります。
是非ご参考にしていただき、VBAでCSV操作を行ってください。
フッター広告

スポンサードリンク



シェアする

  • このエントリーをはてなブックマークに追加

フォローする