2015-07-23 1 views
1

Используя следующий код, я увеличиваю значение даты, отображаемой в TextBox с помощью SpinButtons.Excel VBA Userform - Как увеличить/уменьшить дату на один месяц

MainUserForm_Initialize() 
DateTextBox.Value = Format(Date, "dd-mm-YYYY") 
... 
End Sub 

'Add one day when spinning up. 
Private Sub SpinButtonDate1_SpinUp() 
    With DateTextBox 
     .Value = Format(DateAdd("d", 1, .Value), "dd-mm-yyyy") 
    End With 
End Sub 

'Remove one day when spinning down. 
Private Sub SpinButtonDate1_SpinDown() 
    With DateTextBox 
     .Value = Format(DateAdd("d", -1, .Value), "dd-mm-yyyy") 
    End With 
End Sub 

Проблема заключается в том, если бы я прясть вниз 11-07-2015, оно идет от 12-07-2015 до 06-12-2015 вместо 11-07-2015. Почему это? (У меня такая же проблема при увеличении значения. Даты приведены лишь в качестве примера.)

+0

Даты «американизируются» в VBA и интерпретируются как mm/dd/yyyy. Я предполагаю, что .Value - это не то, что вы ожидаете (я знаю, что вы применяете «Формат», но формат просто изменяет то, как даты визуализируются, а не интерпретируются фактически). Посмотрите на функцию DateSerial (http://www.techonthenet.com/excel/formulas/dateserial.php) – sous2817

+0

Установлены ли в ваших региональных настройках порядок дат MM/dd/yyyy? Это вызовет описанную вами проблему и смущает меня, почему вы хотите отображать даты в формате dd-mm-yyyy. – Rory

ответ

2

У меня такая же проблема, если я установил свой региональный формат в США. Попробуйте это исправление, которое должно работать независимо от ваших региональных настроек:

'Add one day when spinning up. 
Private Sub SpinButtonDate1_SpinUp() 
    With DateTextBox 
     .Value = Format(GetDateFromUK(.Value) + 1, "dd-mm-yyyy") 
    End With 
End Sub 

'Remove one day when spinning down. 
Private Sub SpinButtonDate1_SpinDown() 
    With DateTextBox 
     .Value = Format(GetDateFromUK(.Value) - 1, "dd-mm-yyyy") 
    End With 
End Sub 
Function GetDateFromUK(sDate As String, Optional sSeparator As String = "-") As Date 
    Dim vParts 
    vParts = Split(sDate, sSeparator) 
    GetDateFromUK = DateSerial(vParts(2), vParts(1), vParts(0)) 
End Function