Excel VBA, 2003 - Преобразование строки в двумерный массив - PullRequest
0 голосов
/ 14 февраля 2020

Я унаследовал старую электронную таблицу Excel (.xls), начиная с 2005 года.

По какой-то причине электронная таблица использует менеджер имен для довольно больших данных, хранящихся в виде строк, вместо ссылки на таблицу с данными. Это то, что я пытаюсь изменить, так что будет проще изменить данные, хранящиеся в настоящее время в менеджере имен (в настоящее время невозможно изменить какие-либо данные, так как лимит символов в менеджере имен как-то превышен) ,

Я хотел бы использовать как можно больше текущего кода VBA, поэтому у меня сейчас есть установка, в которой я использую VBA для преобразования данных из электронной таблицы в строку в виде

"CELL"\"CELL"\"...""CELL";"CELL"\"CELL"\"CELL";

Где я (или старый код) использую backsla sh, \ в качестве разделителя для нового столбца и точку с запятой, ;, в качестве разделителя для новой строки.

Я хочу преобразовать свою строку в двумерный массив с именем 'arkArray', чтобы я мог использовать следующий код:

arkCellData = arkArray(i, j)

Каков наилучший способ сделать это?

Ответы [ 2 ]

1 голос
/ 14 февраля 2020

Вот типичный метод:

Sub Fill2D()
    Dim s As String, r As Range
    Dim kolumn As Long, roww As Long
    Dim arr1, arr2, a1, a2

    kolumn = 0
    roww = 1
    s = "alpha\beta\gamma;mike\jim\john;red\blue\green"

    arr1 = Split(s, ";")

    For Each a1 In arr1
        roww = 1
        kolumn = kolumn + 1
        arr2 = Split(a1, "\")
        For Each a2 In arr2
            Cells(roww, kolumn) = a2
            roww = roww + 1
        Next a2
    Next a1

End Sub

enter image description here

(вы могли бы изменить начальные значения kolumn и roww чтобы выбрать другую начальную точку)

Как только двумерный массив окажется в ячейках, его нужно будет проверить, а затем скопировать во внутренний массив VBA.

0 голосов
/ 14 февраля 2020

Как сделать двумерный массив.

Sub test()
    Dim myArray(), vS, vS2
    Dim vMax()
    Dim s As String
    Dim myMax As Integer, i As Integer,  j As Integer
    Dim r As Long

    s = "apple\banana\John;some\reason\use\Tom;table\data\limit;"

    If Right(s, 1) = ";" Then
        s = Left(s, Len(s) - 1)
    End If

    vS = Split(s, ";")
    ReDim vMax(UBound(vS))

    For i = 0 To UBound(vS)
        vS2 = Split(vS(i), "\")
        vMax(i) = UBound(vS2) + 1
    Next i

    myMax = WorksheetFunction.Max(vMax)
    r = UBound(vS) + 1

    ReDim myArray(1 To r, 1 To myMax)

    For i = 1 To UBound(myArray)
        vS2 = Split(vS(i - 1), "\")
        For j = 1 To UBound(vS2) + 1
            myArray(i, j) = vS2(j - 1)
        Next j
    Next i
    Range("a1").Resize(r, myMax) = myArray


End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...