2016-08-01 244 views
0

我有一個UserForm,其中包含一系列CheckBoxes,TextBoxesButtons。一個TextBox詢問用戶特定的日期,一旦點擊了OKButton,它將檢查用戶的日期格式。我使用了一個Select/Case檢查不同的格式的用戶輸入,並將其轉換爲特定格式的文件名目的(本宏接受用戶選擇的文件路徑,並生成報告,將其保存爲[MM-DD-YY] Balance Report.xlsx爲什麼我的Replace()方法無法正常工作?

我選擇用戶輸入格式爲MMDDYYYY,MMDDYY,MM/DD/YYYY,MM/DD/YY,MM-DD-YYYY,MM-DD-YYYY的情況檢查。

的代碼如下:

Function PostDateBoolean() As Boolean 

    PostingDate = PostDateTextBox.Value 'tested as 071616  (07-16-2016) 

    Select Case True 
     Case Is = PostingDate Like "##/##/##" Or _ 
      PostingDate Like "##-##-##" Or _ 
      PostingDate Like "##/##/20##" Or _ 
      PostingDate Like "##-##-20##" Or _ 
      PostingDate Like "######" Or _ 
      PostingDate Like "########" 

      PostDateBoolean = True 
     Select Case True 
      Case Is = PostingDate Like "##/##/##" Or _ 
       PostingDate Like "##-##-##" 
       PostingDate = Replace(PostingDate, Right(PostingDate, 2), _ 
       "20" & Right(PostingDate, 2)) 
       PostDateTextBox.Value = PostingDate 
     End Select 
     Select Case True 
      Case Is = PostingDate Like "######" 
       ' THE ERROR IS HERE VVVV 
      PostingDate = Replace(PostingDate, Right(PostingDate, 2), _ 
        "/20" & Right(PostingDate, 2)) 
       PostingDate = Replace(PostingDate, Right(PostingDate, 7), _ 
        "/" & Right(PostingDate, 7)) 
       PostDateTextBox.Value = PostingDate 
       GoTo CheckDone: 
     End Select 
     Select Case True 
      Case Is = PostingDate Like "########" 
       PostingDate = Replace(PostingDate, Right(PostingDate, 4), _ 
        "/" & Right(PostingDate, 4)) 
       PostingDate = Replace(PostingDate, Right(PostingDate, 7), _ 
        "/" & Right(PostingDate, 7)) 
       PostDateTextBox.Value = PostingDate 
       GoTo CheckDone: 
     End Select 
CheckDone: 
     Case Else 
      msg = "Please Enter a Date in the correct Date Format:" & vbCr _ 
      & "MM/DD/YYYY Or MM/DD/YY" 
     PostDateBoolean = False 
    End Select 
    PostDateFileName = PostingDate 
    PostDateFileName = Replace(PostDateFileName, Right(PostDateFileName, 5), _ 
       "-" & Right(PostDateFileName, 4)) 
    PostDateFileName = Replace(PostDateFileName, Right(PostDateFileName, 8), _ 
       "-" & Right(PostDateFileName, 7)) 

End Function 

我行

PostingDate = Replace(PostingDate, Right(PostingDate, 2), "/20" & Right(PostingDate, 2))

發佈日期的價值遠遠從07161607/2016/2016後。上述代碼行的意圖是替換071616中的最後兩位數字,並用/2016代替它。出於某種原因,它將取代4位數字而不是兩位數字。我認爲這個問題是在Replace (string1, find, replacement, [start, [count, [compare]]]) [查找爲字符串]的第二個參數中,它查找字符串中的所有值(16),並用/2016替換它。有沒有更好的方法來獲得最後兩個字符並替換它們,而不是字符串中的所有16's

+1

我建議一個完全不同的方式 - 而不是試圖驗證任何垃圾在結束了'TextBox',爲什麼不使用'TextBox'事件來強制輸入掩碼? – Comintern

+1

'它找到字符串中的所有值(16)並用/ 2016替換它 - - 是的,這正是它應該做的。 – GSerg

回答

4

當您不知道匹配的位置時,您使用Replace
如果您確切知道要替換哪些字符,則可以使用其他方法(Left,Right,Mid)。

PostingDate = Left$(PostingDate, Len(PostingDate) - 2) & "/20" & Right$(PostingDate, 2) 

但是更好的辦法是,一旦你在你的日期是哪一種格式,將其轉換爲實際Date已檢測到,然後Format$()它你喜歡的任何格式。

2

這不是對您的問題的「回答」,但它只是作爲評論包含太長時間。

除了什麼GSerg說,你選擇Case語句或許應該被改寫成這樣:

PostDateBoolean = True 

    Select Case True 
     Case PostingDate Like "##/##/##", 
      PostingDate Like "##-##-##" 

      PostingDate = Left$(PostingDate, 6) & _ 
          "20" & Right$(PostingDate, 2) 
      PostDateTextBox.Value = PostingDate 

     Case PostingDate Like "##/##/20##", 
      PostingDate Like "##-##-20##" 

     Case PostingDate Like "######" 

      PostingDate = Left$(PostingDate, 2) & "/" & _ 
          Mid$(PostingDate, 3, 2) & "/" & _ 
          "20" & Right$(PostingDate, 2) 
      PostDateTextBox.Value = PostingDate 

     Case PostingDate Like "########" 

      PostingDate = Left$(PostingDate, 2) & "/" & _ 
          Mid$(PostingDate, 3, 2) & "/" & _ 
          Right$(PostingDate, 4) 
      PostDateTextBox.Value = PostingDate 

     Case Else 
      msg = "Please Enter a Date in the correct Date Format:" & vbCr _ 
      & "MM/DD/YYYY Or MM/DD/YY" 
      PostDateBoolean = False 
    End Select 
+0

沿着「答案」或「解決方案」的方向,將其標記爲正確是否合適?主要是因爲我最初的問題是誤解使用什麼方法('Replace()'和'Left()/ Right()')以獲得最佳結果。這項工作非常出色!謝謝! – Munkeeface

+0

@Munkeeface - 我建議由GSerg提供的答案應該被標記爲解決方案。這是解釋Replace和Mid/Left/Right之間差異的答案。我的「答案」只是解釋你應該如何編寫你的Select Case陳述,這可能會解決你遇到的或將要遇到的其他一些問題。 – YowE3K

相關問題