VBA Excel: ошибка времени выполнения 13 при получении содержимого диапазона в массив - содержимое длинной ячейки - PullRequest
0 голосов
/ 07 июня 2019

Я пытаюсь получить содержимое строки в одномерный массив VBA. Я использовал самый простой способ получить содержимое строки:

1 - присвоение содержимого диапазона варианту Excel

2 - транспонировать массив дважды, чтобы получить от 2-х мерного до 1-мерного

Это прекрасно работает почти во всех моих строках, но я получаю ошибку времени выполнения 13 "Несоответствие типов", когда в одной из ячеек содержание длиннее 255 символов.

У вас есть какой-нибудь совет, как решить эту проблему?


Dim rowContent As Variant 
Dim lineCount As Long
Dim curLine As Long

lineCount = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(editWSName).Range("A:A")) - 2
For curLine = 3 To lineCount + 2
        rowContent = Application.Transpose(Application.Transpose(ThisWorkbook.Sheets(editWSName).Range(Cells(curLine, 2), Cells(curLine, colCount))))
        ...
Next curLine

Ответы [ 2 ]

1 голос
/ 07 июня 2019

Вот очень простой способ получить содержимое отдельной строки в одномерный массив:

Sub RowToArray()
    Dim rng As Range, s As String
    Dim msg As String

    Set rng = Rows("1:1").Cells
    s = Chr(1)

    With Application.WorksheetFunction
        arr = Split(.TextJoin(s, True, rng), s)
    End With

    msg = LBound(arr) & vbCrLf & UBound(arr)
    For Each a In arr
        msg = msg & vbCrLf & a
    Next a

    MsgBox msg
End Sub

enter image description here

Как видите, ячейка D1 , которая содержит более 300 символов, полностью захвачена.

0 голосов
/ 07 июня 2019

Так что мне удалось решить эту проблему, как рекомендовано Рори, я добавил сводный массив для заполнения моего окончательного массива.

Мое решение следующее:

    Dim lineCount As Long
    Dim colCount As Long
    Dim tempArray As Variant ' tableau temporaire
    Dim rowContent() As String ' array contenant le contenu de la ligne courante
    Dim i As Long
    ...

    lineCount = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(editWSName).Range("A:A")) - 2
    colCount = Application.WorksheetFunction.CountA(ThisWorkbook.Sheets(editWSName).Range("2:2"))
    fieldCodes = Application.Transpose(Application.Transpose(ThisWorkbook.Sheets(editWSName).Range(Cells(2, 2), Cells(2, colCount))))
    ReDim rowContent(1 To colCount - 1)

    ...

    For curLine = 3 To lineCount + 2
        tempArray = ThisWorkbook.Sheets(editWSName).Range(Cells(curLine, 2), Cells(curLine, colCount))
        For i = 1 To UBound(tempArray, 2)
            rowContent(i) = tempArray(1, i)
        Next i
        Set controlDict = controlLine(rowContent, fieldCodes)
        ...
    Next curLine
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...