Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

Форум поддержки пользователей. LibreOffice, Apache OpenOffice, OpenOffice.org

20 Апрель 2021, 16:25 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Доступно и просто о работе в офисных пакетах
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Отмена предыдущей отметки списка при новом выборе  (Прочитано 1366 раз)
0 Пользователей и 1 Гость смотрят эту тему.
DimS
Участник
**
Offline Offline

Сообщений: 10


« Стартовое сообщение: 15 Октябрь 2020, 14:05 »

Помогите! Честно работающий в Excel макрос (от planetaexcel.ru) отказался трудится в LO7.
Смысл его работы: в столбце А ставится метка V (далее формулами заполняются формы, сохранение и печать ),
потом следующий выбор меткой V, а предыдущая метка удаляется автоматически...

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Long
    Dim str As String

    If Target.Count > 1 Then Exit Sub
    If Target.Column = 1 Then
        str = Target.Value
        Application.EnableEvents = False
        r = Cells(Rows.Count, 2).End(xlUp).Row
        Range("A2:A" & r).ClearContents
        Target.Value = str
    End If
    Application.EnableEvents = True
End Sub
 
Понимаю, что нужно смотреть в сторону Listener и далее...

* выбор документа.xls (87.5 Кб - загружено 6 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 092


« Ответ #1: 15 Октябрь 2020, 15:48 »

Добрый день. Приведенный выше макрос работает в Version: 7.0.1.2
Build ID: 7cbcfc562f6eb6708b5ff7d7397325de9e764452
CPU threads: 4; OS: Linux 5.3; UI render: default; VCL: kf5
Locale: ru-RU (ru_RU.UTF-8); ИП: ru-RU
Calc: threaded
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #2: 15 Октябрь 2020, 16:14 »

если сохранить файл XLS в формате LO тоже работает? у меня нет...
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 092


« Ответ #3: 15 Октябрь 2020, 16:42 »

Если сохранить в ods, то работает вот так:

Код:
Option VBASupport 1
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim r As Long
    Dim str As String
    If Target.CellFormatRanges.Count > 1 Then Exit Sub
    If Target.CellAddress.Column = 1 Then
        str = Target.Value
        Application.EnableEvents = False
        r = Cells(Rows.Count, 2).End(xlUp).Row
        Range("A2:A" & r).ClearContents
        Target.Value = str
    End If
    Application.EnableEvents = True
End Sub
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #4: 16 Октябрь 2020, 07:50 »

тёмный я! ничего не выходит...Ошибка! К какому событию макрос прилепить нужно? Да, и файл нужен не мне, а новый LO7 100% там не стоит, за этим никто не следит.


* ошибка.JPG (80.81 Кб, 1114x650 - просмотрено 14 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 092


« Ответ #5: 16 Октябрь 2020, 09:34 »

Вот файл с макросом проверяйте на остальных версиях. Макрос перенес в библиотеку стандарт.
Привязан к событию листа - изменение данных

* выбор документа.ods (21.01 Кб - загружено 7 раз.)
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
DimS
Участник
**
Offline Offline

Сообщений: 10


« Ответ #6: 16 Октябрь 2020, 09:51 »

Действительно работает!
Только забавный глюк
нет перехода по Enter на следующую ячейку вниз в столбце A
Записан
ost
Форумчанин
***
Offline Offline

Сообщений: 156


« Ответ #7: 23 Январь 2021, 08:33 »

Доброго.
Есть ли способ добиться от LO корректной работы строчки VBA-кода типа
Код:
lSelfLastRow = oSelfSheet.Cells(Rows.Count, 10).End(xlUp).Row
?

Или в #3 единственный? Подобные конструкции на VBA для формирования сводных файлов-списков из кучи отдельных файлов используются ну очень часто. =(
Записан
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #8: 23 Январь 2021, 15:09 »

"Замудренная" конструкция в #7 выдает номер строки для последней непустой строки столбца 10 книги Excel. У Диспетчера есть аналогичная команда  ".uno:GoUpToStartOfData", но, разумеется, ее лучше не использовать. Можно, например, так:

Код:
' Выдает номер строки для последней непустой ячейки столбца.
' Если в столбце нет непустых ячеек, то возвращает 0.
' - column номер столбца.
Function Column_lastRow(Byval oSheet, ByVal column As Long) As Long
  Dim oRange, oDesc, oRange2
  oRange=oSheet.getCellRangeByPosition(column, 0, column, oSheet.Rows.Count-1)
  oDesc=oRange.createSearchDescriptor   
  With oDesc
    .SearchBackwards=True
    .SearchWildcard=True
    .setSearchString "*"
  End With
 
  oRange2=oRange.findFirst(oDesc)
  If Not IsNull(oRange2) Then 
    Column_lastRow=oRange2.CellAddress.Row
  End If 
End Function
« Последнее редактирование: 23 Январь 2021, 15:14 от sokol92 » Записан

Владимир.
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 092


« Ответ #9: 23 Январь 2021, 16:35 »

Когда -то давно JohnSUN предлагал  такой вариант
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #10: 23 Январь 2021, 16:36 »

Если данные представлены прямоугольным диапазоном, то бывает нужнее определить индекс последней строки, чтобы продолжить ввод (автор  вопроса #7, по всей видимости, добивается того же).
Код:
Dim oCursor As Object: oCursor = oSheet.createCursor()
oCursor.gotoEndOfUsedArea(False)

Dim nEndRow As Long: nEndRow = oCursor.RangeAddress.EndRow

Далее, зная индекс последней строки, можно выполнять свои задачи.
« Последнее редактирование: 23 Январь 2021, 16:42 от eeigor » Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #11: 23 Январь 2021, 16:38 »

Когда -то давно JohnSUN предлагал  такой вариант
Да, @JohnSun использует Sheet Cursor
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
sokol92
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 379


WWW
« Ответ #12: 23 Январь 2021, 16:53 »

Когда -то давно JohnSUN предлагал  такой вариант

Цитата от автора: "Не факт, что это будет именно последняя заполненная ячейка в колонке или в строке".
Записан

Владимир.
eeigor
Форумчанин
***
Offline Offline

Пол: Мужской
Сообщений: 514



« Ответ #13: 23 Январь 2021, 17:29 »

@sokol92, естественно, оба подхода имеют своё применение. Мы же не знаем, что пользователь хранит на листе. Может, массу самостоятельных настроечных таблиц (таблиц подстановки), и в конец каждой надо перейти.
Записан

Ubuntu 18.04 LTS • LO 7.1.1.2 Community
Bigor
Мастер
*****
Offline Offline

Пол: Мужской
Сообщений: 1 092


« Ответ #14: 23 Январь 2021, 18:09 »

Еще вариант из залежей форума
Код:
n= ubound(ThisComponent.getSheets().getByIndex(1).getData())
Записан

Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2009, Simple Machines Valid XHTML 1.0! Valid CSS!