2017-09-05 1 views
0

Was ich brauche, ist benutzerdefinierte Format Werte nach diesen Regeln zu ändern:Excel Benutzerdefinierte Format prüfen Charakter

  1. Wenn „/“ fehlt und die Länge der Zahl kleiner als 6, fügen Nullen der Anfang.
  2. Wenn "/" vorhanden ist und die Länge der Zahl vor "/" kleiner als 6 ist, fügen Sie am Anfang Nullen hinzu.
  3. Wenn "/" vorhanden ist und die Länge der Zahl nach "/" 1 ist, fügen Sie vor dem letzten Zeichen Null hinzu.
  4. Wenn "/" vorhanden ist und die Länge der Zahl nach "/" 2 ist, lassen Sie es ist.
  5. Gesamtlänge der Zeichenfolge mit "/" 8, ohne sie wäre - 6

Unformatted Daten:

-534 
1083 
386840/2 
12345/10 

Wunschergebnis:

000534 
001083 
38684002 

Was ich bisher herausgefunden habe:
000000; 000000; 0 ist ziemlich offensichtlich Teil, Wert ohne "/" wird trotzdem als Zahl gelesen. Wenn es eine Nummer wäre, würde ich [>1000]0 oder etwas ähnliches verwenden, aber es funktioniert nicht mit , soweit ich verstanden habe.
Formel I bin (nur jetzt) ​​statt wünschenswert benutzerdefinierten Format verwenden:

=IF(ISERROR(FIND("/";A1)); 
    CONCATENATE(REPT("0";6-LEN(A1));A1); 
    IF((LEN(A1)-FIND("/";A1))=1; 
     SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";"0"); 
     SUBSTITUTE(CONCATENATE(REPT("0";7-FIND("/";A1));A1);"/";""))) 

Kann mir jemand einen Tipp geben?

+0

Sie können nicht das Zahlenformat stellen Sie Ihre Nummer zu überprüfen. Daher müssen Sie 40/2 in 4002 und 5/10 in 510 konvertieren, bevor Sie es an NumberFormat senden. Sie sollten das mit einer Hilfssäule tun können (die Sie vielleicht versteckt halten), aber wenn das nicht möglich ist, wäre Ihr einziger Rückgriff VBA. – Variatus

+0

@Variatus Kann nicht, das war der Grund für das Zahlenformat an erster Stelle, sonst würde ich Formeln verwenden. – AntiDrondert

+0

Sie müssen mehr erzählen.Darf man die Daten in der Spalte ändern, wo sie sind? Vergiss es einfach mit NumberFormat. Muss eine andere Lösung finden. – Variatus

Antwort

1

Hier ist eine Möglichkeit zu erreichen, was Sie wollen mit NumberFormat. Das entsprechende Zahlenformat wird vom VBA-Ereigniscode generiert.

Es gibt einen großen Nachteil darin, dass Sie für jeden eindeutigen Eintrag, der eine "/" enthält, ein anderes Zahlenformat benötigen, und die Anzahl der zulässigen Zahlenformate kann einschränkend sein.

Es erfordert jedoch keine Hilfssäulen und ändert die in der Zelle gespeicherten Originaldaten nicht.

Alle in Spalte A eingegebenen Daten werden entsprechend den Regeln formatiert. Wenn ein Schrägstrich vorhanden ist, ändert der Code die numerischen Abschnitte; testet aber nicht, dass beides numerisch ist. Also abc/1 ->abc01, aber Sie können das ändern, wenn Sie möchten.

Dies ist Code-Arbeitsblatt:

Option Explicit 
Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim FormatRange As Range, C As Range 
    Const Fmt As String = "000000;000000;000000;@" 
    Dim V As Variant 

Set FormatRange = Range("A:A") 
If Not Intersect(Target, FormatRange) Is Nothing Then 
    For Each C In Intersect(Target, FormatRange) 
     If InStr(C.Text, "/") = 0 Then 
      C.NumberFormat = Fmt 
     Else 
      V = Split(C.Text, "/") 
      V(0) = Format(V(0), "000000") 
      V(1) = Format(V(1), "00") 
      C.NumberFormat = ";;;" & Chr(34) & Join(V, "") & Chr(34) 
     End If 
    Next C 
End If 

End Sub 
+0

Traurig kann es nicht ohne Makro gemacht werden, obwohl es wie etwas aussieht, das ich brauche. Ich habe vergessen, dass ich die Saite in zwei Teilen trennen und ihnen beitreten kann, vielen Dank, ich werde mir das morgen genauer ansehen. – AntiDrondert

+0

Keine Notwendigkeit zu überprüfen, ob Teile der Zeichenfolge numerisch sind, diese sind jedes Mal 100% numerisch, vergessen zu erwähnen. – AntiDrondert

+0

@AntiDrondert Das macht den Code einfacher. Der Hauptvorbehalt bei dieser Methode besteht darin, dass eine Arbeitsmappe auf 64.000 eindeutige Zellformate/Zellstile beschränkt ist. Das Ersetzen des Werts durch das "Format" wäre robuster, würde aber verhindern, dass die ursprünglichen Daten ohne eine Helperspalte beibehalten werden. –