Код ниже должен быть установлен в модуле кода вашей пользовательской формы. Он запустится, когда вы завершите изменение в TextBox6.
Private Sub TextBox6_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim TbxVal As String
With TextBox6
TbxVal = .Value
If IsDate(TbxVal) Then
Cells(6, "B").Value = DateValue(TbxVal)
With TextBox21
If Len(.Value) = 0 Then
' this command would prevent any event procedure
' attached to TextBox21 from being executed
' based on the entry about to be made.
Application.EnableEvents = False
.Value = Format(DateValue(TbxVal) + 6, "dd mmm, yyyy")
Application.EnableEvents = True
End If
End With
Else
MsgBox "Enter a valid date", vbExclamation, "Invalid date format"
.SetFocus
.SelStart = 0
.SelLength = Len(TbxVal)
Cancel = True
End If
End With
End Sub
Сначала он проверит, если вы ввели дату, и сообщит, что ваша запись не понята. Затем он запишет запись на лист, используя DateValue
, а не текстовую строку. Далее будет записано то же значение DateValue, увеличенное на 6, а затем отформатированное в виде строки даты в TextBox21. Посмотрите, как строка из TextBox6 преобразуется в истинную дату (число), используется в вычислениях, а затем преобразуется обратно в строку, которая может быть передана в TextBox.
Вас может удивить, почему значение TextBox6 назначается переменной, а не используется напрямую. С одной стороны, адресация проще. С другой стороны, легче дать значимое имя переменной. И, наконец, доступ к переменной происходит быстрее, чем обращение к пользовательской форме (то же самое относится и к переменным, хранящимся в таблицах).