文本框&;单元格式VBA

文本框&;单元格式VBA,vba,userform,cell-formatting,Vba,Userform,Cell Formatting,我有一个带有文本框的用户表单,允许我输入日期,然后将该日期复制到一个列/单元格中,格式为长日期“2020年1月1日”。但是,当我在用户表单文本框中输入日期“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")

我有一个带有文本框的用户表单,允许我输入日期,然后将该日期复制到一个列/单元格中,格式为长日期“2020年1月1日”。但是,当我在用户表单文本框中输入日期“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

提前感谢您的帮助!:)

以下代码必须安装在用户表单的代码模块中。当您在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
端接头

它将首先检查您是否输入了日期,如果您的输入不被理解,它将进行投诉。然后,它将使用
DateValue
而不是文本字符串将条目写入工作表。接下来,它会将相同的日期值增加6,然后将其格式化为日期字符串,并写入TextBox21。观察TextBox6中的字符串如何转换为计算中使用的真实日期(数字),然后再转换回可反馈到TextBox6的字符串


您可能想知道为什么TextBox6的值被分配给变量而不是直接使用。首先,这样寻址更容易。另一方面,给变量起一个有意义的名字更容易。最后,访问变量要比引用用户表单快(工作表中存储的变量也是如此)。

以下代码必须安装在用户表单的代码模块中。当您在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
端接头

它将首先检查您是否输入了日期,如果您的输入不被理解,它将进行投诉。然后,它将使用
DateValue
而不是文本字符串将条目写入工作表。接下来,它会将相同的日期值增加6,然后将其格式化为日期字符串,并写入TextBox21。观察TextBox6中的字符串如何转换为计算中使用的真实日期(数字),然后再转换回可反馈到TextBox6的字符串


您可能想知道为什么TextBox6的值被分配给变量而不是直接使用。首先,这样寻址更容易。另一方面,给变量起一个有意义的名字更容易。最后,访问变量要比引用用户表单快(工作表中存储的变量也是如此)。

这是因为文本框中包含字符串,而日期本质上是一个数字。试试“.Cells(lrow,“J”).Value=DateValue(Me.TextBox18.Value)`Hi@Variatus,感谢它在本质上起作用。但是,当我在textbox6和21上尝试这两个代码时,总是会遇到一个错误。看起来我可以在两个文本框上运行代码,但是我需要在两个文本框的userform中输入数据。有没有一种方法可以让我运行上述代码而不必将数据填入框中?让我选择只输入开始日期还是同时输入开始和结束日期?谢谢请编辑问题,仅包含相关代码。无论如何,你可以尝试使用3个文本框分别表示月份、日期和年份。然后在后台使用
DateSerial
构建日期,然后将其转储到工作表中。请在帖子中显示哪些输入有效,哪些输入失败,以及对这些情况的预期。这是因为文本框中包含字符串,日期本质上是一个数字。试试“.Cells(lrow,“J”).Value=DateValue(Me.TextBox18.Value)`Hi@Variatus,感谢它在本质上起作用。但是,当我在textbox6和21上尝试这两个代码时,总是会遇到一个错误。看起来我可以在两个文本框上运行代码,但是我需要在两个文本框的userform中输入数据。有没有一种方法可以让我运行上述代码而不必将数据填入框中?让我选择只输入开始日期还是同时输入开始和结束日期?谢谢请编辑问题,仅包含相关代码。无论如何,你可以尝试使用3个文本框分别表示月份、日期和年份。然后使用
DateSerial
在后台构建日期,然后将其转储到工作表中。请在帖子中显示哪些输入有效,哪些输入失败,以及这些情况下的预期结果。