У меня есть функция 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, так как мы не знаем типы данных заранее .