4
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

EXCEL VBA -文字列の高速結合

Posted at

#EXCEL VBA 文字列の連結について
 EXCEL VBAでよく問題になるのが文字列の結合です。
 少量なら問題ないですが、CSVなどを出力するプログラムなどで大量の文字を結合するようになると処理が極端に遅くなります。
 
#文字列結合の高速化
 文字列結合の高速化方法についての詳細は他のブログなどでも紹介されているので、ここでは細かいことは省きます。
 要はメモリをあらかじめ確保しておき、Midステートメントを使用し、確保したメモリに文字を埋め込むという作業をしています。

 EXCEL VBAで大量の文字を扱うときは下記のStringBuilderクラスをインポートして使用して下さい。
 

StringBuilder.cls
Option Explicit

Private m_len As Long '実際の文字列の長さ
Private m_bufLen As Long 'バッファーの長さ
Private m_buffer As String 'バッファー
Private m_bufPos As Long 'バッファーの書き込み位置

Public Function ToString() As String
    ToString = Left$(m_buffer, m_bufPos)
End Function

Private Sub Class_Initialize()
    m_len = 0
    m_bufLen = 0
    m_bufPos = 0
End Sub

Public Sub AppendLine(app As String)
    Append app & vbCrLf
End Sub

Public Sub Append(app As String)
    Dim appLen As Long
    Dim appBufLen As Long
    
    appLen = Len(app)
    
    '-- バッファ管理
    If (m_bufLen < m_bufPos + appLen) Then
        appBufLen = (appLen \ 4096) * 4096 + 4096
        m_bufLen = m_bufLen + appBufLen
        m_buffer = m_buffer & String(appBufLen, Chr(0))
    End If
    
    '-- 文字列挿入
    Mid$(m_buffer, m_bufPos + 1, appLen) = app
    m_bufPos = m_bufPos + appLen

End Sub


4
12
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
12

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?