Создание функции VBA, которая преобразует минуты в чч: мм: сс

Я пытаюсь взять значение минуты (например, 3,83 минуты) и преобразовать его в формат времени чч: мм: сс (который, как я знаю, равен 0:03:50).

По какой-то причине .NumberFormat, записанный из макроса, не работает и дает мне #VALUE! ошибка.

    Function MINtoHMS(MIN)
    MIN = MIN / (24 * 60)
    MINtoHMS = MIN
    MINtoHMS.NumberFormat = "[h]:mm:ss;@"
    End Function

person engineerchange    schedule 20.02.2013    source источник


Ответы (3)


-Edit- Для использования в качестве надстройки

Надстройка Excel: http://www.filedropper.com/mintohms

Создайте модуль класса с именем SheetChangeHandler со следующим кодом:

Option Explicit

Private WithEvents App As Application

Private Sub Class_Initialize()
    Set App = Application
End Sub

Private Sub App_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    On Error GoTo Err
    If InStr(Target.Formula, "=MINtoHMS") Then
        Target.NumberFormat = "hh:mm:ss"
    End If
    On Error GoTo 0
    Exit Sub
Err:
End Sub

Добавьте модуль со следующим кодом:

Option Explicit

Public MySheetHandler As SheetChangeHandler

Sub Auto_Open()
   Set MySheetHandler = New SheetChangeHandler
End Sub

Function MINtoHMS(MIN)
    MIN = MIN / (24 * 60)
    MINtoHMS = MIN
End Function

Щелкните Файл> Сохранить как> Надстройка Excel 97-2003 (* .xla)> Сохранить.

Щелкните Файл> Параметры> Надстройки.

Нажмите "Перейти ..." рядом с "Управление: надстройки Excel".

Установите флажок рядом с только что созданной надстройкой.

Нажмите "ОК".

person Ripster    schedule 20.02.2013
comment
По той или иной причине после запуска функции значение в ячейке блокируется. Это означает, что когда я пытаюсь изменить значение на другой формат, ничего не происходит. Это почти как если бы вывод был в текстовом формате. Еще одним признаком того, что теперь это текстовый формат, является автоматическая ориентация значения в ячейке влево. - person engineerchange; 20.02.2013
comment
Это не меняет форматирование ячеек. Все, что он делает, это конвертирует число в желаемый формат и выводит результат. Я не понимаю, почему вы пытаетесь изменить формат на что-то другое после преобразования его в h: mm: ss. Если это не тот формат, зачем вообще его менять? - person Ripster; 20.02.2013
comment
Поскольку он не изменился на формат hh: mm: ss, но был выведен как текстовый формат с этим синтаксисом, я не могу взаимодействовать с другими ячейками (я усредняю ​​время в формате hh: mm: ss) . - person engineerchange; 20.02.2013
comment
Добавьте приведенный выше код на рабочий лист, в котором вы используете функцию, и измените функцию для вывода числа, и это должно дать вам желаемый результат. Если вы используете функцию на нескольких листах, ее можно изменить, чтобы она работала на каждом листе в вашей книге. - person Ripster; 20.02.2013
comment
Есть ли способ включить частную подпрограмму в надстройку, чтобы она работала на всех листах? Кроме того, при помещении его в объект ThisWorkbook я не мог заставить его работать. - person engineerchange; 20.02.2013
comment
Я добавил код книги выше. Это заставит его работать на всех листах. - person Ripster; 20.02.2013
comment
Однако нет возможности разместить этот код ThisWorkbook в надстройке, чтобы он мог работать с любым открытым файлом Excel? - person engineerchange; 21.02.2013
comment
См. Выше для использования в качестве надстройки - person Ripster; 21.02.2013

Во-первых, вы не можете изменить формат ячейки Excel с помощью ее формулы. Формула ячейки может только назначать значение ячейки (или диапазона).

Во-вторых, вам действительно следует объявить некоторые типы данных в ваших функциях, что предотвратит множество загадочных ошибок и других странных результатов.

Что-то вроде этого должно быть нормально:

Function MINtoHMS(MIN As Double) As Date
    MIN = MIN / (24 * 60)
    MINtoHMS = MIN
End Function

Единственный способ полностью контролировать то, что видно через функцию, - это вернуть вместо этого отформатированную строку, как показывает Рипстер в своем ответе.

person RBarryYoung    schedule 20.02.2013

Попробуйте следующие методы.

DAYS = Format(Int([Expr3]/86400), "00") - will correctly display days
HOURS = Format(Int(([Expr3])/3600) - ((Int([Expr3]*86400)/3600), "00") - DOES NOT CORRECTLY display correct hours
HOURS = Format(Int([Expr3]/3600),"00") - What will display hours
MINUTES = Int(([Expr3]-(Int([Expr3]/3600)*3600))/60)
SECONDS = Format((([Expr3] Mod 60)),"00")

dTotalSeconds = DateDiff("S", Now(), dChristmasDate)
    iDays = Int(dTotalSeconds / 86400)
    iHours = Int((dTotalSeconds Mod 86400) / 3600)
    iMinutes = Int(((dTotalSeconds Mod 86400) Mod 3600) / 60)
    iSeconds = ((dTotalSeconds Mod 86400) Mod 3600) Mod 60

'Используя эту функцию, вы можете конвертировать минуты в чч: мм: сс

    Public Function HMStoSec(strHMS As String) As Long
        HMStoSec = Split(strHMS, ":")(0) * 3600 + _
                   Split(strHMS, ":")(1) * 60 + _
                   Split(strHMS, ":")(2)
    End Function
person Krishna    schedule 20.02.2013