Подскажите макрос для верного отображения времени

Автор AndreiT, 3 сентября 2020, 21:07

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

AndreiT

Здравствуйте. Если кто знает - подскажите решение.
В файле 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


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

bigor

Если данные без пропусков, то можно так:
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

Благодарю за код. Выделяю столбец С, запускаю следующий код, но что то не работает это в 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

#3
Цитата: AndreiT от  3 сентября 2020, 23:24запускаю следующий код, но что то не работает это в Libre offise
Вы файлик с таблицей не приложили. По скринам подозреваю, что данные начинаются со второй строки. Тогда i=1. В общем i должно указывать на строку в которой начинаются данные -1
зы выделять ничего не нужно, все жестко привязано внутри макроса
Поддержать разработчиков LibreOffice можно можно тут, а наш форум вот тут

AndreiT

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

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