Mesclando células no Excel 2007 porque o exportador da web é um punk

1

Eu tenho que usar um site para exportar dados no formato XLS, para ser convertido em CSV, para ser despejado em um banco de dados MySQL.

Meu problema é que esse exportador de POS trata os retornos de carro nos dados originais como novos campos, para que o arquivo do Excel seja uma bagunça:

Exemplo:

[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

Isso elimina totalmente a minha conversão em CSV em uma única etapa. O comando de mesclagem padrão não é útil porque elimina todos os dados do primeiro campo.

A única solução que encontrei é que posso inserir uma coluna adjacente, mesclar as linhas apropriadas, concatenar essas 3 linhas no bloco de pós-mesclagem na segunda coluna e depois remover o original. Isso é brutalmente, quase impossivelmente demorado.

Alguém tem uma maneira melhor de resolver o problema? O exportador web POS é controlado por outra empresa e completamente fora das minhas mãos ...

Editar para adicionar um exemplo "correto":

    [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
 _____________|__________|__________________________|___
    
por Drew 21.09.2010 / 09:49

1 resposta

1

De acordo com nossa discussão nos comentários, aqui está uma macro que eu acho que deve alcançar o que você está procurando. Obviamente, teste-o em dados copiados primeiro, caso algo de ruim aconteça.

Espero que a única coisa que você precise ajustar seja a colToMerge constante próxima ao topo, para corresponder à coluna em que seus dados para mesclar estejam.

Editar

Acabei de ver o Excel 2007 no título da sua pergunta, por isso, note que escrevi isto em 2003 .
Espero que ainda funcione porque está apenas fazendo movimentos básicos e manipulação de valor de célula. Deixe-me saber se não, e eu vou ajustá-lo para o Excel 2007, uma vez que estou em casa esta noite.

Código

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
    
por 21.09.2010 / 10:34