Patrice T Ответов: 3

Проблема с совместимостью VBA в libre office calc


Всем привет,
У меня есть книга Excel с макросами VBA, с ней нет никаких проблем в Excel.
Когда я пытаюсь открыть его на LO Calc, у меня возникает много проблем с совместимостью, я исправил их все, кроме 1.
Я исправил такие проблемы, как условная компиляция (#If ... #End If) несовместимость.
Я использую Libre Office 6.1 Calc.
Я использую Libre Office 6.3 Calc.

Я получил 1 оставшуюся ошибку в этом коде:
Function Extract(Chaine, Optional Pos = 1, Optional Balise)
    If IsNumeric(Chaine) Then
        ' c'est numerique, on retourne la valeur
        Extract = Chaine
        Exit Function
    End If
    Set re = CreateObject("VBScript.RegExp")
    re.Global = True
    If IsMissing(Balise) Then
        '   pas de balise, on cherche les valeurs numeriques
        re.pattern = "[0-9,.]+"

        Set A = re.Execute(Chaine)  ' Error here
        If A.Count >= Pos Then Extract = val(Replace(A(Pos - 1), ",", "."))
    Else
        '   la balise sert de séparateur
        re.pattern = Balise
        B = Strings.Split(re.Replace(Chaine, vbNullChar), vbNullChar)
        If B.Count >= Pos Then Extract = val(Replace(B(Pos - 1), ",", "."))
    End If
End Function

сообщение об ошибке:
Erreur d'exécution BASIC.
'1'

Type: com.sun.star.script.CannotConvertException
Message: [automation bridge]UnoConversionUtilities<T>::anyToVariant 
Cannot convert the value of type :"com.sun.star.uno.XInterface"  to the expected Automation type of VARTYPE: 8

То execute предполагается вернуть коллекцию объекта.
Использование:
A1= "100x10x150"
A2= экстракт(A1) => 100
A3= экстракт(A1,2) => 10
A4= экстракт(A1,3) => 150

Что я уже пробовал:

Этот код отлично работает в Excel, но не компилируется в Calc.
Что я пропустил?

3 Ответов

Рейтинг:
9

Patrice T

Добавление типа первого параметра решило проблему.

Function Extract(Chaine As String, Optional Pos = 1, Optional Balise)

Отладчик не очень помог, потому что это внутренняя ошибка.
Когда Chaine является диапазоном, LO не может получить значение ячейки, чтобы передать его в виде строки в качестве параметра Re.Execute.


Рейтинг:
1

OriginalGriff

По-видимому, это связано, по крайней мере частично, с тем, что передается этой функции, вероятно, в Chaine - и мы понятия не имеем, что это такое. Поскольку проблема возникает во время выполнения, вам нужно, чтобы макрос и данные, с которыми он связан (электронная таблица), работали вместе, чтобы попытаться исправить ее - и у нас нет доступа ни к тому, ни к другому, не говоря уже о том, чтобы и то, и другое!

Так что все будет зависеть от тебя.
К счастью, у вас есть инструмент, который поможет вам выяснить, что происходит: отладчик. Быстрый поиск в Google для "LibreOffice Calc debugger" должен дать вам необходимую информацию.

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

Извините, но мы не можем сделать это за вас - пришло время вам освоить новый (и очень, очень полезный) навык: отладку!


Patrice T

Использование:
A1= "100x10x150"
A2= экстракт(A1) => 100
A3= экстракт(A1,2) => 10
A4= экстракт(A1,3) => 150
расследование :)

Patrice T

- пора тебе освоить новый (и очень, очень полезный) навык: отладку!"
Это была внутренняя ошибка LO, которая не давала доступа к отладчику при ошибке.
См. Раздел S3

Рейтинг:
0

phil.o

В Libre Office есть функция регулярного выражения:
РЕГУЛЯРНОЕ ВЫРАЖЕНИЕ[^]
Однако это относится к версии 6.2; не знаю, присутствует ли она в версии 6.1.


Patrice T

Excel-это мое главное приложение, я не могу потерять совместимость с Excel.