【问题标题】:Textbox & Cell Format VBA文本框和单元格格式 VBA
【发布时间】:2020-06-14 07:07:31
【问题描述】:

我有一个带有文本框的用户表单,允许我输入日期,然后该日期复制到格式为长日期“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

提前感谢您的帮助! :)

【问题讨论】:

  • 这是因为TextBox保存了一个字符串,而日期本质上是一个数字。试试`.Cells(lrow, "J").Value = DateValue(Me.TextBox18.Value)`
  • 嗨@Variatus,感谢它本质上是有效的。但是,当我在两个文本框上尝试代码时,我一直收到错误:textbox6 和 21。看来我可以在两个文本框上运行代码,但是我需要在两个文本框的用户表单中输入数据。有没有一种方法可以运行上述代码而无需将数据填充到框中?让我选择只输入开始日期还是同时输入开始日期和结束日期?谢谢!
  • 请编辑问题以仅包含相关代码。无论如何,您可以尝试分别使用 3 个文本框来表示月、日和年。然后使用DateSerial 在后台构造日期,然后将其转储到工作表中。
  • edit 发帖说明哪些输入有效,哪些输入失败,以及在这些情况下的预期结果。

标签: vba userform cell-formatting


【解决方案1】:

下面的代码必须安装在您的用户窗体的代码模块中。当您在 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而不是文本字符串将条目写入工作表。接下来,它将相同的 DateValue 增加 6,然后格式化为 TextBox21 的日期字符串。观察 TextBox6 中的字符串如何转换为真实日期(数字),用于计算,然后再转换回可输入到 TextBox 的字符串。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多