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

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

28 Сентябрь 2020, 21:36 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
Новости: Вы можете задать вопрос по LibreOffice или Apache OpenOffice без регистрации, используя форму
 
   Начало   Помощь Поиск Войти Регистрация    задать вопрос  
Страниц: 1   Вниз
  Печать  
Автор Тема: Подскажите макрос для верного отображения времени  (Прочитано 484 раз)
0 Пользователей и 1 Гость смотрят эту тему.
AndreiT
Новичок
*
Offline Offline

Сообщений: 3


« Стартовое сообщение: 3 Сентябрь 2020, 21:07 »

Здравствуйте. Если кто знает - подскажите решение.
В файле 1.ods Libre Offise Calc есть столбец с множеством ячеек где неправильно отображается время.
Например 11 секунд отображается как 00:11:00


А должно отображатся 00:00:11


Много лет назад с этим вопросом обращался на один из форумов (уж не помню где) и мне дали решение, которое работает в Excel.

Макрос который делит время выделенного столбца ("C:C") в формате (Ч:ММ:СС) на 60

Код:
Sub Vremya()
Columns("C:C").Select
Dim rX As Range
For Each rX In Selection.SpecialCells(xlCellTypeConstants, xlNumbers)
rX = rX / 60
Next
End Sub

К сожалению не знаю пока как применить это в Libre Calc.Пробовал разные варианты,но этот код там не работает, даже с вставкой в начале строки Option VBASupport 1



Макрос в Libre Calc записывал с помощью 'записать макрос' (dim dispatcher as object). Здесь нужен правильный код деления времени на 60.

Код:
REM  *****  BASIC  *****

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object

rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem ----------------------------------------------------------------------
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$C$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())

rem ----------------------------------------------------------------------
dim args10(0) as new com.sun.star.beans.PropertyValue
args10(0).Name = "By"
args10(0).Value = 1

dispatcher.executeDispatch(document, ".uno:GoDownToEndOfDataSel", "", 0, args10())

Dim rX As Range
For Each rX In Selection.SpecialCells(xlCellTypeConstants, xlNumbers)
rX = rX / 60
Next

End Sub

Если кто может подскажите пожалуйста решение.


* таблица1.PNG (5.96 Кб, 170x515 - просмотрено 4 раз.)

* таблица2.PNG (3.04 Кб, 141x484 - просмотрено 4 раз.)

* Код нерабочий.PNG (17.24 Кб, 694x343 - просмотрено 4 раз.)
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #1: 3 Сентябрь 2020, 22:04 »

Если данные без пропусков, то можно так:
Код:
Sub Vremya
oSheet=ThisComponent.Sheets(0)
i=0
While oSheet.getCellbyPosition(0,i).value <> 0
oSheet.getCellbyPosition(0,i).value=oSheet.getCellbyPosition(0,i).value/60
i=i+1
wend
End Sub
для столбца А
, можно просто формулами
Записан

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

Сообщений: 3


« Ответ #2: 3 Сентябрь 2020, 23:24 »

Благодарю за код. Выделяю столбец С, запускаю следующий код, но что то не работает это в Libre offise. Так понимаю что для столбца С значение 2. Может я что то не так записал или чего то не дописал.
Код:
REM  *****  BASIC  *****
Option VBASupport 1

Sub Vremya
oSheet=ThisComponent.Sheets(0)
i=0
While oSheet.getCellbyPosition(2,i).value <> 0
oSheet.getCellbyPosition(2,i).value=oSheet.getCellbyPosition(2,i).value/60
i=i+1
wend

End Sub

Однако похоже решение нашёл. пройдя по ссылке https://www.excel-vba.ru/chto-umeet-excel/kak-bystro-umnozhitrazdelitslozhitvychest-iz-mnozhestva-yacheek-odno-i-to-zhe-chislo/
понял что существует специальная вставка, где значение можно поделить или умножить. И вот записал такой работающий код.
Код:
REM  *****  BASIC  *****

sub Main
rem ----------------------------------------------------------------------
rem define variables
dim document   as object
dim dispatcher as object
rem ----------------------------------------------------------------------
rem get access to the document
document   = ThisComponent.CurrentController.Frame
dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")

