Текстовое поле и формат ячейки VBA - PullRequest
1 голос
/ 02 марта 2020

У меня есть пользовательская форма с текстовым полем, которое позволяет мне ввести дату, затем эта дата копируется в столбец / ячейку, отформатированную как длинная дата «1 января 2020 года». Однако, когда я ввожу дату «01.01.2020» в текстовое поле формы пользователя, дата не соответствует формату ячейки. У кого-нибудь есть идеи как можно это исправить? Это код:

Dim lrow As Long
Dim LO As ListObject
Dim LEO As Range
Set ws = Worksheets("2020_Data")
Set LO = ws.ListObjects("Table1")
'lrow = ws.Cells(Rows.Count, "B") .End(xlUp). .Offset(1, 0) .Row
With LO.Range.Columns(2)
Set LEO = .Find(what:="", after:=.Cells(1), LookIn:=xlValues, _
    searchorder:=xlByRows, searchdirection:=xlNext)
If Not LEO Is Nothing Then
    lrow = LEO.Row
'        MsgBox LEO.Row 'First empty row at column B
End If
End With
'rw = ws.Cells.Find(What:="*", SearchOrder:=xlRows, SearchDirection:=xlPrevious, LookInValues) .Row + 
1
With ws
   .Cells(lrow, "B").Value = DateValue(Me.TextBox6.Value)
   .Cells(lrow, "C").Value = DateValue(Me.TextBox21.Value)
   .Cells(lrow, "F").Value = Me.ComboBox2.Value
   .Cells(lrow, "G").Value = Me.ComboBox3.Value
   .Cells(lrow, "I").Value = Me.TextBox16.Value
   .Cells(lrow, "H").Value = Me.TextBox17.Value
   .Cells(lrow, "J").Value = Me.TextBox18.Value
End With
 'Clear Input Controls.
 Me.TextBox6 = ""
 Me.TextBox21 = ""
 Me.ComboBox2 = ""
 Me.ComboBox3 = ""
 Me.TextBox16 = ""
 Me.TextBox17 = ""
 Me.TextBox18 = "" 
End Sub

Заранее спасибо за помощь! :)

1 Ответ

0 голосов
/ 02 марта 2020

Код ниже должен быть установлен в модуле кода вашей пользовательской формы. Он запустится, когда вы завершите изменение в 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 назначается переменной, а не используется напрямую. С одной стороны, адресация проще. С другой стороны, легче дать значимое имя переменной. И, наконец, доступ к переменной происходит быстрее, чем обращение к пользовательской форме (то же самое относится и к переменным, хранящимся в таблицах).

...