Макрос STRJOIN внезапно сломался в LibreOffice / Open Office

Это мой первый пост в Stackoverflow. Я получил так много помощи и ценности от многих людей на этом сайте, поэтому я хочу сначала поблагодарить всех на этом форуме за их невероятные знания и щедрый дух. Очень признателен!

Я тщательно изучил этот сайт и не могу найти ответ на свою проблему: я очень успешно использовал Макрос STRJOIN в LibreOffice (v4.2.4.2), но после возвращения на работу после многонедельного отпуска вдруг не работает. Мой компьютер был выключен и оставлен, так что я уверен, что ничего или никто ничего не изменил. Обновлений OSX не было с тех пор, как я вернулся.

Когда я запускаю макрос (написанный Адамом Спирсом на основе работы Маркуса О'Рейли), я m теперь получает следующие ошибки:

  1. В редакторе макросов я получаю

БАЗОВАЯ ошибка выполнения. Аргумент необязательный

с этой строкой в ​​макросе:

Если НЕ IsMissing(диапазон), то

  1. Если я запускаю макрос из меню «Инструменты»> «Макрос»> «Выполнить макрос», я получаю:

Произошла ошибка Scripting Framework при выполнении сценария Basic Standard.Module1.STRJOIN. Сообщение: неправильное количество параметров!

Те же ошибки возникали и в OpenOffice.

Что случилось/почему макрос теперь не работает? Другие макросы работают нормально, и я также создал новый профиль пользователя, думая, что это может помочь, но безрезультатно.

Я особенно обеспокоен тем, что функция внезапно выходит из строя, поскольку у меня есть огромная электронная таблица с STRJOIN, широко встречающимся повсюду, а конкатенация не является достаточной заменой.

Вот макрос Маркуса и Адама:

Function STRJOIN(range, Optional delimiter As String, _
                 Optional before As String, Optional after As String)
    Dim row, col As Integer
    Dim result, cell As String

    result = ""
    If IsMissing(delimiter) Then
        delimiter = ","
    End If
    If IsMissing(before) Then
        before = ""
    End If
    If IsMissing(after) Then
        after = ""
    End If

    If NOT IsMissing(range) Then
        If NOT IsArray(range) Then
            result = before & range & after
        Else
            For row = LBound(range, 1) To UBound(range, 1)
                For col = LBound(range, 2) To UBound(range, 2)
                    cell = range(row, col)
                    If cell <> 0 AND Len(Trim(cell)) <> 0 Then
                        If result <> "" Then
                            result = result & delimiter
                        End If
                        result = result & before & range(row, col) & after
                    End If
                Next
            Next
        End If
    End If

    STRJOIN = result 
End Function

person Oink Oink    schedule 02.08.2016    source источник


Ответы (1)


Прежде всего, STRJOIN — это функция, которая не предназначена для прямого запуска. Вместо этого используйте подпрограмму для проверки:

Sub Test_STRJOIN
    Dim strings(1 To 1, 1 To 3)
    strings(1,1) = "a"
    strings(1,2) = "b"
    strings(1,3) = "c"
    result = STRJOIN(strings, " / ")
    MsgBox(result)
End Sub

Вызовите эту подпрограмму либо из редактора макросов, либо Tools > Macro > Run Macro. Он должен отображать «a / b / c» в окне сообщения.

Теперь, в чем проблема, когда STRJOIN используется в формуле электронной таблицы? Ну думаю макрос просто нужно как-то перезапустить. Вы можете убедиться, что она работает, добавив строку вроде MsgBox "STRJOIN() running" в начале функции.

Чтобы действительно заставить его работать, вручную введите другую формулу в новую ячейку, например =STRJOIN(A1:B1).

Обычно у меня такие проблемы исчезают, когда я вношу произвольное изменение в код Basic, например, добавляя комментарий. Это, по-видимому, заставляет Office понять, что ему нужно перезапустить код. После этого закройте и снова откройте документ, чтобы обновить формулы.

person Jim K    schedule 02.08.2016
comment
Спасибо, Джим, за вашу помощь и предложения. Самое странное: теперь все работает нормально, хотя исходный макрос вылетает, как сказано выше. Однако я попробовал ваше предложение, и, к сожалению, оно не сработало, и я получил ошибку в результате = STRJOIN(strings, / ). Хотел бы я знать, что заставило его сломаться в первую очередь, но на данный момент я надеюсь, что он продолжит функционировать, и эту тему можно будет закрыть навсегда. Еще раз спасибо! - person Oink Oink; 04.08.2016
comment
Ну, если Test_STRJOIN не работает, значит что-то не так. Какое сообщение об ошибке? Поместите подпрограмму в тот же модуль, что и функция STRJOIN, и убедитесь, что в другом модуле нет другой STRJOIN. Basic также предоставляет отладчик для пошагового выполнения кода. - person Jim K; 04.08.2016