通过自定义分隔符将数据转换为1列

时间:2017-06-30 16:58:35

标签: excel excel-vba vba

我已将PDF转换为Excel;所有数据都在一列中,如下所示:

Item1
Header1
String1
String2
Header2
String1
String2
Item 2
Header1
String1
String2
Header2
String1
String2

标题在整个项目中都是一致的。是否有一种通过自定义分隔符(Header1,Header2)转换此数据的简单方法?

我的目标是将这些数据转换为:

      | Header1         | Header2         |
Item1 | String1&String2 | String1&String2 |
Item2 | String1&String2 | String1&String2 |

我假设最直接的方法是编写一个自定义排序宏,可以按标题排序为分隔符

任何人都可以给我一个快速启动吗?

2 个答案:

答案 0 :(得分:1)

手动将标题放在 Sheet2 ,单元格 B1 C1 中,然后返回 Sheet1 并运行:

Sub cropier()
    Dim N As Long, i As Long, j As Long, K As Long
    Dim s1 As Worksheet, s2 As Worksheet
    Set s1 = Sheets("Sheet1")
    Set s2 = Sheets("Sheet2")
    N = Cells(Rows.Count, "A").End(xlUp).Row
    K = 2
    s = ""
    For i = 1 To N
        v = s1.Cells(i, "A").Value
        j = i Mod 7
        Cells(i, "B") = j
        Select Case j
            Case 1
                s2.Cells(K, 1) = v
            Case 3
                t = v
            Case 4
                t = t & v
                s2.Cells(K, 2) = t
                s2.Cells(K, 3) = t
                t = ""
                K = K + 1
        End Select
    Next i
End Sub

enter image description here

答案 1 :(得分:1)

另一种不使用VBA的方法,它比你的例子中显示的2行,2列和2个连接字符串输出更通用,它选择列标题以及输入数据中的行标题... < / p>

我将假设您的数据具有以下结构:

  • 所需输出表的“body”有I行和J列
  • 输出表的每个“单元”由K“数据串”
  • 的连接形成

您的输入数据列表将包含I项标签,IJ标题标签(因为每个项目有J个标题标签)和IJK数据字符串,所以I + IJ + IJK = I(1 + J(1 + K))总值。为方便起见,输入数据列的行按顺序编号,从1开始。

该方法基于挑选第i项标签,第j个标题标签和包括第(i,j)个单元的数据串的输入数据列表内的位置。请注意i和j与I和J不同。

我会首先处理标题标签,因为这可能是最容易理解的。

  1. 假设项目中的第一个标题标签位于p in位置 输入数据列表。下一个标题标签将出现在1 + K. 位于列表的下方,即位置p + 1 + K.如果J> 2(即 输入数据中有两个以上的标题标题)然后是第三个标题 标签将出现在p + 2(1 + K)。通常,标题标签会 发生于 p+n(1+K) for n=0,1,...,J-1 我很快就会回到p的值。
  2. 现在考虑项目标签。就像标题内的标题一样 项目每1 + K个位置发生一次,项目标签每次都出现 1 + J + JK = 1 + J(1 + K))位置。自数据中的第一个位置 list是一个项目标签,项目标签的位置可以是 一般写成 1 + n(1+J(1+K)) n=0,1,...,I-1
  3. 在1.中返回p的值,即第一个头标签 item出现在项标签后面的位置。物品标签是 在2.中列出,可以方便地重写为1 + (i-1)(1+J(1+K)) i=1,2,...,I。在此表达式中添加1和 用它代替p in 1.得到一个表达式的位置 输入列表中的IJ标题标签为2+(i-1)(1+J(1+K))+n(1+K) i=1,2,...,I n=0,...,J-1。此表达式可以稍微重写为2+(i-1)(1+J(1+K)) + (j-1)(1+K) i=1,2,...,I; j=1,2...,J
  4. 3中的最终表达提供了很多所需要的内容 数据字符串的位置。这些发生在K位置之后 标题标签。因此,通过添加1获得第一个数据字符串 对于这个表达式,第二个是通过添加2,...和最后一个 加K。
  5. 现在提供构造输出表的所有位置信息。

    行标签(项目)由2中表达式的重写版本给出,即1 + (i-1)(1+J(1+K)) i=1,2,...,I。这些标签位置是i的函数。

    列标签(标题)由3中的最终表达式给出。由于这些标签是针对每个项目重复的,因此可以选择i的任何值。将i作为1将公式简化为2+(j-1)(1+K) j=1,2...,J。这些标签位置是j的函数。

    输出表的第(i,j)个单元格是从位置3+(i-1)(1+J(1+K)) + (j-1)(1+K)开始到结束位置(2+K)+(i-1)(1+J(1+K)) + (j-1)(1+K)的字符串的连接(其中i介于1和I之间,j介于...之间1和J)。数据串的位置是i和j的函数。

    此位置信息现在允许构造一个输出表,其主体中包含I行和J列,并包括行和列标题标签。该表可以通过I * 1列的常规方式构造,该列包含1,...,I和包含1,...,J的1 * J行。 (通常,此列和此行分别位于输出的左侧和上方,但可以放在工作簿中的任何位置。)

    更新基于3个项目的工作示例,每个输出单元格有4个标题和5个字符串here