Как получить разницу в количестве дней в Excel VBA?
В настоящее время я работаю над проектом библиотечной системы с использованием Excel VBA, и мне нужен модуль, который проверяет просроченные книги, а также рассчитывает штрафы, наложенные на пользователя, у которого просроченная книга.
Это код, который у меня есть, и он, очевидно, не работает.
Dim fine, count, count2 As Integer
Dim currentdate, borroweddate, difference As String
'this is the amount of fine imposed per day (50 cents)
fine = 1 / 2
'gets number of borrowing records
count = Sheets("borrowing records").Range("K1").Value
'count2 is just a counter for the cells
count2 = 2
'gets the current date
currentdate = Now()
While (count2 < count + 2)
If (Sheets("borrowing records").Cells(count2, 8).Value = "ON LOAN") Then
difference = currentdate - Sheets("borrowing records").Cells(count2, 4).Value
If (difference > 20) Then
'prints the overdue record
Sheets("display").Cells(count2, 1).Value = Sheets("borrowing records").Cells(count2, 1).Value
Sheets("display").Cells(count2, 2).Value = Sheets("borrowing records").Cells(count2, 2).Value
Sheets("display").Cells(count2, 3).Value = Sheets("borrowing records").Cells(count2, 3).Value
Sheets("display").Cells(count2, 4).Value = Sheets("borrowing records").Cells(count2, 4).Value
Sheets("display").Cells(count2, 5).Value = difference * fine
End If
Else
count2 = count2 + 1
End If
Wend
Sheets("display").Select
Когда я попытался запустить подобный код для проверки значения разности, я получил случайные числа с очень длинными десятичными числами. Я не знаю почему. Результаты, которые я получил, даже не приблизились к реальной разнице в днях. Например, если я проверю разницу в днях между 20 марта и 1 марта, я получу что-то вроде 4.35648920486E32E, и да, в результате когда-нибудь была буква "E".
Мое первоначальное намерение состояло в том, чтобы кодирование осуществляло поиск по рабочему листу ("записи заимствований"), где программа хранит записи заимствованных книг.
Программа сравнивает дату заимствования книги и текущую дату, чтобы определить, не превышен ли лимит в 20 дней.
Если это так, он рассчитает штраф, умножив разницу в дате на сумму штрафа в день (в данном случае это 50 центов). Затем программа должна распечатать просроченные записи, а также наложенный штраф, на другом листе ("отображение").
Я знаю, что программа не будет работать, возможно, из-за формата даты или чего-то в этом роде. Однако я понятия не имею, как это решить.
Мой проект должен быть в понедельник, и я просто надеюсь, что кто-то, читающий это, поможет мне в этом. Спасибо!
2 ответа
Так как у нас слишком много цепочек комментариев. Я думал, что я начну новый ответ:
Для вашей разницы дат используйте DateDiff
функционировать так:
difference = DateDiff("d", currentdate, Sheets("borrowing records").Cells(count2, 4).Value, vbMonday)
где "d"
представляет разницу в количестве дней и vbMonday
сообщает системе, что наша неделя начинается в понедельник (я думаю, по умолчанию это воскресенье - сомнение актуально для вас сейчас, но помните о будущем использовании)
Это даст вам простое количество дней ответа, которое вы и получите. Умножьте его на свое плавающее штрафное значение, и я думаю, что это все, что вам нужно для решения текущей проблемы. Не нужно проходить форматирование даты, так как результатом будет просто нормальное число.
Dim fine, count, count2 As Integer
Dim currentdate, borroweddate, difference As String
'this is the amount of fine imposed per day (50 cents)
fine = 1 / 2 ' integers don't do floating point!
Вы смотрели на стоимость fine
? Я думаю, что вы можете обнаружить, что вы недооцениваете своих просроченных заемщиков;-)
Что здесь происходит?
difference = currentdate - Sheets("borrowing records").Cells(count2, 4).Value
Попробуйте добавить строку, чтобы увидеть, если вы получаете ответ, который вы ожидаете, что-то вроде
difference = currentdate - Sheets("borrowing records").Cells(count2, 4).Value
Debug.Print currentdate, Sheets("borrowing records").Cells(count2, 4).Value, difference