代码

代码

我必须使用网站以 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

根据我们在评论中的讨论,我认为这里有一个宏可以实现您的目标。当然,请先在复制的数据上测试它,以防发生意外。

希望您唯一需要调整的是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

相关内容