Пользовательская функция ИНДЕКС, которая может обрабатывать более 255 символов

Я пытаюсь использоватьApplication.Index функция с вариантом 2D Array, который содержит некоторые элементы, содержащие> 255 символов текста. Это приводит к типу Variant / IntegerType Mismatch ошибка. Я также не могу использоватьApplication.Transpose из-за превышения этого ограничения> 255 символов.

Кто-нибудь сделал что-нибудьCustom INDEX UDFunction который может обрабатывать> 255 символов текста, чтобы преодолеть этот предел?

например Изображение 93350

Код фрагмента выглядит так:

........
........
For j = 1 to NoOfSlides
    A = (j - 1) * (nRw * 2) + 1
    B = IIf(A >= UBound(Arr, 1), UBound(Arr, 1), (A + (nRw * 2)) - 1)
    If B > UBound(Arr, 1) Then B = UBound(Arr, 1)
    ab_Rng = Evaluate("row(" & A & ":" & B & ")")
    TmpArr(j) = Application.Index(Arr, ab_Rng, Array(1, 2))  ' Type Mismatch Error
    With oPres
        Set oSlide = .slides("Slide0_ABC").Duplicate
        oSlide.moveto toPos:=.slides.Count
        With oSlide
        ....
        End With

        If getDimensions(TmpArr(j))<2 Then 
            TmpArr(j) = Application.Transpose(TransposeDim(TmpArr(j)) )    ' Error
        End If
        For y = LBound(TmpArr(j), 1) To UBound(TmpArr(j), 1)
        .....
        Next y
    End With
Next j
........
........

Function getDimensions(var As Variant) As Long
    On Error GoTo Err

    Dim i As Long
    Dim tmp As Long

    i = 0
    Do While True
        i = i + 1
        tmp = UBound(var, i)
    Loop

Err:
    getDimensions = i - 1
    On Error GoTo 0
    Err.Clear

End Function


Function TransposeDim(v As Variant) As Variant
' Convert 1D Array to 2D Array (1 -Based)
    Dim x As Long, y As Long, Xupper As Long, Yupper As Long
    Dim tempArray As Variant

    on error resume next
    Xupper = UBound(v, 2)
    if err.number <>0 then
        Redim Preserve v(1 to ubound(v), 1 to 1)
       Xupper = UBound(v, 2)   
    endif
    on error goto 0

    Yupper = UBound(v, 1)

    ReDim tempArray(1 To Xupper, 1 To Yupper)
    For x = 1 To Xupper
        For y = 1 To Yupper
            tempArray(x, y) = v(y, x)
        Next y
    Next x

    TransposeDim = tempArray
End Function

Изменить: вот файл Sample.xlsm и образец шаблона PPT для любого прочтения.

# excel user-defined-functions transpose type-mismatch
Источник
  • 0
    Является ли index строкой, аргументом столбца, в котором вы передаете массив?
  • 0
    Функция Application.Index ожидает целое число для аргументов 2 и 3, а не строку или вариант. Вот откуда возникает несоответствие типов, а не передача строки> 255 символов. полезныйgyaan.wordpress.com/2013/06/12/… тогда как если вы ищете строку в массиве, то, вероятно, следует использовать функцию индекса / сопоставления
  • 0
    @Nathan_Sav Извините, я не понял, что вы имели в виду. Вы имеете в виду, передаю ли я одно или два измерения массива? Я просто передаю массив, созданный из диапазона Excel, содержащего данные.
  • 0
    Вы передаете массив в аргумент для столбца.
  • 0
    Да, он работает с большинством диапазонов, где текст в определенных ячейках имеет значение <= 255. Если он превышает этот предел, я получаю ошибку несоответствия типа. Так что я уверен, что это связано с превышением лимита> 255 символов.
  • 0
    @Nathan_Sav, я поделился образцом шаблона excel и ppt для вашего прочтения.
Codelisting
за 0 против
Лучший ответ

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

Arr = Sheet1.Range("A3:B8").Formula    ' a Variant/Variant array

INDEX ,TRANSPOSE ,MATCH и т. д., не будет работать и приведет кType MisMatch Error при достижении лимита> 255 символов. Я думаю, что он внутренне используетInteger index и поэтому поддерживает ограничение в 255 символов.

Однако, если я определил массивArr какString :

' Define Arr as a String
ReDim Arr(1 To UBound(VarRng.Formula, 1), 1 To UBound(VarRng.Formula, 2)) As String

For x = LBound(VarRng.Formula, 1) To UBound(VarRng.Formula, 1)
     For y = LBound(VarRng.Formula, 2) To UBound(VarRng.Formula, 2)
        Arr(x, y) = CStr(VarRng.Formula(x, y))
    Next y
Next x

'...тогдаINDEX ,TRANSPOSE ,MATCH и т.д., будут работать правильно, даже если в массиве> 255 символов.

' Define Arr as a String
ReDim Arr(1 To UBound(VarRng.Formula, 1), 1 To UBound(VarRng.Formula, 2)) As String

For x = LBound(VarRng.Formula, 1) To UBound(VarRng.Formula, 1)
     For y = LBound(VarRng.Formula, 2) To UBound(VarRng.Formula, 2)
        Arr(x, y) = CStr(VarRng.Formula(x, y))
    Next y
Next x
`Arr` is now a Variant/String
'....
'....
For j = 1 to NoOfSlides
    A = (j - 1) * (nRw * 2) + 1
    B = IIf(A >= UBound(Arr, 1), UBound(Arr, 1), (A + (nRw * 2)) - 1)
    If B > UBound(Arr, 1) Then B = UBound(Arr, 1)
    ab_Rng = Evaluate("row(" & A & ":" & B & ")")

    TmpArr(j) = Application.Index(Arr, ab_Rng, Array(1, 2))
'....
Next j

Sample.xlsm и образец шаблона PPT.pptx

Надеюсь это поможет.

за 0 против
Dim a(1 To 2, 1 To 2) As String
Dim o As String

a(1, 2) = "testing " & String(255, "x")

o = Application.Index(a, 1, 2)

Debug.Print Len(o)

Чтобы поддержать мой комментарий, вы не используетеindex правильно. Я думаю, тебе нужно использовать свойArray(1, 2)(0) а такжеArray(1, 2)(1)

  • 0
    У меня все еще не работает. Я разбиваю массив, созданный из диапазона строк, на набор из <= 10 строк каждая для выгрузки в таблицы слайдов. Если текст во 2-м столбце диапазона превышает 255 символов, код выдает Type Mismatch error . В остальном работает нормально. Вы хотите, чтобы я предоставил вам образец рабочей тетради и шаблон ppt для вашего ознакомления?
Codelisting
Популярные категории
На заметку программисту