2016-08-01 16 views
0

Ich habe eine UserForm, die eine Reihe von CheckBoxes, TextBoxes und Buttons enthält. Ein TextBox fragt den Benutzer nach einem bestimmten Datum, und sobald der OKButton angeklickt ist, dauert es und überprüft die Formatierung des Datums des Benutzers. Ich habe eine Select/Case verwendet, um die verschiedenen Formate zu überprüfen, die der Benutzer eingibt und konvertiert sie in ein spezifisches Format für Dateiname (dieses Makro nimmt die vom Benutzer ausgewählten Dateipfade und erzeugt einen Bericht, speichert es alsWarum funktioniert meine Replace() -Methode nicht richtig?

My Wählen Sie Groß-/Kleinschreibung, wenn die Eingabe des Benutzers als MMDDJJJJ, MMTTTNT, MM/TT/JJJJ, MM/TT/JJ, MM-TT-JJJJ, MM-TT-JJJJ formatiert ist.

Der Code ist wie folgt:

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 

Nach meiner Linie

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

Die Valuta der Buchung geht 071616-07/2016/2016. Meine Absicht mit der obigen Codezeile besteht darin, die letzten beiden Ziffern in 071616 zu ersetzen und durch /2016 zu ersetzen. Aus irgendeinem Grund ersetzt es die 4 Ziffern und nicht nur die zwei Ziffern. Ich nehme an, dass das Problem darin besteht, dass im zweiten Parameter für Replace (string1, find, replacement, [start, [count, [compare]]]) [Find as String] alle Werte (16) in der Zeichenfolge gefunden und durch /2016 ersetzt werden. Gibt es eine bessere Möglichkeit, JUST die letzten zwei Zeichen zu erhalten und sie zu ersetzen, anstatt alle 16's in der Zeichenfolge?

+1

ich einen völlig anderen Ansatz vorschlagen würde - anstatt zu versuchen, was auch immer Müll landet in dem zu validieren 'TextBox', warum verwenden Sie nicht einfach die 'TextBox'-Ereignisse, um eine Eingabemaske zu erzwingen? – Comintern

+1

'es findet alle Werte (16) in der Zeichenkette und ersetzt sie durch/2016' - ja, das ist genau das, was es tun soll. – GSerg

Antwort

4

Sie verwenden Replace, wenn Sie nicht wissen, wo die Übereinstimmung ist.
Sie verwenden etwas anderes (Left, Right, Mid), wenn Sie genau wissen, welche Zeichen Sie ersetzen.

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

jedoch ein besserer Ansatz wäre, sobald Sie, in welchem ​​Format Sie das Datum ist gefunden zu haben, wandeln es in einem tatsächlichen Date und dann Format$() es, was auch immer Format, das Sie mögen.

2

Dies ist keine "Antwort" auf Ihre Frage, aber es war einfach zu lange, um sie als Kommentar hinzuzufügen.

Zusätzlich zu dem, was GSerg sagte, Ihre Select Case-Anweisung wahrscheinlich so etwas wie neu geschrieben werden soll:

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

Entspricht die Formulierung "Antwort" oder "Lösung" der Kennzeichnung als korrekt? Meistens ist mein ursprüngliches Problem ein Missverständnis dessen, welche Methode zu verwenden ist ('Replace()' vs 'Left()/Right()') für das beste Ergebnis. Das funktioniert phänomenal! Vielen Dank! – Munkeeface

+0

@Munkeeface - Ich würde vorschlagen, dass die Antwort von GSerg als die Lösung markiert werden sollte. Das war die Antwort, die den Unterschied zwischen Replace und Mid/Left/Right erklärte. Meine "Antwort" fuhr nur fort, zu erklären, wie Sie wirklich Ihre Select Case-Anweisungen schreiben sollten, die möglicherweise ein paar andere Probleme behoben haben, die Sie hatten oder haben werden. – YowE3K

Verwandte Themen