Не работает функция InStrRev

Автор Борис_С, 6 ноября 2025, 21:08

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

Добрый вечер.
Выполняю код под Linux
    Dim path As String
    Dim i1
    path = "abc"
    i1 = InStrRev(path, "a")
Получаю ошибку "программа или функция не определена ("InStrRev")
Что за чудеса?
У меня только одна мысль: под Linux этой функции в Basic нет.
Проверил под Windows. Та же ошибка.

mikekaganski

С уважением,
Михаил Каганский

Борис_С


bigor

Цитата: Борис_С от  6 ноября 2025, 21:43де это прописывается?
откройте ссылку, там все написано, в подкрашенном прямоугольнике
Поддержать наш форум можно здесь

Борис_С

В начале кода поставил
Option Explicit
Option VBASupport 1

Теперь basic стал ругаться на обычный оператор WhatTheOS()
Синтаксическая ошибка Basic
Ожидается =

economist

#5
Option Explicit - это серьезное усложнение, все переменные нужно объявлять вверху и заранее. Но самое сложное - нужно сразу придумать им понятные и запоминающиеся имена. Нейминг - проблема №1 в программировании. Потому что именно в этот момент голова обязана продумать программу целиком.  Что сложно, но сильно повышает ее качество и надежность после написания. Если пока не готовы - уберите эту строку.

Option VBASupport 1 - это объявление на уровне модуля. Разделите программу на 2 части, с/без VBASupport, и можно использовать лучшее из 2-х миров. 
 
Руб. за сто, что Питоньяк
Любит водку и коньяк!
Потому что мне, без оных, -
Не понять его никак...

sokol92

Цитата: economist от  7 ноября 2025, 08:06Если пока не готовы - уберите эту строку
Если пока не готовы - отложите написание программы.  :)

Я не знаю (исторических ?) причин, по которым весьма востребованные функции (InStrRev, Round) работают лишь при Option VBASupport 1.

Можно добавить в библиотеку LO Basic такой модуль и использовать функцию VBA_InStrRev в других модулях (проверьте).
В функции VBA_InStrRev оригинальное имя параметра "Compare" "не нравится" компилятору и изменено на nCompare.

Option Explicit
Option VBASupport 1

Function VBA_InStrRev(ByVal StringCheck As String, ByVal StringMatch As String , _
                  Optional ByVal Start As Long = 0, Optional ByVal nCompare As Integer = 1) As Long
  If Start = 0 Then Start = Len(StringCheck)
  VBA_InStrRev = InStrRev(StringCheck, StringMatch, Start, nCompare)
End Sub
Владимир.

kompilainenn

Цитата: sokol92 от  7 ноября 2025, 15:57Я не знаю (исторических ?) причин
Отсутствие разработчика, заинтересованного в этом
Поддержать разработчиков LibreOffice можно тут, а наш форум вот тут

Борис_С

Как я понимаю, проще всего вместо функции InStrRev использовать старый добрый цикл
для получения позиции нужного символа.

sokol92

#9
Цитата: Борис_С от  7 ноября 2025, 18:49проще всего вместо функции InStrRev использовать старый добрый цикл
для получения позиции нужного символа.
Проще и эффективнее функцию выше.

Посимвольная обработка в LO Basic будет медленной (если, конечно, это важно).

Возможная альтернатива - реализация с использованием функции Split.
Владимир.

sokol92

Цитата: kompilainenn от  7 ноября 2025, 18:41Отсутствие разработчика, заинтересованного в этом
В данном конкретном случае мне это кажется маловероятным - функция же реализована в LO ...
Может быть, были какие-то соображения о совместимости с прошлыми версиями. Но это всё гадания...


Владимир.