Excel

クラス - 文字列操作

StringBuffer もどきの文字列操作用クラスです。
主なメソッドは、文字列結合と文字列置換。

'--------------------------------
' 内部変数
'--------------------------------
Private xBufferString As String     ' 文字列バッファ

'--------------------------------
' 公開変数
'--------------------------------
Private xChars As Long              ' 文字数
Private xBufferSize As Long         ' バッファサイズ

'===============================================================================
'   Initialize / Terminate
'===============================================================================
Private Sub Class_Initialize()
    Call Clear
End Sub

Private Sub Class_Terminate()

End Sub

'===============================================================================
'   Public Method
'===============================================================================
Public Sub Append(AddText As String)

    ' 追加文字列の長さ取得
    Dim AddChars As Long
    AddChars = Len(AddText)

    ' 領域拡張
    Do While (xChars + AddChars > xBufferSize)
        xBufferString = xBufferString & String(xBufferSize, 0)
        xBufferSize = xBufferSize * 2
    Loop
    
    ' 編集
    Mid$(xBufferString, xChars + 1, AddChars) = AddText
    xChars = xChars + AddChars

End Sub

Public Sub AppendLine(AddText As String)
    Call Append(AddText & vbCrLf)
End Sub

Public Sub Clear()
    xChars = 0
    xBufferSize = 1024
    xBufferString = String(xBufferSize, 0)
End Sub

Public Sub Remove(Pos As Long, Chars As Long)
    xChars = xChars - Chars
    xBufferString = Mid$(xBufferString, 1, Pos - 1) & Mid$(xBufferString, Pos + Chars)
End Sub

Public Sub Replace(SearchText As String, ReplaceText As String)

    ' 文字列長の差分取得
    Dim DiffChars As Long
    DiffChars = Len(ReplaceText) - Len(SearchText)

    ' 文字列置換
    Dim p As Long
    Do While InStr(xBufferString, SearchText)
        ' 文字列探索
        p = InStr(xBufferString, SearchText)

        ' 置換
        xBufferString = Left$(xBufferString, p - 1) & ReplaceText & _
            Mid$(xBufferString, p + Len(SearchText))
        xChars = xChars + DiffChars
    Loop

End Sub

Public Function ToString() As String
    ToString = Mid$(xBufferString, 1, xChars)
End Function

'===============================================================================
'   Property
'===============================================================================
Public Property Get CharCount() As Long
    CharCount = xChars
End Property

Public Property Get Length() As Long
    Length = LenB(StrConv(Mid$(xBufferString, 1, xChars), vbFromUnicode))
End Property

Public Property Get BufferSize() As Long
    BufferSize = xBufferSize
End Property

文字列結合の性能調査を実施しました。
上段が StringBuffer クラスの Append メソッドを用いた結果で、
下段が & による単純結合(Text = Text & AddText といった具合)です。

各処理を 100 回ずつ行い、
Append メソッドの方が速い場合は青色、そうでない場合は赤色と塗り分けました。

  結合回数
10 100 1000
文字列長 10 0.02秒
0.01秒
0.03秒
0.01秒
0.30秒
0.34秒
100 0.02秒
0.01秒
0.05秒
0.03秒
0.45秒
2.70秒
1000 0.02秒
0.01秒
0.19秒
0.33秒
2.48秒
173.44秒
10000 0.16秒
0.03秒
2.22秒
18.03秒
33.91秒
1839.06秒

結合回数が 1000 回を超えるようであれば、文字列長に関わらず効果はあるようです。
あと StringBuffer もどきは処理爆発しにくいというのもメリットですね。