2015-02-25 2 views
0

В пользовательской форме в excel, используя vba, мне нужно найти конец месяца. Например, дата начала 01.01.2015, дата окончания будет автоматически 31.01.2015. Я пытаюсь использовать этот код:Конец месяца за месяц

Private Function dhLastDayInMonth(Optional dtmDate As Date = 0) As Date 
    ' Return the last day in the specified month. 

If dtmDate = 0 Then 
     ' Did the caller pass in a date? If not, use 
     ' the current date. 
     dtmDate = Date 
End If 

dhLastDayInMonth = DateSerial(Year(dtmDate), _ 
    Month(dtmDate) + 1, 0) 

End Function 

но этот код возвращает только в конце февраля. Пример: дата начала: 01.01.2015 мой код возвращает 28.02.2015 или дата начала: 05.02.2015 мой код возвращает 28.02.2015

Seconde код строка для редактирования в текстовом поле, чтобы вставить дату окончания

Private Sub txtEDate_Change() 

If txtEDate.Text = "" Then 
    MsgBox "You must enter a Date! " 
    Exit Sub 
End If 

If txtEDate.TextLength = 2 Or txtEDate.TextLength = 5 Then 
    txtEDate.Text = txtEDate.Text + "." 
End If 

If txtEDate.TextLength = 2 Or txtEDate.TextLength = 5 Then 
txtEDate.Text = txtEDate.Text + "DD/MM/YYYY" 
End If 

txtEDate.Text = dhLastDayInMonth() 

End Sub 
+2

Это, по-видимому, потому, что строка 'dtmDate = Date' всегда выполняется в вашем случае? В любом случае попробуйте [встроенное решение] (https://support.office.com/en-us/article/EOMONTH-function-1525129b-fafb-44fc-90cd-4bea29ddda57). – GSerg

+0

Согласен с @Gserg. Попробуйте дважды проверить свой ввод. Если это так, как вы его написали, я не думаю, что Excel или VBA распознают этот формат как дату. – L42

+1

Я проверил ваш код и не смог воспроизвести вашу проблему. Код работал должным образом. –

ответ

0

Вы должны определить год и месяц, как входы, чтобы получить последнюю дату в месяц:

Public Function LastDayInMonth(dIn As Date) As Date 
    LastDayInMonth = DateSerial(Year(dIn), Month(dIn) + 1, 0) 
End Function 

даст последнюю дату в каком-то месяце , но только если dIn имеет правильное значение.

Очевидно, вы должны MsgBoxdtmDate в верхней части UDF.