Excel宏 - 如何将包装文本拆分为合并列的行?

时间:2017-07-26 13:59:48

标签: excel vba excel-vba merge split

我必须将数据从PDF导入SAS,一步是将PDF数据转换为Excel电子表格,然后再转换为文本以便进行简单的SAS导入。通常,PDF数据可以很好地转换为excel,几乎没有错误。当我尝试导入较旧的数据时,它变得非常混乱,并且一些行被包装在单个单元格中。我想弄清楚是否有可能的宏可以帮助我在没有太多手动操作的工作表中修复此错误。我以前从未在VBA中编程,所以我对excel宏很新。

以下是凌乱数据的示例:

以下是普通数据的示例:

(*注意两个图像中的数据值不同,仅用于格式化)

我尝试过处理宏。为此,我将杂乱的数据复制到另一张纸上,并运行宏,在单独的工作表上输出更正的数据,然后我将更正的数据复制到原始电子表格中的杂乱数据上。 在尝试编写宏之后,我无法弄清楚如何告诉excel将C,D,E,F列中的数据合并到一个单元格中并打破包装文本,依此类推其他合并列(如凌乱的数据图像所示)。 这是我在看完一些教程后得到的当前代码:

Sub Split_Text_to_Rows()
Dim splitVals1 As Variant
Dim splitVals2 As Variant

Dim totalVals As Long

Set sh1 = ThisWorkbook.Sheets(2)
Set sh2 = ThisWorkbook.Sheets(3)

sh2.Cells.Clear
lrow1 = sh1.Range("A65356").End(xlUp).Row

For j = 1 To lrow1

splitVals1 = Split(sh1.Cells(j, 1), Chr(10))
splitVals2 = Split(sh1.Cells(j, 2), Chr(10))

    For i = LBound(splitVals1) To UBound(splitVals1)
        lrow2 = sh2.Range("A65356").End(xlUp).Row
        sh2.Cells(lrow2 + 1, 1) = splitVals1(i)
    Next i

    For k = LBound(splitVals2) To UBound(splitVals2)
        lrow3 = sh2.Range("B65356").End(xlUp).Row
         sh2.Cells(lrow3 + 1, 2) = splitVals2(k)
    Next k

Next j

End Sub

正如您所看到的,我的代码也非常混乱。虽然,我得到的代码适用于A列和B列,当我到达C列 - “机动车盗窃”等等时,我不知道如何分离该包装文本,因为它们在C,D列中合并, E,F。我还想将列I到Q保持为两个合并的行,即使宏将1行分成2行(在普通数据图像中显示),然后继续将单元格分割到列Z. 任何提示都会有所帮助!如果需要更多信息或说明,请与我们联系。

1 个答案:

答案 0 :(得分:0)

我经常发现最好的方法是首先将数据粘贴到Word中,在那里进行一些清理,将其格式化为Word表格,然后将其传输到Excel中。原因是Word具有非常强大的查找/替换功能,允许您快速将混乱转换为合理的东西。由于您没有提供我可以粘贴的示例数据,因此我在网上随机找到一个pdf来显示一种方法。在这种情况下,关键是注意每列以空格开头,后跟数字。所以我搜索了“^#”(后跟“任意数字”的空格)并将其替换为“^ t”(制表符)。接下来,我使用了Word的“转换为表格”功能,之后数据表就可以粘贴到Excel中了。

enter image description here