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. Стандартная команда слияния не полезна, потому что она отбрасывает все данные, кроме первого поля.

Единственное решение, которое я нашел, состоит в том, что я могу вставить соседний столбец, объединить соответствующие строки, объединить эти 3 строки в блок после объединения во втором столбце, а затем удалить оригинал. Это жестоко, почти невозможно, но требует много времени.

У кого-нибудь есть лучший способ решить проблему? Веб-экспортер 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
 _____________|__________|__________________________|___

1 ответ1

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .