Отмена предыдущей отметки списка при новом выборе

Автор DimS, 15 октября 2020, 14:05

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

DimS

Помогите! Честно работающий в 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 и далее...

Bigor

Добрый день. Приведенный выше макрос работает в 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

если сохранить файл XLS в формате LO тоже работает? у меня нет...

Bigor

Если сохранить в 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

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

Bigor

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

DimS

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

ost

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

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

sokol92

#8
"Замудренная" конструкция в #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
Владимир.

Bigor

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

eeigor

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

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


Далее, зная индекс последней строки, можно выполнять свои задачи.
Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community

eeigor

Цитата: Bigor от 23 января 2021, 16:35Когда -то давно JohnSUN предлагал  такой вариант
Да, @JohnSun использует Sheet Cursor
Ubuntu 18.04 LTS • LibreOffice 7.3.5.2 Community

sokol92

Цитата: Bigor от 23 января 2021, 16:35Когда -то давно JohnSUN предлагал  такой вариант

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

eeigor

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

Bigor

Еще вариант из залежей форума
n= ubound(ThisComponent.getSheets().getByIndex(1).getData())
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут