Помогите !!! автоматическое добавление даты...

Автор ForumOOo (бот), 7 июня 2011, 17:34

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

maxx_d

Спасибо большое! За наводку
немного не туда смотрел - "привязывал" к "запуск приложения", а надо было к "открытию файла".

Gabit

Доброе время суток !

Аналог Worksheet_Change можно сделать только указанным в этой теме методом или есть другой более простой ?

JohnSUN

Добро пожаловать на форум!
Да нет, проще, пожалуй, способа нет... А в чем проблема? Много писать? Или предложенный вариант не работает?
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Bers40k

Цитата: RFJ от 15 июня 2011, 21:15Вот работающий пример.

а можно ли как то заставить маскрос обслуживать другой столбец ?
потому что замена координаты не работает

Hasim

#19
В примере RFJ в макросе нужно сделать замены, чтобы, например, отслеживались ячейки "E11:E21", а время писалось в "C6:C16"
Цитировать
...
   For s=10 To 20     REM s задает отследуемые строки  
      oCell = oSheet.getCellByPosition(4,s)    REM 4 задает отследуемый столбец ("E")

...
...
      oCell=oSheet.getCellByposition(c-2,r-5)   REM с-5 задает столбец "C", r-5 задает строки для записи времени


и перезапустить макрос addListener (или закрыть и снова открыть файл).

Весь макрос целиком:
Sub addListener
oDocument = ThisComponent
oSheet = oDocument.CurrentController.getActiveSheet() 'получаем активный лист
oListener = CreateUnoListener("OOO_", "com.sun.star.chart.XChartDataChangeEventListener")

'Задаем ячейки, которые будем отслеживать (на активном листе), в данном случае "E11:E21"
For s=10 To 20
oCell = oSheet.getCellByPosition(4,s)
oCell.addChartDataChangeEventListener(oListener)
Next
MsgBox "Listener added"
End Sub

Sub OOO_chartDataChanged(oEvent)
r=oEvent.Source.CellAddress.Row
c=oEvent.Source.CellAddress.Column
v=oEvent.Source.String

Now_write(r,c,v)
End Sub

Sub Now_write(r,c,v)
oDoc=ThisComponent
oSheet=oDoc.Sheets.getByName("Лист1") 'задаем лист для записи текущих даты и времени,
'может в общем случае не совпадать с листом,
'на котором были заданы отслеживаемые ячейки!
  oCell=oSheet.getCellByposition(c-2,r-5) 'Пишем время в "C6:C16"

oCell.setValue(Now)

If v="" Then
oCell.setValue(v)
End If
End Sub


PS. Установить для ячеек "C6:C16" нужный формат ячеек (Время)!

nik_ko

Как определить адрес ячейки, если Listener устанавливать не в каждую ячейку, а на диапазон ячеек (D2:d102)?
как-то так:

Sub addListener
   oDocument = ThisComponent
   oSheet = oDocument.CurrentController.getActiveSheet() 'получаем активный лист
   oCell = oSheet.getCellRangeByName("D2:D102")
        oListener = CreateUnoListener("OOO_", "com.sun.star.chart.XChartDataChangeEventListener")
        oCell.addChartDataChangeEventListener(oListener)
End Sub

Sub OOO_chartDataChanged(oEvent)
?

Hasim

Цитата: nik_ko от 24 марта 2014, 21:23Как определить адрес ячейки, если Listener устанавливать не в каждую ячейку, а на диапазон ячеек (D2:d102)?
Здесь к Listener добавляется для отслеживания весь диапазон целиком.
То есть, будет ослеживаться изменение любой ячейки из диапазона, но определить, какая именно ячейка из этого диапазона изменена, нельзя.

nik_ko

- можно ли установить Listener по другому - но не перечисляя ячейки?
Проблема такова:
- в таблице 15000 строк и будет больше
- строки и добавляются и вставляются
- после вставки строки Listener подвешивает LOff в Windows XP,  в Linux тормоз не напрягает
- ниже по строкам  перестает срабатывать

Sub OOO_chartDataChanged(oEvent) проверял только на срабатывание, тормозов вроде - бы нет,


JohnSUN

Так, что ли?

[вложение удалено Администратором]
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Hasim

