Ну, вот, пока я свою UDF-ку писАл, которая просто преобразует глючную дату в ячейке в нормальный вид, а дальше с данными можно будет работать обычными формулами:
Code
Function NormTime(xCell As Range) As Date Dim Arr, i% Arr = Split(xCell.Value) For i = 0 To UBound(Arr) - 1 Step 2 Select Case Arr(i + 1) Case "мин" NormTime = DateAdd("n", Arr(i), NormTime) Case "сек" NormTime = DateAdd("s", Arr(i), NormTime) End Select Next i End Function
nilem уже давно практически тем же методом сумму всего диапазона нашёл. Хотя, ИМХО, всё-таки преобразовывать данные КАЖДОЙ ячейки в отдельном вспомогательном столбце, как предлагал и сделал я, правильнее.
Ну, вот, пока я свою UDF-ку писАл, которая просто преобразует глючную дату в ячейке в нормальный вид, а дальше с данными можно будет работать обычными формулами:
Code
Function NormTime(xCell As Range) As Date Dim Arr, i% Arr = Split(xCell.Value) For i = 0 To UBound(Arr) - 1 Step 2 Select Case Arr(i + 1) Case "мин" NormTime = DateAdd("n", Arr(i), NormTime) Case "сек" NormTime = DateAdd("s", Arr(i), NormTime) End Select Next i End Function
nilem уже давно практически тем же методом сумму всего диапазона нашёл. Хотя, ИМХО, всё-таки преобразовывать данные КАЖДОЙ ячейки в отдельном вспомогательном столбце, как предлагал и сделал я, правильнее.Alex_ST
С уважением, Алексей MS Excel 2003 - the best!!!
Сообщение отредактировал Alex_ST - Среда, 02.02.2011, 20:25
Вот, примерчик сделал чтобы проще было понять. К стати: 1. Выяснил, что мой подход был правильным - лучше создавать дополнительный столбец, в ячейках которого время будет нормальным. Это позволит выявить, где сумма оператором связи была посчитана не правильно. А это в таблице, как выяснилось - в трёх местах. Пришлось на всякий случай сделать ещё один доп.столбец для выявления ошибок. 2. Я не понял, что там за странный тариф - 27,2944 руб. в минуту? Если это курс USD, то он что-то не тот и получать его лучше прямым запросом на сервак СБ РФ (я там в примере сделал для примера одну ячейку с запросом курса, а подробнее - см. в разделе "Есть готовое решение"). 3. Приложенный pasha_malov файл имеет явное "ожирение" - 1,5 метра. Прогнал его фитнес-макросом ReduceSize, разместив макрос в Module2 файла и он сразу "похудел" почти в 8 раз - 210 кило вместе со всеми моими доработками.
Вот, примерчик сделал чтобы проще было понять. К стати: 1. Выяснил, что мой подход был правильным - лучше создавать дополнительный столбец, в ячейках которого время будет нормальным. Это позволит выявить, где сумма оператором связи была посчитана не правильно. А это в таблице, как выяснилось - в трёх местах. Пришлось на всякий случай сделать ещё один доп.столбец для выявления ошибок. 2. Я не понял, что там за странный тариф - 27,2944 руб. в минуту? Если это курс USD, то он что-то не тот и получать его лучше прямым запросом на сервак СБ РФ (я там в примере сделал для примера одну ячейку с запросом курса, а подробнее - см. в разделе "Есть готовое решение"). 3. Приложенный pasha_malov файл имеет явное "ожирение" - 1,5 метра. Прогнал его фитнес-макросом ReduceSize, разместив макрос в Module2 файла и он сразу "похудел" почти в 8 раз - 210 кило вместе со всеми моими доработками.Alex_ST
Чуть "подполировал" свою ЮДФ-ку Теперь не мешают лишние пробелы, имеющиеся в текстовом варианте времени. И обозначения единиц измерения теперь могут быть не строго "мин" и "сек", а только начинаться с этих трёх букв (мин., минут, сек., секунд)
Code
Function NormTime(xCell As Range) As Date Dim Arr, i% Arr = Split(Application.WorksheetFunction.Trim(xCell(1).Value)) ' "расщепить" текст первой ячейки в одномерный массив, считая пробел разделителем данных For i = 0 To UBound(Arr) Step 2 Select Case Left(Arr(i + 1), 3) Case "мин" NormTime = DateAdd("n", Arr(i), NormTime) Case "сек" NormTime = DateAdd("s", Arr(i), NormTime) End Select Next i End Function
Чуть "подполировал" свою ЮДФ-ку Теперь не мешают лишние пробелы, имеющиеся в текстовом варианте времени. И обозначения единиц измерения теперь могут быть не строго "мин" и "сек", а только начинаться с этих трёх букв (мин., минут, сек., секунд)
Code
Function NormTime(xCell As Range) As Date Dim Arr, i% Arr = Split(Application.WorksheetFunction.Trim(xCell(1).Value)) ' "расщепить" текст первой ячейки в одномерный массив, считая пробел разделителем данных For i = 0 To UBound(Arr) Step 2 Select Case Left(Arr(i + 1), 3) Case "мин" NormTime = DateAdd("n", Arr(i), NormTime) Case "сек" NormTime = DateAdd("s", Arr(i), NormTime) End Select Next i End Function