Formatting MM/DD/YYYY dates in textbox in VBA

前端 未结 9 1669
故里飘歌
故里飘歌 2020-11-22 10:47

I\'m looking for a way to automatically format the date in a VBA text box to a MM/DD/YYYY format, and I want it to format as the user is typing it in. For instance, once the

相关标签:
9条回答
  • 2020-11-22 11:18

    Add something to track the length and allow you to do "checks" on whether the user is adding or subtracting text. This is currently untested but something similar to this should work (especially if you have a userform).

    'add this to your userform or make it a static variable if it is not part of a userform
    private oldLength as integer
    
    Private Sub txtBoxBDayHim_Change()
        if ( oldlength > txboxbdayhim.textlength ) then
            oldlength =txtBoxBDayHim.textlength
            exit sub
        end if
    
        If txtBoxBDayHim.TextLength = 2 or txtBoxBDayHim.TextLength = 5 then
        txtBoxBDayHim.Text = txtBoxBDayHim.Text + "/"
        end if
        oldlength =txtBoxBDayHim.textlength
    End Sub
    
    0 讨论(0)
  • 2020-11-22 11:24

    While I agree with what's mentioned in the answers below, suggesting that this is a very bad design for a Userform unless copious amounts of error checks are included...

    to accomplish what you need to do, with minimal changes to your code, there are two approaches.

    1. Use KeyUp() event instead of Change event for the textbox. Here is an example:

      Private Sub TextBox2_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
      
          Dim TextStr As String
          TextStr = TextBox2.Text
      
          If KeyCode <> 8 Then ' i.e. not a backspace
      
              If (Len(TextStr) = 2 Or Len(TextStr) = 5) Then
                  TextStr = TextStr & "/"
              End If
      
          End If
          TextBox2.Text = TextStr
      End Sub
      
    2. Alternately, if you need to use the Change() event, use the following code. This alters the behavior so the user keeps entering the numbers, as

      12072003
      

    while the result as he's typing appears as

        12/07/2003
    

    But the '/' character appears only once the first character of the DD i.e. 0 of 07 is entered. Not ideal, but will still handle backspaces.

        Private Sub TextBox1_Change()
            Dim TextStr As String
    
            TextStr = TextBox1.Text
    
            If (Len(TextStr) = 3 And Mid(TextStr, 3, 1) <> "/") Then
                TextStr = Left(TextStr, 2) & "/" & Right(TextStr, 1)
            ElseIf (Len(TextStr) = 6 And Mid(TextStr, 6, 1) <> "/") Then
                TextStr = Left(TextStr, 5) & "/" & Right(TextStr, 1)
            End If
    
            TextBox1.Text = TextStr
        End Sub
    
    0 讨论(0)
  • 2020-11-22 11:26

    This is the same concept as Siddharth Rout's answer. But I wanted a date picker which could be fully customized so that the look and feel could be tailored to whatever project it's being used in.

    You can click this link to download the custom date picker I came up with. Below are some screenshots of the form in action.

    Three example calendars

    To use the date picker, simply import the CalendarForm.frm file into your VBA project. Each of the calendars above can be obtained with one single function call. The result just depends on the arguments you use (all of which are optional), so you can customize it as much or as little as you want.

    For example, the most basic calendar on the left can be obtained by the following line of code:

    MyDateVariable = CalendarForm.GetDate
    

    That's all there is to it. From there, you just include whichever arguments you want to get the calendar you want. The function call below will generate the green calendar on the right:

    MyDateVariable = CalendarForm.GetDate( _
        SelectedDate:=Date, _
        DateFontSize:=11, _
        TodayButton:=True, _
        BackgroundColor:=RGB(242, 248, 238), _
        HeaderColor:=RGB(84, 130, 53), _
        HeaderFontColor:=RGB(255, 255, 255), _
        SubHeaderColor:=RGB(226, 239, 218), _
        SubHeaderFontColor:=RGB(55, 86, 35), _
        DateColor:=RGB(242, 248, 238), _
        DateFontColor:=RGB(55, 86, 35), _
        SaturdayFontColor:=RGB(55, 86, 35), _
        SundayFontColor:=RGB(55, 86, 35), _
        TrailingMonthFontColor:=RGB(106, 163, 67), _
        DateHoverColor:=RGB(198, 224, 180), _
        DateSelectedColor:=RGB(169, 208, 142), _
        TodayFontColor:=RGB(255, 0, 0), _
        DateSpecialEffect:=fmSpecialEffectRaised)
    

    Here is a small taste of some of the features it includes. All options are fully documented in the userform module itself:

    • Ease of use. The userform is completely self-contained, and can be imported into any VBA project and used without much, if any additional coding.
    • Simple, attractive design.
    • Fully customizable functionality, size, and color scheme
    • Limit user selection to a specific date range
    • Choose any day for the first day of the week
    • Include week numbers, and support for ISO standard
    • Clicking the month or year label in the header reveals selectable comboboxes
    • Dates change color when you mouse over them
    0 讨论(0)
提交回复
热议问题