rem --------------выделяем свободную ячейку--------------------------------------------------------
dim args1(0) as new com.sun.star.beans.PropertyValue
args1(0).Name = "ToPoint"
args1(0).Value = "$D$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args1())

rem ---------------записываем в выделеную ячейку число 60-------------------------------------------------------
dim args2(0) as new com.sun.star.beans.PropertyValue
args2(0).Name = "StringName"
args2(0).Value = "60"

dispatcher.executeDispatch(document, ".uno:EnterString", "", 0, args2())

rem -------------------выбираем опять ячейку ---------------------------------------------------
dim args4(0) as new com.sun.star.beans.PropertyValue
args4(0).Name = "ToPoint"
args4(0).Value = "$D$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args4())

rem -----------------------копируем содержимое ячейки в память-----------------------------------------------
dispatcher.executeDispatch(document, ".uno:Copy", "", 0, Array())

rem -----------------------переходим к ячейке С1-----------------------------------------------
dim args6(0) as new com.sun.star.beans.PropertyValue
args6(0).Name = "ToPoint"
args6(0).Value = "$C$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args6())

rem --------------------------Выделяем столбец С до конца данных--------------------------------------------
dim args7(0) as new com.sun.star.beans.PropertyValue
args7(0).Name = "By"
args7(0).Value = 1

dispatcher.executeDispatch(document, ".uno:GoDownToEndOfDataSel", "", 0, args7())

rem ----------в выделеные ячейки вставляем новое значение (время разделённое на 60)---------------------------------------------------
dim args8(5) as new com.sun.star.beans.PropertyValue
args8(0).Name = "Flags"
args8(0).Value = "V"
args8(1).Name = "FormulaCommand"
args8(1).Value = 4
args8(2).Name = "SkipEmptyCells"
args8(2).Value = false
args8(3).Name = "Transpose"
args8(3).Value = false
args8(4).Name = "AsLink"
args8(4).Value = false
args8(5).Name = "MoveMode"
args8(5).Value = 4

dispatcher.executeDispatch(document, ".uno:InsertContents", "", 0, args8())

rem -------------------переходим в ячейку где записывали число 60---------------------------------------------------
dim args9(0) as new com.sun.star.beans.PropertyValue
args9(0).Name = "ToPoint"
args9(0).Value = "$D$6"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args9())

rem ------------------удаляем с ячейки данные----------------------------------------------------
dispatcher.executeDispatch(document, ".uno:ClearContents", "", 0, Array())

rem --------------------переходим в ячейку С1--------------------------------------------------
dim args11(0) as new com.sun.star.beans.PropertyValue
args11(0).Name = "ToPoint"
args11(0).Value = "$C$1"

dispatcher.executeDispatch(document, ".uno:GoToCell", "", 0, args11())


end sub

Конечно это более долгий путь, но зато он мне понятен и есть результат. Возможно думаю и более рациональное решение. Но пока учусь.
Записан
Bigor
Мастер
*****
Offline Offline

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


« Ответ #3: 3 Сентябрь 2020, 23:38 »

запускаю следующий код, но что то не работает это в Libre offise
Вы файлик с таблицей не приложили. По скринам подозреваю, что данные начинаются со второй строки. Тогда i=1. В общем i должно указывать на строку в которой начинаются данные -1
зы выделять ничего не нужно, все жестко привязано внутри макроса
« Последнее редактирование: 3 Сентябрь 2020, 23:40 от Bigor » Записан

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

Сообщений: 3


« Ответ #4: 4 Сентябрь 2020, 00:10 »

Вы знаете получилось. Попробовал ваш макрос сохранить в самом файле который и прилагаю. Хотя значение с первой строки шли.
Там просто у меня ещё много другого кода было. может что то и напутал. Но сейчас работает. Благодарю.

Код:
REM  *****  BASIC  *****
Option VBASupport 1

Sub Vremya
oSheet=ThisComponent.Sheets(0)
i=0
While oSheet.getCellbyPosition(2,i).value <> 0
oSheet.getCellbyPosition(2,i).value=oSheet.getCellbyPosition(2,i).value/60
i=i+1
wend

End Sub

* Vremya_izmenit.ods (10.05 Кб - загружено 5 раз.)
Записан
Страниц: 1   Вверх
  Печать  
 
Перейти в:  

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