|
Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » VBS/WSH/JS - Макрос суммы времени |
|
|
VBS/WSH/JS - Макрос суммы времени
|
Новый участник Сообщения: 8 |
Имею отчет в формате xls в котором эфирная справка где указано сколько времени был проигран тот или иной видео файл за сутки. Мне нужно посчитать суммарный хронометраж всех проигранных файлов, а их много за сутки проигрывается. Пример отчета прилагаю. Нужно суммировать колонку под названием "Длительность". Результат нужно напечатать после последней заполненной ячейки столбца "Длительность". Время в этой ячейке указано в формате ЧЧ:ММ:СС:КК (часы: минуты:секундны:кадры). Буду признателен в помощи!
|
|
Отправлено: 19:05, 17-04-2017 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Макрос — вот:
Скрытый текст
Option Explicit Sub Sample() Dim objFoundRange As Range Dim objCalcRange As Range Dim objRange As Range Dim objRegExp As New VBScript_RegExp_55.RegExp Dim dtTotalTime As Date Dim intTimeValue As Integer With ActiveWorkbook.ActiveSheet Set objFoundRange = .UsedRange.Find("Длительность") If Not objFoundRange Is Nothing Then objRegExp.Pattern = "^(\d{2}):(\d{2}):(\d{2}):\d{2}$" dtTotalTime = TimeSerial(0, 0, 0) With Intersect(.UsedRange, objFoundRange.EntireColumn) Set objCalcRange = .Offset(1, 0).Resize(.Rows.Count - 1, 1) End With For Each objRange In objCalcRange If objRegExp.Test(objRange.Value) Then With objRegExp.Execute(objRange.Value).Item(0).SubMatches intTimeValue = CInt(.Item(0)) * 60 * 60 + CInt(.Item(1)) * 60 + CInt(.Item(2)) End With dtTotalTime = DateAdd("s", intTimeValue, dtTotalTime) End If Next With objCalcRange With .Offset(.Rows.Count, 0).Resize(1, 1) .Value = dtTotalTime .NumberFormat = "hh:mm:ss;@" End With End With Else MsgBox "Can't find word [Длительность] in active worksheet", vbOKOnly + vbExclamation, "Not found" End If End With End Sub Не забудьте установить для проекта ссылку на библиотеку: Скрытый текст
![]() |
Отправлено: 05:06, 18-04-2017 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Iska,
ИМХО фэншуйнее написать функцию, а не рутину
Function SumTimeK(Atime As Range) As String Dim DSumTime As Long, DSumK As Long Dim hh As Long, mm As Integer, ss As Integer Dim UmAtime As Integer DSumTime = 0 DSumK = 0 For Each iAtime In Atime mAtime = Split(iAtime, ":") UmAtime = UBound(mAtime) If UmAtime >= 0 Then DSumTime = DSumTime + CLng(mAtime(0)) * 3600 If UmAtime >= 1 Then DSumTime = DSumTime + CLng(mAtime(1)) * 60 If UmAtime >= 2 Then DSumTime = DSumTime + CLng(mAtime(2)) If UmAtime >= 3 Then DSumK = DSumK + CLng(mAtime(3)) End If Next hh = Int(DSumTime / 3600) mm = Int((DSumTime - hh * 3600) / 60) ss = DSumTime - hh * 3600 - mm * 60 SumTimeK = IIf(hh < 10, "0" + CStr(hh), CStr(hh)) + ":" + Mid(CStr((100 + mm)), 2, 2) + ":" + Mid(CStr((100 + ss)), 2, 2) + ":" + CStr(DSumK) End Function d22cva, отдаю Вам Ваш файл с функцией. Что такое кадры, я не знаю, подозреваю, что они считаются неправильно. Уточняйте задачу, исправлю |
------- Последний раз редактировалось megaloman, 18-04-2017 в 15:05. Отправлено: 12:44, 18-04-2017 | #3 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать ![]() Excel Recalculation: Volatile and Non-Volatile Functions |
Последний раз редактировалось Iska, 20-04-2017 в 10:10. Причина: Помню-то хорошо, но времена меняются ;). Отправлено: 01:22, 19-04-2017 | #4 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Iska, Не буду врать, UDF использовал не часто, но с проблемами не сталкивался.
Вот погуглил, нашёл.
Цитата http://www.script-omen.com/2014/03/excel-udf.html Создание пользовательских функций (формул) в Excel (UDF):
|
||
------- Последний раз редактировалось megaloman, 19-04-2017 в 16:45. Отправлено: 16:35, 19-04-2017 | #5 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать |
Последний раз редактировалось Iska, 20-04-2017 в 10:11. Причина: Некорректная информация. Отправлено: 21:41, 19-04-2017 | #6 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Iska, В той таблице, что я представил, у меня пересчёт работает.
|
------- Отправлено: 09:13, 20-04-2017 | #7 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать megaloman, подтверждаю.
Цитата:
|
|
Последний раз редактировалось Iska, 30-04-2017 в 01:53. Причина: Некорректная информация Отправлено: 10:10, 20-04-2017 | #8 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать megaloman, исправляюсь: на самом деле™ указанное поведение присутствовало с самой первой версии VB (в Microsoft Excel 5.0, когда он ещё даже не получил
Поправил своё предыдущее сообщение. |
Последний раз редактировалось Iska, 30-04-2017 в 11:56. Причина: И тут ошибся :(. Ну, какая же это «приставка»? «Суффикс»! Отправлено: 01:52, 30-04-2017 | #9 |
Ветеран Сообщения: 2732
|
Профиль | Отправить PM | Цитировать Цитата Iska:
|
|
------- Отправлено: 12:07, 01-05-2017 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
VBS/WSH/JS - [решено] Макрос для сдвига времени в телепрограмме.doc | d22cva | Скриптовые языки администрирования Windows | 2 | 18-01-2017 00:35 | |
2010 - Перевод суммы | habib2302 | Microsoft Office (Word, Excel, Outlook и т.д.) | 1 | 25-06-2016 22:21 | |
Система - Один из компов сети не синхронизируется по времени с сервером времени | goodhash72 | Программное обеспечение Windows | 3 | 29-10-2013 16:14 | |
2010 - Макрос даты и времени | fraid | Microsoft Office (Word, Excel, Outlook и т.д.) | 3 | 28-08-2013 21:03 | |
Ошибка контрольной суммы | WooLK | Непонятные проблемы с Железом | 12 | 04-01-2009 19:23 |
|