Цитата: JohnSUN от 25 марта 2014, 17:39Так, что ли?
Эта фишка - События листа - есть в новых версиях. В старых ее не было, был только Listener.
И События листа отслеживают все ячейки листа - привязанный макрос срабатывает при изменении любой ячейки на листе.
Поэтому требуется обычно определять адрес этой ячейки, чтобы не запускать макрос, если эта ячейка не должна отслеживаться.

JohnSUN

Да-да, ты абсолютно прав.
И возможность эта совсем новая, поэтому использовать её никак нельзя.
И использование вручную описанного Listener напрочь отсекает возможность исследовать oEvent в отладчике.
И в первых строчках процедуры-обработчика проверить попадает ли ячейка события в проверяемый диапазон (queryIntersection) и ничего не делать в противном случае - моветон: разумеется, если назначить слушатель события на диапазон ячеек, то будет использоваться совершенно другой, гораздо лучший алгоритм.

"Вот Вы нам сейчас это всё рассказали и... что?..." (с) "12"
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

nik_ko

Спасибо JohnSUN и Hasim!
Таки да, не тормозит и считает и вставку строк проглатывает.

Yelik

Цитата: Hasim от 25 марта 2014, 20:00
Цитата: JohnSUN от 25 марта 2014, 17:39Так, что ли?
Эта фишка - События листа - есть в новых версиях. В старых ее не было, был только Listener.
И События листа отслеживают все ячейки листа - привязанный макрос срабатывает при изменении любой ячейки на листе.
Поэтому требуется обычно определять адрес этой ячейки, чтобы не запускать макрос, если эта ячейка не должна отслеживаться.
У меня не работает.
Цитата: Hasim от 13 января 2013, 22:40
В примере RFJ в макросе нужно сделать замены, чтобы, например, отслеживались ячейки "E11:E21", а время писалось в "C6:C16"
Цитировать
...
   For s=10 To 20     REM s задает отследуемые строки   
      oCell = oSheet.getCellByPosition(4,s)    REM 4 задает отследуемый столбец ("E")

...
...
      oCell=oSheet.getCellByposition(c-2,r-5)   REM с-5 задает столбец "C", r-5 задает строки для записи времени


и перезапустить макрос addListener (или закрыть и снова открыть файл).

Весь макрос целиком:
Sub addListener
oDocument = ThisComponent
oSheet = oDocument.CurrentController.getActiveSheet() 'получаем активный лист
oListener = CreateUnoListener("OOO_", "com.sun.star.chart.XChartDataChangeEventListener")

'Задаем ячейки, которые будем отслеживать (на активном листе), в данном случае "E11:E21"
For s=10 To 20
oCell = oSheet.getCellByPosition(4,s)
oCell.addChartDataChangeEventListener(oListener)
Next
MsgBox "Listener added"
End Sub

Sub OOO_chartDataChanged(oEvent)
r=oEvent.Source.CellAddress.Row
c=oEvent.Source.CellAddress.Column
v=oEvent.Source.String

Now_write(r,c,v)
End Sub

Sub Now_write(r,c,v)
oDoc=ThisComponent
oSheet=oDoc.Sheets.getByName("Лист1") 'задаем лист для записи текущих даты и времени,
'может в общем случае не совпадать с листом,
'на котором были заданы отслеживаемые ячейки!
  oCell=oSheet.getCellByposition[b](c-2,r-5)[/b] 'Пишем время в "C6:C16"

oCell.setValue(Now)

If v="" Then
oCell.setValue(v)
End If
End Sub


PS. Установить для ячеек "C6:C16" нужный формат ячеек (Время)!
Как изменить код(c-2,r-5) чтоб писать в В3? Или лучше пользоваться Событиями листа(как?)? ???

JohnSUN

Привет, Yelik! И добро пожаловать на форум!
Что не работает? Что и как делал? В какой программе?
Цитата: Yelik от  8 апреля 2015, 22:52
Как изменить код(c-2,r-5) чтоб писать в В3? Или лучше пользоваться Событиями листа(как?)? ???
Всегда в В3? Это колонка 1, строка 2 (нумерация строк, колонок, листов, таблиц и почти всего остального в Бэйсике начинается с нуля)
Значит, пишем
oCell=oSheet.getCellByposition(1,2)
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

Yelik

Привет JohnSUN,

Libreoffice 4.4.1
Не работает автоматическое добавление даты. Ошибка в строке: r=oEvent.Source.CellAddress.Row