2009-01-23 33 views
5

tôi đã có các dữ liệu sau trong excel:Excel Macro - Comma Separated tế bào để Rows

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

với mỗi hàng, đại diện cho một hàng và trong một tế bào.

Tôi muốn chuyển nó sang:

a 
b 
c 
d 
e 
f 
g 
h 
i 

Tôi đang sử dụng macro sau, nhưng tôi không thể nhận được AutoSize làm một chèn, thay vì trọng các giá trị di động. Bất kỳ trợ giúp được đánh giá cao.

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 

Trả lời

6

Macro này sẽ lấy dữ liệu của bạn từ cột A và "giải nén" nó vào cột B. Các kết quả được hiển thị dưới đây, cảm thấy tự do để thu mình lại ở kỹ năng thuyết trình đồ họa của tôi :-)

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

Tôi đã để nó như là không phá hoại cho các mục đích thử nghiệm, và vì nó tương đối dễ dàng để tạo ra một cột mới, cư trú nó và xóa cột cũ trong VBA. Một bài tập cho người đọc ...

Dưới đây là macro:

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

hoạt động tuyệt vời, cảm ơn bạn –

1

Điều này chưa được kiểm tra, nhưng đó là một mẫu thuật toán mà tôi đã sử dụng nhiều lần. Mặc dù đã lâu rồi, do đó, đừng tin tưởng cú pháp chính xác.

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

Bạn làm biết bạn gặp lỗi cú pháp trên "Dim a() a Variant", phải không? Tôi không biết có gì sai với nó, tôi chưa bao giờ sử dụng các biến thể hoặc mảng trong VBA (mảng của tôi thường được lưu trữ trong các ô Excel :-). – paxdiablo

0

Tôi không giỏi Excel VBA, nhưng điều này đã làm việc (bằng cách nào đó !!)

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

Tôi ghét những gì SO với VBA ý kiến ​​- Tôi thấy bạn cần phải đặt một "" "ở cuối dòng để đảm bảo màu hoạt động đúng. – paxdiablo

+0

Tôi nhận được rất nhiều ô # N/A dưới các ô chính xác khi tôi chạy. – paxdiablo

+0

Phê bình nhỏ (không đáng giá xuống): 1/Bạn xóa bất kỳ dấu cách nào trong một trường (ví dụ: "bob, jill smith, george" trở thành "bob", "jillsmith", "george"). 2/Của bạn "loại bỏ trái" là tốt hơn là "output_str = mid (output_str, 2)". Khác hơn thế và của NA, có vẻ ổn. – paxdiablo

Các vấn đề liên quan