Нужна информация об ограничениях обработки и хранения строк в Excel и VBA - и предлагаемые обходные пути - PullRequest
1 голос
/ 27 декабря 2010

Согласно этому сообщению в блоге Microsoft максимальная длина строки на ячейку составляет 32 КБ для MS Office 2010;Я также подтвердил это с помощью тестирования.Проблема в том, что у меня есть строки (последовательности ДНК), которые значительно превышают эту длину, и я сопоставляю подпоследовательности ДНК на всей последовательности 32k +, которые могут совпадать в любом месте основной последовательности;Это означает, что я не могу просто разбить основную последовательность на 32-килобайтные чеки, поскольку мне нужно иметь возможность сопоставлять строку «последовательность-строка» со всей «последовательностью-строка-строка».Одна вещь, которая не ясна, - если VBA поддерживает обработку строк размером более 32 КБ, если VBA поддерживает конкатенацию строк, превышающую 32 КБ, что может быть обходным решением;Это означает, что я разделяю «последовательность основной строки» на 32 000 фрагментов в строке до N-го столбца, а затем, когда мне нужно обработать совпадение, просто объединяет строки в строке от столбца 1 до N-го, обрабатываетсопоставить, а затем сбросить временную «последовательность основных строк», хранящуюся в VBA.

Итак, в основном проблема заключается в том, что MS-Office 2010 поддерживает только строки на ячейку длиной до 32 КБ, и у меня естьстроки, которые намного больше, чем те, которые должны быть обработаны во всей форме, чтобы совпадение строк работало.

1 Ответ

5 голосов
/ 27 декабря 2010

Динамические строки VBA (Dim x As String) могут содержать 2 ^ 31 символов, так что вам должно быть хорошо. Я не уверен, почему вы пишете их в клетки. Если вам не нужно по какой-то другой причине, я бы сделал все это в VBA. Непонятно, где вы получаете строки.

Вот некоторый код, который создает поддельную последовательность ДНК из 40000 символов и поддельную подстроку из 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
...