Hợp nhất các ô trong Excel 2007 vì trình xuất web là một bản nhạc punk


1

Tôi phải sử dụng một trang web để xuất dữ liệu ở định dạng XLS, để được chuyển đổi sang CSV, để được chuyển vào cơ sở dữ liệu MySQL.

Vấn đề của tôi là nhà xuất khẩu POS này coi lợi nhuận vận chuyển trong dữ liệu gốc là các trường mới, do đó tệp Excel là một mớ hỗn độn:

Thí dụ:

[Name]          [Age]     [Employment History]     // Excel File:
 Smith, John     30        2005-2006 Bennigan's    // row 1
                           2006-2007 Shenanigan's  // row 2
                           2007-2008 Grizzlebee's  // row 3
 Smith, Karen . . .                                // row 4

Điều này hoàn toàn thực hiện chuyển đổi CSV một bước của tôi. Lệnh hợp nhất tiêu chuẩn không hữu ích vì nó loại bỏ tất cả dữ liệu ngoài trường đầu tiên.

Giải pháp duy nhất tôi tìm thấy là tôi có thể chèn một cột liền kề, hợp nhất các hàng thích hợp, nối 3 dòng đó vào khối sau hợp nhất trong cột thứ hai, sau đó xóa bản gốc. Điều này là tàn bạo, gần như không thể tốn thời gian mặc dù.

Có ai có một cách tốt hơn để giải quyết vấn đề? Nhà xuất khẩu web POS được kiểm soát bởi một công ty khác và hoàn toàn nằm ngoài tầm tay của tôi ...

Chỉnh sửa để thêm một ví dụ "chính xác":

    [Name]    |  [Age]   |  [Employment History]    | // Excel File:
______________|__________|__________________________|__
 Smith, John  |   30     |   2005-2006 Bennigan's   | // row 1
              |          |   2006-2007 Shenanigan's | 
              |          |   2007-2008 Grizzlebee's | 
______________|__________|__________________________|___
 Smith, Karen |   25     |   2001-2010 Ma Bell      | // row 2
 _____________|__________|__________________________|___

Ví dụ bạn đã đưa ra là bố cục "sai" cho dữ liệu? Chính xác thì bố cục "chính xác" mà bạn đang hướng tới là gì?
DMA57361

tất cả 3 giá trị cho Lịch sử việc làm phải nằm trong cùng một cột của hàng 1, để một người chiếm một hàng, giống như trong một cơ sở dữ liệu thực tế
vẽ

Nếu cột đầu tiên trống đối với tất cả các mục trùng lặp, tôi nghĩ rằng một macro VBA đơn giản có thể sẽ là cách tốt nhất để làm điều này cho bạn - tôi sẽ ném một cái gì đó lại với nhau và đưa ra câu trả lời.
DMA57361

nếu nó giúp bạn, DMA57261, cột A luôn được hợp nhất với kích thước phù hợp, thì các cột sẽ nằm dọc theo bộ dữ liệu bị phá vỡ lẻ tẻ.
vẽ

Vì vậy, "A1" thực sự hơn "A1: A3" trong ví dụ ban đầu?
DMA57361

Câu trả lời:


1

Theo như thảo luận của chúng tôi trong các bình luận, đây là một macro mà tôi nghĩ sẽ đạt được những gì bạn đang theo đuổi. Rõ ràng kiểm tra nó trên dữ liệu sao chép trước trong trường hợp có điều gì đó xấu xảy ra.

Hy vọng rằng điều duy nhất bạn sẽ cần điều chỉnh là colToMergehằng số ở gần đầu, để khớp với cột nào mà dữ liệu của bạn hợp nhất sẽ xảy ra.

Biên tập

Tôi vừa phát hiện Excel 2007 trong tiêu đề câu hỏi của bạn, vì vậy xin lưu ý rằng tôi đã viết bài này vào năm 2003 .
Hy vọng rằng nó sẽ vẫn làm việc vì nó chỉ làm rất cơ bản di chuyển và giá trị của ô thao tác. Hãy cho tôi biết nếu không, và tôi sẽ điều chỉnh nó cho Excel 2007 khi tôi về nhà tối nay.


Sub MergeEmploymentCol()

    'PARAMETER: The column number you are merging. A=0,B=1,etc
    Const colToMerge = 2

    'First unmerge everything
    Cells.UnMerge

    'Select First "valid" row, done manually incase top rows are packed together
    Range("A1").Select
    Do While ActiveCell.Value <> 0
        ActiveCell.Offset(1, 0).Select
    Loop
    ActiveCell.Offset(-1, 0).Select

    'Some variables        
    Dim thisRow As Integer, nextRow As Integer, i As Integer

    Do While ActiveCell.Value <> 0
        'Only need to merge if next row is blank
        If (ActiveCell.Offset(1, 0).Value = 0) Then

            'Get the row numbers for this valid row and the next valid row
            thisRow = ActiveCell.Row

            Selection.End(xlDown).Select
            If (ActiveCell.Value <> 0) Then
                nextRow = ActiveCell.Row
            Else
                'must be last row - no valid rows below this one
                'special handling to find correct row
                ActiveCell.Offset(0, colToMerge).Select
                Selection.End(xlUp).Select
                nextRow = ActiveCell.Row + 1
                ActiveCell.Offset(0, -colToMerge).Select

                'Exit if this last valid row has no duplicates
                If (thisRow + 1 = nextRow) Then
                    Exit For
                End If
            End If
            Selection.End(xlUp).Select

            'Merge the data between here and the next valid row
            Dim combinedData As String
            combinedData = ""
            For i = 0 To (nextRow - thisRow) - 1
                combinedData = combinedData & ActiveCell.Offset(i, colToMerge).Value & Chr(10)
            Next i

            'Trim last (unnecessary) line-return
            combinedData = Mid(combinedData, 1, Len(combinedData) - 1)

            'Place data in cell
            ActiveCell.Offset(0, colToMerge).Value = combinedData

            'Delete unneeded rows
            ActiveCell.Offset(1, 0).Rows("1:" & nextRow - thisRow - 1).EntireRow.Select
            ActiveCell.Offset(0, 0).Range("A1").Activate
            Selection.Delete Shift:=xlUp

            'Select first cell of next valid row
            ActiveCell.Offset(0, 0).Select
        Else
            'Next row not blank, so no need to merge
            'Simple step down to next row
            ActiveCell.Offset(1, 0).Select
        End If

    Loop

End Sub
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.