2009-01-23 9 views
5

I haben die folgenden Daten in Excel:Excel Macro - Comma Separated Zellen in Zeilen

a, b, c 
d 
e 
f, g 
h 
i 

mit jeder Reihe einer Reihe und in einer Zelle darstellt.

Ich mag es konvertieren:

a 
b 
c 
d 
e 
f 
g 
h 
i 

ich das folgende Makro verwenden, aber ich kann die Autosize zu tun, einen Einsatz nicht bekommen, anstatt die Zellenwert zu überschreiben. Jede Hilfe wird geschätzt.

Sub SplitCells() 


    Dim i As Long 



    With Application 

     .Calculation = xlCalculationManual 

     .ScreenUpdating = False 




    For i = 1 To Selection.Rows.Count 

     Dim splitValues As Variant 


     splitValues = split(Selection.Rows(i).Value, ",") 

     Selection.Rows(i).Resize(UBound(splitValues) - LBound(splitValues) + 1).Value = Application.Transpose(splitValues) 

    Next i 



     .Calculation = xlCalculationAutomatic 

     .ScreenUpdating = True 

    End With 

End Sub 

Antwort

6

Dieses Makro wird Ihre Daten aus der Spalte A und „extrahieren“, um es Spalte B nehmen Die Ergebnisse unten, fühlen Sie sich frei :-)

an meinem grafischen Präsentationsfähigkeiten kauern
<- A -> <- B -> 
1 a, b, c a 
2 d   b 
3 e   c 
4 f, g  d 
5 h   e 
6 i   f 
7    g 
8    h 
9    i 

Ich habe es für Testzwecke als nicht destruktiv belassen, und da es relativ einfach ist, eine neue Spalte zu erstellen, befüllen Sie sie und löschen Sie die alte Spalte in VBA. Eine Übung für den Leser ... ist

Hier wird das Makro:

Option Explicit 
Sub Macro1() 
    Dim fromCol As String 
    Dim toCol As String 
    Dim fromRow As String 
    Dim toRow As String 
    Dim inVal As String 
    Dim outVal As String 
    Dim commaPos As Integer 

    ' Copy from column A to column B.' 
    fromCol = "A" 
    toCol = "B" 
    fromRow = "1" 
    toRow = "1" 

    ' Go until no more entries in column A.' 
    inVal = Range(fromCol + fromRow).Value 
    While inVal <> "" 

     ' Go until all sub-entries used up.' 
     While inVal <> "" 
      Range(fromCol + fromRow).Select 

      ' Extract each subentry.' 
      commaPos = InStr(1, inVal, ",") 
      While commaPos <> 0 

       ' and write to output column.' 
       outVal = Left(inVal, commaPos - 1) 
       Range(toCol + toRow).Select 
       Range(toCol + toRow).Value = outVal 
       toRow = Mid(Str(Val(toRow) + 1), 2) 

       ' Remove that sub-entry.' 
       inVal = Mid(inVal, commaPos + 1) 
       While Left(inVal, 1) = " " 
        inVal = Mid(inVal, 2) 
       Wend 
       commaPos = InStr(1, inVal, ",") 
      Wend 

      ' Get last sub-entry (or full entry if no commas).' 
      Range(toCol + toRow).Select 
      Range(toCol + toRow).Value = inVal 
      toRow = Mid(Str(Val(toRow) + 1), 2) 
      inVal = "" 
     Wend 

     ' Advance to next source row.' 
     fromRow = Mid(Str(Val(fromRow) + 1), 2) 
     Range(fromCol + fromRow).Select 
     inVal = Range(fromCol + fromRow).Value 
    Wend 
End Sub 
+0

funktioniert gut, danke –

1

Dies ist nicht getestet, aber es ist ein algorithmisches Muster, das ich oft verwendet habe. Es ist eine Weile her, also traue der Syntax nicht genau.

sub SplitCells() 
    Dim c as Range  ' iterator for cells in Selection 
    dim r as Range  ' to hold the range which is the first cell in Selection 
    Dim r2 as Range  ' variable range for single cell which is the target for inserting the result 
    Dim a() a Variant ' array of variants to hold each cell's value after it's split 
    Dim b() as Variant ' array of variants to hold the accumulation of values to spread into the destination 
    Dim v ar Variant ' variant to iterate through b for insertion 
    Dim i as Integer ' cumulative offset from top of destination range while inserting 

    For each c in Selection.Cells 
     a = Split(Replace(c.Text, ",", "")) ' will split on whitespace 
     for each v in a 
      b.Add v 
     next v 
    next c 

    ' now you have a new array with the full set of values 

    ' insert them a row at a time using Range.Offset 
    i = 0 
    Set r = Selection.Cells(0) 
    For Each v in b 
     Set r2 = r.Offset(1, 0) 
     r2.Value = v 
     i = i + 1 
    next v 
End Sub 
+0

Sie tun Sie wissen, dass Sie bei "Dim a() a Variant" einen Syntaxfehler bekommen, oder? Ich weiß nicht, was daran falsch ist, ich habe nie Varianten oder Arrays in VBA verwendet (meine Arrays sind normalerweise in Excel-Zellen gespeichert :-). – paxdiablo

0

ich in Excel VBA bin nicht sehr gut, aber das war (irgendwie !!)

Sub arrange() 

' get the current range from the sheet 
    curr_range = ActiveSheet.Range("A1:A6") 

' for each cell in that range ... 
    For Each Row In curr_range 

' ...put the contents into an array 
     arr = Split(Row, ",") 

' for each cell in that array ... 
     For Each cell In arr 

' ...output it into a string 
      output_str = output_str & "," & cell 
     Next cell 

    Next Row 

' remove spaces 
    output_str = Replace(output_str, " ", "") 
' remove left , 
    output_str = Right(output_str, Len(output_str) - 1) 

' make it into an array 
    output_arr = Split(output_str, ",") 

' populate the sheet back 
    ActiveSheet.Range("A:A").Value = Application.WorksheetFunction.Transpose(output_arr) 

End Sub 
+0

Ich hasse, was SO mit VBA-Kommentare tut - Ich fand, Sie müssen ein "'" am Ende der Zeile setzen, um sicherzustellen, dass die Färbung richtig funktioniert. – paxdiablo

+0

Ich bekomme eine ganze Menge von # N/A Zellen unter den richtigen Zellen, wenn ich dies ausführen. – paxdiablo

+0

Kleine Kritiken (nicht wert, downvoting): 1/Sie löschen alle Leerzeichen innerhalb eines Feldes (zB "bob, jill smith, george" wird "bob", "jillsmith", "george"). 2/Ihr "remove left" ist besser als "output_str = mid (output_str, 2)". Anders als das und die NAs, scheint es in Ordnung zu sein. – paxdiablo