「"」で括られた範囲内の「,」を無視するCSVファイルの列数取得用関数を作成する

[Excel VBA]「"」で括られた範囲内の「,」を無視するCSVファイルの列数取得用関数を作成する

発端

発端は以下の記事。

いつものごとく安請け合いしたのでコーディング。

完成画像

f:id:wd4096:20190627204326p:plain

「"」に括られた「,」が列数のカウントから除外されているのが分かると思います。

コード

例によって?コード内のコメントで分かるように書いていますので、コメント以外の解説は省きます。

Option Explicit

Public Function pfCountColomns(strInput As String, strDelim1 As String, strDelim2 As String) As Long
'--------------------------------------------------------------------------------
'列数カウント関数
'--------------------------------------------------------------------------------
'引数
' strInput As String   :分割対象の文字列
' strDelim1 As String  :区切り文字1。区切り文字1同士で囲まれた範囲では区切り文字2を無視する
' strDelim2 As String  :区切り文字2
'戻り値
' 区切り文字で区切ったときの列数
'--------------------------------------------------------------------------------
Dim lngPos As Long      '文字列の検査位置
Dim isInner As Boolean  '優先度の高い区切り文字の中にいるかどうかフラグ
Dim lngCol As Long      '列数
Dim lngLen As Long      '対象文字列の文字通

    '対象文字列の長さ取得
    lngLen = Len(strInput)
    lngPos = 1
    isInner = False
    lngCol = 1

    '文字列がなくなるあまでループ
    Do While (lngPos <= lngLen)
        '現在位置の文字で分岐
        Select Case Mid(strInput, lngPos, 1)
            '区切り文字1
            Case strDelim1
                If isInner Then
                    '区切り文字1の中に居る場合、区切り文字1の終了
                    isInner = False
                Else
                    '区切り文字1の外に居る場合、区切り文字1の開始
                    isInner = True
                End If
                
            '区切り文字2
            Case strDelim2
                If isInner Then
                    '区切り文字1の中に居る場合、スキップ
                Else
                    '区切り文字1の外に居る場合、列数+1
                    lngCol = lngCol + 1
                End If
        End Select
        
        '検査位置を進める
        lngPos = lngPos + 1
    Loop

    '区切り文字1の中に居る場合、構文エラー
    If isInner Then
        MsgBox "構文エラー"
    End If

    '戻り値設定
    pfCountColomns = lngCol
End Function

反省点

「区切り文字1」と「区切り文字2」は順序を逆にして、かつ、2個目の区切り文字を「省略可能」にするべきでした。

というのも、「"」を無視したいな、という要望がきたときに呼び出し痔の引数指定だけで対応できるからです。

ちなみに、引数を省略できるようにするためには「optional」接頭辞を付与しますが、今回は説明を省略します。

ともあれ二宮さん。ふぁいと、おー、なのですよ。