MS Access странные номера - PullRequest
0 голосов
/ 12 апреля 2020

Я получаю странные числа от функции в VBA.

У меня есть непрерывные формы, где есть кнопка, из которой пользователь может манипулировать суммой часов в текстовом поле. Это текстовое поле находится в нижнем колонтитуле формы.

Мой код выглядит следующим образом:

Private Sub Option39_Click()
    Dim time As Double

    'calculate time to format
    time = 25 / 24

    If Option39.Value = True Then
         Debug.Print dblTotal
        dblTotal = dblTotal + time
         Debug.Print dblTotal
        Me.txtTotalTeamTotal = FormatUnlimitedHours(dblTotal)
         Debug.Print dblTotal
    Else
        dblTotal = dblTotal - time
        Me.txtTotalTeamTotal = FormatUnlimitedHours(dblTotal)
    End If
End Sub

из debug.print Я получаю эти значения

3,66611111111111 
4,70777777777778 
112,986666666667 

, которые я надеваю Не понимаю, почему dblTotal меняет свое значение с 4,70777777777778 to 112,986666666667 Почему было изменено число?

Функция FormatUnlimitedHours () определяется следующим образом:

Public Function FormatUnlimitedHours(time As Variant) As Variant
    'function that can have unlimited number of hours in hh:mm:ss format
    Dim comma As Integer
    Dim hours As Variant
    Dim minutes As Variant
    'switch to hours format
    time = time * 24

    If time > 23 Then

        comma = InStr(time, ",") - 1

        If Not comma < 0 Then
            minutes = "0," & Mid(time, comma + 2, Len(time) - comma + 1)
            minutes = format(minutes / 24, "hh:mm:ss")
            hours = CDbl(Left(time, comma)) + CDbl(Left(minutes, InStr(minutes, ":") - 1))
            FormatUnlimitedHours = hours & ":" & Mid(minutes, InStr(minutes, ":") + 1, 5)
            Exit Function
        Else
            'for whole numbers
            FormatUnlimitedHours = time & ":00:00"
            Exit Function
        End If

    End If

    FormatUnlimitedHours = format(time / 24, "hh:mm:ss")

End Function

начальное значение dblTotal равно определяется при загрузке формы

Private Sub Form_Load()

    dblTotal = DSum("sumOfTotalTime", "QueryTime")

End Sub

1 Ответ

1 голос
/ 12 апреля 2020

Тим Уильямс ответил на ваш вопрос. Однако вы никогда не должны обрабатывать дату и время как что-либо еще, кроме DateTime. Это только усложняет ситуацию.

Например, запятая не является десятичным разделителем в большинстве говорящих по-английски sh стран, а «базовый» тип DateTime - Double, поэтому обычно нет никакой разницы для преобразования обратно и далее между DateTime и Double.

Вот пример аналогичной функции, следующей этим правилам, что также делает ее намного проще:

Public Function FormatHourMinuteSecond( _
  ByVal datTime As Date, _
  Optional ByVal strSeparator As String = ":") _
  As String

' Returns count of days, hours, minutes, and seconds of datTime
' converted to hours, minutes, and seconds as a formatted string
' with an optional choice of time separator.
'
' Example:
'   datTime: #10:03:55# + #20:01:24#
'   returns: 30:05:19
'
' 2014-06-17. Cactus Data ApS, CPH.

  Dim strHour       As String
  Dim strMinuteSec  As String
  Dim strHours      As String

  strHour = CStr(Fix(datTime) * 24 + Hour(datTime))
  ' Add leading zero to minute and second count when needed.
  strMinuteSec = Right("0" & CStr(Minute(datTime)), 2) & strSeparator & Right("0" & CStr(Second(datTime)), 2)
  strHours = strHour & strSeparator & strMinuteSec

  FormatHourMinuteSecond = strHours

End Function

Пример:

? FormatHourMinuteSecond(25 / 24)
25:00:00
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...