웹 내보내기가 펑크이기 때문에 Excel 2007에서 셀 병합


1

XLS 형식으로 데이터를 내보내고 CSV로 변환하여 MySQL 데이터베이스에 덤프하려면 웹 사이트를 사용해야합니다.

내 문제는이 POS 내보내기 프로그램이 원본 데이터의 캐리지 리턴을 새 필드로 처리하여 Excel 파일이 엉망이된다는 것입니다.

예:

[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

이것은 완전히 한 단계 CSV 변환에 효과적입니다. 표준 병합 명령은 첫 번째 필드에서 모든 데이터를 분리하므로 유용하지 않습니다.

내가 찾은 유일한 해결책은 인접한 열을 삽입하고 적절한 행을 병합하고 세 줄을 두 번째 열의 병합 후 블록에 연결 한 다음 원본을 제거 할 수 있다는 것입니다. 이것은 잔인하지만 거의 불가능합니다.

누구든지 문제를 해결하는 더 좋은 방법이 있습니까? POS 웹 수출 업체는 다른 회사에 의해 통제되며 완전히 제 손에서 벗어납니다.

"올바른"예를 추가하려면 편집하십시오.

    [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
 _____________|__________|__________________________|___

당신이 제시 한 예는 데이터의 "잘못된"레이아웃입니까? 의도 한 "올바른"레이아웃은 정확히 무엇입니까?
DMA57361

고용 이력에 대한 3 개의 값은 모두 행 1의 동일한 열 내에 있어야하므로 한 사람이 실제 데이터베이스에서와 같이 한 행을 차지할 수 있습니다.
Drew

첫 번째 열이 모든 복제본에 대해 비어 있으면 간단한 VBA 매크로가 아마도 당신을 위해 이것을하는 가장 좋은 방법이라고 생각합니다. 함께 무언가를 던져서 답에 붙일 것입니다.
DMA57361

DMA57261에서 A 열이 항상 적절한 크기로 병합되면 데이터 세트를 따라 열이 산발적으로 나옵니다.
Drew

초기 예제에서 "A1"이 실제로 "A1 : A3"을 초과합니까?
DMA57361

답변:


1

의견에 대한 우리의 논의에 따라, 여기에 당신이 추구하는 것을 달성해야한다고 생각되는 매크로가 있습니다. 문제가 발생했을 경우 먼저 복사 된 데이터에서 테스트하십시오.

바라건대 조정해야 할 유일한 것은 colToMerge상단 근처의 상수 이며 병합 할 데이터가있는 열과 일치하도록하십시오.

편집하다

방금 질문 제목에서 Excel 2007 을 발견 했으므로 2003 년에 이것을 작성했습니다 .
잘하면 한다 그것은 단지 아주 기본적인 움직임과 셀 값 조작을하고 있기 때문에 여전히 작동합니다. 그렇지 않은 경우 알려 주시면 오늘 저녁 집에 돌아 오면 Excel 2007에 맞게 조정하겠습니다.


암호

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.