2016-06-17 9 views
1

Ich versuche, eine Zahlenfolge analysieren und Zeilen entsprechend erstellen. Auf der linken Seite des Beispieldatenbildes ist ein Beispiel für die Eingabedaten, wobei das Recht meine gewünschte Ausgabe ist. Ich möchte eine eindeutige Datenzeile für jede Ziffer innerhalb der Klammern für jede Zahlenkombination einfügen. HierParsing Excel-Zeichenfolge von Zahlen mit vba

Example Data

ist ein Beispiel für den Code, den ich verwenden, um zu versuchen, das Problem zu lösen.

Option Explicit 

Sub example() 


Dim num As Variant 
Dim x As Variant 
Dim i As Integer 
Dim j As Integer 
Dim k As Integer 
Dim m As Integer 
Dim test As Variant 
Dim test2 As Variant 
Dim count As Integer 

m = 0 

For i = 1 To 3 

num = Range("C" & 5 + i + m).Value 

For j = 1 To Len(num) 

    test = Mid(num, j) 

    If Left(Mid(num, j), 1) = "[" Then 

     For k = 1 To Len(num) - (j + 1) 

      m = m + 1 

      Range("C" & 5 + m + i - 1).EntireRow.Insert 

      test2 = Left(Mid(num, j + k), 1) 

      Range("C" & 5 + m + i - 1).Value = Left(num, j - 1) + test2 

     Next k 

    End If 

Next j 

Next i 

End Sub 
+0

Auch für den Zweck meines Beispiel habe ich die Datenausgabe in Spalte G beginnend Denn ich möchte, dass meine Daten tatsächlich die Ausgabe an Ort und Stelle einfügen wo die vorhandenen Eingabedaten beim Einfügen von Zeilen entsprechend waren. Dies liegt daran, dass es in meinen Eingabedaten Zahlenkombinationen gibt, die nicht manipuliert werden müssen. – Rookie

+0

In meinem Codebeispiel wird davon ausgegangen, dass sich die Daten in der C-Spalte befinden. – Rookie

Antwort

1

Bitte betrachten Sie das folgende Skript:

Sub splitcombinations() 

Dim rngCell As Range 
Set rngCell = ThisWorkbook.Sheets(1).Range("A2") 

Dim strCombinationDigits As String, strBaseDigits As String 
Dim intCombinationDigitsLen As Integer 

Dim x As Integer 

Do While rngCell.Value2 <> "" 

    If InStr(rngCell.Value2, "[") > 0 Then 

     strCombinationDigits = Mid(rngCell.Value2, InStr(rngCell.Value2, "[") + 1, InStr(rngCell.Value2, "]") - InStr(rngCell.Value2, "[") - 1) 
     intCombinationDigitsLen = Len(strCombinationDigits) 

     strBaseDigits = Left(rngCell.Value2, InStr(rngCell.Value2, "[") - 1) 

     ActiveSheet.Range(rngCell.Offset(1, 0), rngCell.Offset(intCombinationDigitsLen - 1, 0)).EntireRow.Insert 

     For x = 1 To intCombinationDigitsLen 

      rngCell.Offset(x - 1, 0).Value2 = strBaseDigits & Mid(strCombinationDigits, x, 1) 
      rngCell.Offset(x - 1, 1).Value2 = rngCell.Offset(0, 1).Value2 
      rngCell.Offset(x - 1, 2).Value2 = rngCell.Offset(0, 2).Value2 

     Next 

    End If 

    Set rngCell = rngCell.Offset(intCombinationDigitsLen , 0) 

Loop 

End Sub 
+0

Was Sie vorschlagen, wird von einer bestimmten Anzahl von Zeichen innerhalb der Klammern (7) ausgegangen. Ich berechne tatsächlich wie viele Ziffern mit 'intCombinationDigitsLen' und modifiziere wie viele Zeilen ich entsprechend einfüge. Dann ist der Grund, warum ich nur um eine Zeile jede Schleife Offset ist, weil ich dann auf jeder Iteration überprüfen, ob 'RngCell' enthält eine öffnende Klammer, vorausgesetzt, es ist eine Iteration, die das Skript hinzugefügt (und nicht leer) . Es bewegt sich dann wieder nach unten. Ich denke, ich könnte durch "intCombinationDigitsLen" kompensieren, wollte aber sicherstellen, dass ich nichts verpassen würde. – nbayly

+0

Netter Code! Ändere einfach 'Set rngCell = rngCell.Offset (1, 0)' auf 'Set rngCell = rngCell.Offset (intCombinationDigitsLen, 0)' – Brian

+0

Ich sehe. Okay, hab es! – Brian