aodama.gif(0.97KB) 文字列を結合する(Join)

 この StrJoin 関数は、StrSplit 関数とは逆に、 文字列変数配列の各要素をすべて結合し、その結果を返す関数です。 VB6の Join 関数とほぼ同等の機能を持ちますが、 StrJoin 関数は Join 関数と少々仕様が異なりますので気をつけて下さい。

Option Explicit

'一時的に結合文字列を格納するバッファの初期値。バッファサイズが
'足りなくなると同サイズ分バッファを増やします。
'値が小さすぎると遅くなり、大きすぎるとメモリを食います。
Public Const SJ_INIT_BUFSIZE = 32767

'----- StrJoin 関数 Ver 1.00 -----
'配列に含まれる各要素の文字列を結合して作成される文字列を返します。
'
'(C)けるべ 2000
'MAIL : NULL
'HOME : http://www.geocities.co.jp/SilkRoad/4511/
'
'引数 strList()
'   必ず指定します。結合する文字列を含む 1 次元配列を指定します。
'
'引数 strDelimiter
'   省略可能です。戻り値となる文字列を区切るのに使用する文字を
'   指定します。省略すると、リスト内のすべての項目が区切り文字なしで
'   連結されます。
'
'戻り値
'   成功した場合、引数 strList() で指定した配列の全ての要素を
'   結合した文字列を返します。
'
'文字列連結演算子(&, +)を使えば、こんなにごちゃごちゃ書かなくても
'簡単に書ける処理なのですが、文字列連結演算子は処理速度が激遅なので、
'Mid ステートメントで置換した方が圧倒的に速いのです(^^;
'
Public Function StrJoin _
    (ByRef strList() As String, _
     Optional ByVal strDelimiter As String) As String

 Dim strRet As String         '置き換えられる文字列バッファ
 Dim lngBufSize As Long       '置き換えられる文字列バッファ strRet のサイズ
 Dim lngTotalSize As Long     '結合された文字列の総サイズ
 Dim lngStrSize As Long       '結合される文字列のサイズ
 Dim lngArraySize As Long     '配列 strList 要素の最大値
 Dim lngDelimiterSize As Long '区切り文字のサイズ
 Dim i As Long                'ループカウンタ
 
    lngBufSize = SJ_INIT_BUFSIZE                  'バッファサイズの初期値を取得
    strRet = String$(SJ_INIT_BUFSIZE, vbNullChar) 'SJ_INIT_BUFSIZE サイズのバッファを確保
    lngArraySize = UBound(strList)                '配列 strList 要素の最大値を取得
    lngDelimiterSize = Len(strDelimiter)          '区切り文字 strDelimiter のサイズを取得
    
    For i = LBound(strList) To lngArraySize Step 1                          '配列要素の数だけループ
        lngStrSize = Len(strList(i))                                        '配列要素が存在する場合
        If lngStrSize Then
            If lngTotalSize + lngStrSize > lngBufSize Then                  'バッファのサイズが足りない場合
                If lngStrSize <= SJ_INIT_BUFSIZE Then                       '配列要素のサイズが SJ_INIT_BUFSIZE 以下の場合
                    strRet = strRet + String$(SJ_INIT_BUFSIZE, vbNullChar)  'バッファサイズを SJ_INIT_BUFSIZE 増やす
                    lngBufSize = lngBufSize + SJ_INIT_BUFSIZE
                Else                                                        '配列要素のサイズが SJ_INIT_BUFSIZE より多い場合
                    strRet = strRet + String$(lngStrSize, vbNullChar)       'バッファサイズを lngStrSize 増やす
                    lngBufSize = lngBufSize + lngStrSize
                End If
            End If
            Mid(strRet, lngTotalSize + 1, lngStrSize) = strList(i)          'バッファを配列要素に置き換える
            lngTotalSize = lngTotalSize + lngStrSize                        '置き換え総サイズを計算
        End If
        If lngDelimiterSize And (i <> lngArraySize) Then                    '区切り文字が指定されている && 最後の要素ではない場合
            If lngTotalSize + lngDelimiterSize > lngBufSize Then            'バッファのサイズが足りない場合
                If lngDelimiterSize <= SJ_INIT_BUFSIZE Then                 '区切り文字のサイズが SJ_INIT_BUFSIZE 以下の場合
                    strRet = strRet + String$(SJ_INIT_BUFSIZE, vbNullChar)  'バッファサイズを SJ_INIT_BUFSIZE 増やす
                    lngBufSize = lngBufSize + SJ_INIT_BUFSIZE
                Else                                                        '区切り文字のサイズが SJ_INIT_BUFSIZE より多い場合
                    strRet = strRet + String$(lngDelimiterSize, vbNullChar) 'バッファサイズを lngDelimiterSize 増やす
                    lngBufSize = lngBufSize + lngDelimiterSize
                End If
            End If
            Mid(strRet, lngTotalSize + 1, lngDelimiterSize) = strDelimiter  'バッファを区切り文字に置き換える
            lngTotalSize = lngTotalSize + lngDelimiterSize                  '置き換え総サイズを計算
        End If
    Next i

    If lngTotalSize Then StrJoin = Left$(strRet, lngTotalSize)              'バッファを実際のサイズに削り、戻り値とする

End Function

サンプル : ダウンロード strjoin.lzh(2.93KB)

strArray(0) = "ねずみ"
strArray(1) = "牛"
strArray(2) = "虎"
strArray(3) = "うさぎ"
strArray(4) = "竜"
strArray(5) = "へび"
strArray(6) = "馬"
strArray(7) = "羊"
strArray(8) = "さる"
strArray(9) = "にわとり"
strArray(10) = "犬"
strArray(11) = "いのしし"
を StrJoin 関数で結合します。
strResult = StrJoin(strArray(), ",")
結果はこうなります。
strResult = "ねずみ,牛,虎,うさぎ,竜,へび,馬,羊,さる,にわとり,犬,いのしし"


VBコーナーにもどる   トップページにもどる