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

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

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

ForumOOo (бот)

Компонент: Calc
Версия OpenOffice.org: 3.3.2
Сборка: оригинал
ОС: windows 7 х64 максимальная

Помогите пожалуйста!!!
автоматическое добавление даты или времени в ячейку при изменении значения в соседней ячейки.
формула такого  {=IF(A17>0;NOW();" ")}  типа не подходит.
ввиду перехода на следующие сутки дата тоже измениться во всех ячейках содержащие такую формулу.
желательно с помощью макроса.
есть макрос от excel но он не работает.
{
Private Sub Worksheet_Change(ByVal Target As Range)  
    If Target.Cells.Count > 1 Then Exit Sub  
        If Not Intersect(Target, Range("A10:A1000")) Is Nothing Then  
            With Target(1, 2)  
                .Value = Now  
                .EntireColumn.AutoFit  
            End With  
        End If  
End Sub
}
Заранее Спасибо!.

--
Подпись: GF-7
Эл. почта: jastreb_world3@mail.ru

RFJ

1 способ (простой):использовать файл xls с макросом Excel - в LibreOffice 3.4 и OpenOffice pro 3.3.2, если включена поддержка VBA, то всё работает хорошо.

2 способ (сложный): файл ods - придется подключать Listener для отслеживания изменения данных на листе Calc (для замены экселевского Worksheet_Change).

JohnSUN

3 способ (без макросов): все-таки записать формулу =IF(B17="";IF(A17="";"";NOW());B17) ("Если дата в B17 еще не заполнена то (если в A17 ничего не внесено то оставить B17 пустым иначе поставить в B17 текущие дату-время) иначе оставить B17 как есть" - читается сложно? но работает надежно!)
Чтобы эта формула не выдавала ошибку 522 "Циклическая ссылка" нужно в разделе Сервис - Параметры - Calc - Вычисления включить флажок Итерации.
Владислав Орлов aka JohnSUN
Благодарить-не зазорно.
Подарить благо создателям офиса, нашему ресурсу, мне

RFJ

3 способ (JohnSUN) работает не так, как нужно.
Он работает только при изменении значения в ячейке A17 с "пусто" на какое-то значение, например 17.
Но если повторно изменить значение в ячейке A17, т.е. с 17 на 96 (например), то новое значение даты в B17 не запишется, хотя должно по условию задачи.

maxx_d

Присоединяюсь к просьбе о макросе с добавлением даты в соседнюю ячейку.
Причем, есть потребность 2-х видов:
1. Появление текущей даты при занесении записи в соседнюю ячейку;
2. Возможность выбора даты при клике или двойном клике на определённую ячейку.
Вероятно такое реализовать?
Цитата: RFJ от  7 июня 2011, 17:221 способ (простой):использовать файл xls с макросом Excel - в LibreOffice 3.4 и OpenOffice pro 3.3.2, если включена поддержка VBA, то всё работает хорошо.
Этот способ, к сожалению не работает в OOo Calc. Поддержка VBA в OOo включена.

RFJ

#5
Экселевский макрос можно упростить:
Private Sub Worksheet_Change(ByVal Target As Range)
       If Target(1, 1).Column = 1 Then
               Target(1, 2).Value = Now
       End If
End Sub


и даже так:
Private Sub Worksheet_Change(ByVal Target As Range)
       If Target(1, 1).Column = 1 Then Target(1, 2).Value = Now
End Sub



В столбце А - меняющиеся значения
В столбце В - текущая дата

RFJ

Цитата: maxx_d от 10 июня 2011, 17:25Этот способ, к сожалению не работает в OOo Calc. Поддержка VBA в OOo включена.

VBA в Calc будет работать только если в Calc открывается файл Excel (!!!) (file.xls).

VBA в файлах Calc (file.ods) может не работать!

RFJ


Макрос с Listener для вставки текущих даты и времени (аналог экселевского Worksheet_Change):
Sub addListener
oDocument = ThisComponent
oSheet = oDocument.CurrentController.getActiveSheet()   'получаем активный лист
oListener = CreateUnoListener("OOO_", "com.sun.star.chart.XChartDataChangeEventListener")

'Задаем ячейки, которые будем отслеживать (на активном листе), в данном случае "A1:A101"
For s=0 To 100
oCell = oSheet.getCellByPosition(0,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+1,r)

oCell.setValue(Now)

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


P.S. Для отслеживания ячеек нужно запустить макрос addListener.
      Макрос addListener можно повесить на событие "Открытие файла" для автоматического запуска.

maxx_d

Цитата: RFJ от 11 июня 2011, 10:05oSheet = oDocument.CurrentController.getActiveSheet()   'получаем активный лист
после этой строки выдается
"ошибка времени выполнения BASIC
Свойство или метод не найдены: Current controller. "
стек вызовов 0:addListener

что-то не так вношу?

RFJ

1. Покажите ваш файл.

2. Вместо ошибочной строки можно вставить строку с явным указанием листа:
ЦитироватьoSheet=oDocument.Sheets.getByName("Лист1")   

RFJ

Вот работающий пример.

[вложение удалено Администратором]

maxx_d

#11
Спасибо, RFJ!!!
Это напоминает волшебство!

Только вот (не хватает образования) сохраняю этот файл в xls, но в нём не сохраняется макрос. Вроде уже и вручную скопировал его и автозагрузку макроса при открытии поставил...

Галки в "свойствах VBA" в настройках OOo все стоят.

Инымии словами, можно этот файл "now-listener.ods" сохранить, как "now-listener.xls", чтобы в нём работали макросы? Открывать файл предпоагается в OOo.

RFJ

Цитировать
... сохраняю этот файл в xls, но в нём не сохраняется макрос.
... можно этот файл "now-listener.ods" сохранить, как "now-listener.xls", чтобы в нём работали макросы? Открывать файл предпоагается в OOo.
Можно, но макросы придется хранить не в файле "now-listener.xls", а в самом ООо.
См. картинку.

[вложение удалено Администратором]

maxx_d

Всё вроде так. Осталось дело за малым. Как сделать "автозапуск"? Вроде прицепляю макрос к открытию файла, но почему то в автомате не срабатывает.
Только после нажатия "выполнить".

RFJ

#14
Цитата: maxx_d от 27 июня 2011, 10:21
Как сделать "автозапуск"?
Цитировать... хранить в самом LibreOffice (OpenOffice).


[вложение удалено Администратором]