2010-12-27 10 views
1

Entsprechend dieser Microsoft blog post die maximale Zeichenfolge Länge pro Zelle beträgt 32 KB für MS Office 2010; Das habe ich auch durch Tests bestätigt. Das Problem ist, dass ich Strings (DNA-Sequenzen) habe, die deutlich über dieser Länge liegen, und ich passe Untersequenzen von DNA auf die gesamte 32k + -Sequenz an, die überall in der Hauptreihe passen könnte; Das bedeutet, dass ich die Hauptreihe nicht einfach in 32k Chucks zerlegen kann, da ich in der Lage sein muss, die "Sub-String-Sequenz" an die gesamte "Main-String-Sequenz" anzupassen. Eine Sache, die nicht klar ist, ist, wenn VBA die Verarbeitung von Zeichenfolgen unterstützt, die größer als 32 KB sind, wenn VBA Zeichenkettenverkettung von mehr als 32 KB unterstützt, die möglicherweise ein Problem darstellen; das heißt, ich zerschneide die "Main-String-Sequenz" in 32k Chunks in einer Zeile mit der N-ten Spalte, dann, wenn ich eine Übereinstimmung verarbeiten muss, verkette einfach die Strings in einer Reihe von Spalte 1 bis zum N-ten match, dann lege die temp "main-string-sequence" ab, die in VBA gespeichert ist.Benötigen Sie Informationen zu Excel und VBA-Zeichenfolge Verarbeitung und Speicherlimits - und empfohlene Problemumgehungen

Also, im Grunde ist das Problem, MS-Office 2010 unterstützt nur Strings pro Zelle bis zu 32k Länge, und ich habe Strings, die viel größer sind als die, die in der ganzen Form für die Zeichenfolge verarbeitet werden müssen passend zur Arbeit.

Antwort

5

VBA dynamische Zeichenfolgen (Dim x As String) können 2^31 Zeichen enthalten, also sollten Sie gut dort sein. Ich bin mir nicht sicher, warum du sie in Zellen schreibst. Wenn Sie es aus einem anderen Grund nicht benötigen, würde ich alles in VBA tun. Es ist nicht klar, wo Sie die Saiten bekommen.

Hier ist ein Code, der eine gefälschte DNA-Sequenz mit 40.000 Zeichen und eine gefälschte 5-stellige Teilzeichenfolge erstellt und dann findet, wo sich die eine innerhalb der anderen befindet.

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 
+0

(+1 und ausgewählt als Antwort.) Danke, das ist eine super Antwort basierend auf den Informationen, die ich geben konnte - wieder, danke! – blunders