XLOPER12 ведет себя как XLOPER при передаче массивов Variant со строками больше 255 - PullRequest
0 голосов
/ 01 мая 2020

У меня есть функция cpp, представленная как функция UDF в Excel, все отлично работает (вызов / взаимодействие) со всеми типами данных, кроме углового случая.

Вот пример VBA фрагмент что витрины беда. Следующий код работает нормально, если я использую скажем String Arrays вместо Variant Arrays. Единственный угловой случай, в котором он терпит неудачу, - это когда я использую массивы Variant с любой из составляющих, имеющих строку> 255 символов. Поскольку Variant является всеобъемлющим носителем, я должен убедиться, что мои пользователи не сталкиваются с проблемой при использовании того же самого с большими строками.

Вызов даже не касается кода функции xll, чтобы быть в состоянии отладить дальше. Может быть, это как-то связано со структурами данных в XLOPER12, но я проверил их как встроенные в https://github.com/keithalewis/xll12/blob/master/xll/XLCALL.H

Option Explicit

Public Function GetString(ByVal numChars As Long) As String

    Dim charCode As Long
    Dim myString As String
    Dim i As Long

    Const upperLimit As Long = 90
    Const lowerLimit As Long = 65

    myString = vbNullString

    For i = 1 To numChars
        charCode = Int((upperLimit - lowerLimit + 1) * Rnd + lowerLimit)
        myString = myString & Chr(charCode)
    Next

    GetString = myString
End Function
Private Sub Test3()
    Dim a As Variant
    Dim s() As String

    'USE CASE 1:PASS'
    ReDim a(1 To 2)
    a(1) = GetString(255)
    a(2) = GetString(255)
    a = Application.Run("fidPadArray", a, 2, 2, "")
    Debug.Print ("Fine with small string variant-arrays.")
    Erase a

    'USE CASE 2:PASS'
    a = GetString(300)
    a = Application.Run("fidPadArray", a, 2, 2, "")
    Debug.Print ("Fine with one big variant-string.")

    'USE CASE 3:PASS'
    ReDim s(1 To 2)
    s(1) = GetString(300)
    s(2) = GetString(300)
    a = Application.Run("fidPadArray", s, 2, 2, "")
    Debug.Print ("Fine with big string string-arrays.")

    'USE CASE 4: FAILS'
    On Error GoTo rescue:
    ReDim a(1 To 2)
    a(1) = s(1)
    a(2) = s(2)
    a = Application.Run("fidPadArray", a, 2, 2, "")
    Debug.Print ("Fine with big string variant-arrays.")
    Exit Sub
rescue:
    Debug.Print ("oops trouble:" & Err.Description)
End Sub

Приведенный выше пример кода VBA дает следующий вывод :

Fine with small string variant-arrays.
Fine with one big variant-string.
Fine with big string string-arrays.
oops trouble:Type mismatch

Как вы можете видеть, функция fidPadArray отлично работает во всех случаях, показанных выше case-1 (маленькие строковые массивы) / case-2 (одиночные большие строковый вариант) / case-3 (строковые массивы с большими строками). В то время как вариант case-4 с большими строками просто не работает с Type Mismatch.

У меня есть все регистрации XLOPER12 / XLOPER и xll, которые работали много лет, теперь у нас есть сценарий использования для вызова из VBA с использованием массивов Variant, так как мы не знаем типы данных заранее .

...