需要有关Excel和VBA字符串处理和存储限制的信息 - 以及建议的解决方法

时间:2010-12-27 16:20:31

标签: string excel vba dna-sequence

根据此Microsoft blog post,MS Office 2010的每个单元格的最大字符串长度为32k;我也通过测试证实了这一点。问题是我有远远超过这个长度的字符串(DNA序列),并且我在整个32k +序列上匹配DNA的子序列,它可以匹配主序列的任何地方;这意味着我不能简单地将主序列分解成32k卡盘,因为我需要能够将“子串序列”与整个“主串序列”进行字符串匹配。有一点不清楚的是,如果VBA支持处理大于32k的字符串,如果VBA支持超过32k的字符串连接,这可能是一种解决方法;意思是我将“主串序列”分成一行到第N列的32k块,然后当我需要处理匹配时,只需将第1列中的字符串连接到第N列,处理匹配,然后转储存储在VBA中的临时“主串序列”。

所以,基本上问题是MS-Office 2010只支持每个单元格的字符串长度达到32k,而且我的字符串比需要以整个形式处理的字符串要大得多,以便字符串匹配上班。

1 个答案:

答案 0 :(得分: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