2016-08-01 247 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

相关问题