2009-01-23 80 views
5

我有具有在Excel以下數據:Excel宏 - 逗號分隔細胞對行

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

,每行代表一個行和在一個小區中。

我想將其轉換爲:

a 
b 
c 
d 
e 
f 
g 
h 
i 

我使用下面的宏,但我不能讓自動調整大小做插入,而不是覆蓋單元格值。任何幫助表示讚賞。

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 

回答

6

這個宏將A列把你的數據和「提取」它列B的結果如下所示,隨時在我的圖形演示技巧退縮:-)

<- 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 

我已經把它作爲非破壞性的用於測試目的,並且由於創建新列相對容易,請填充它並刪除VBA中的舊列。對於讀者的練習......

下面是宏:

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

很好用,謝謝 – 2009-01-23 15:22:24

1

這是未經測試的,但它是我多次使用的算法模式。這已經有一段時間了,所以不要完全相信語法。

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

你做知道你在「Dim a()a Variant」上得到語法錯誤,不是嗎?我不知道它有什麼問題,我從來沒有在VBA中使用變體或數組(我的數組通常存儲在Excel單元格中:-)。 – paxdiablo 2009-01-23 13:00:38

0

我不是在Excel VBA中的非常好,但是這個工作(不知!!)

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

我討厭用VBA做的評論 - 我發現你需要在行末加上一個「'」來確保着色正常。 – paxdiablo 2009-01-23 03:36:08