1

このマイクロソフトのブログ投稿によるとMS Office 2010 の場合、セルあたりの文字列の最大長は 32k です。これもテストで確認しました。問題は、その長さをはるかに超える文字列 (DNA シーケンス) があり、メイン シーケンスのどこにでも一致する可能性がある 32k+ シーケンス全体で DNA のサブシーケンスを照合していることです。つまり、「サブ文字列シーケンス」を「メイン文字列シーケンス」全体に文字列一致させる必要があるため、メインシーケンスを 32k チャックに単純に分割することはできません。明確でないことの 1 つは、VBA が 32k を超える文字列の処理をサポートするかどうか、または VBA が 32k を超える文字列の連結をサポートするかどうかです。つまり、「メイン文字列シーケンス」を行の N 列目に 32k のチャンクにチャンクします。

したがって、基本的に問題は、MS-Office 2010 がセルあたり最大 32k までの文字列しかサポートしていないことです。文字列の一致が機能するためには、フォーム全体で処理する必要がある文字列よりもはるかに大きな文字列があります。

4

1 に答える 1

5

VBA の動的文字列 (Dim x As String) は 2^31 文字を保持できるため、これで十分です。なぜセルに書き込んでいるのかわかりません。他の理由がなければ、すべて VBA で行います。どこで文字列を取得しているのかは明確ではありません。

以下は、偽の 40,000 文字の DNA シーケンスと偽の 5 文字の部分文字列を作成し、一方が他方の内部にある場所を見つけるコードです。

Sub FindDNASubString()

    Dim lRnd As Long
    Dim i As Long
    Dim sMain As String
    Dim sSub As String
    Dim vaLetters As Variant
    Dim lPos As Long

    Const lUPPER As Long = 3
    Const lLOWER As Long = 0

    vaLetters = Array("A", "C", "T", "G")

    'Create fake main string
    For i = 1 To 40000
        lRnd = Int((lUPPER - lLOWER + 1) * Rnd + lLOWER)
        sMain = sMain & vaLetters(lRnd)
    Next i

    'create fake substring
    For i = 1 To 5
        lRnd = Int((lUPPER - lLOWER + 1) * Rnd + lLOWER)
        sSub = sSub & vaLetters(lRnd)
    Next i

    'find position of sub in main
    lPos = InStr(1, sMain, sSub)

    MsgBox "Substring is at position " & lPos

End Sub
于 2010-12-27T17:27:13.517 に答える