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

我已经将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 | 

我假设最直接的方法是编写一个自定义的sortingmacros,可以通过标题作为分隔符进行sorting

任何人都可以给我一个开始?

手动将标题放在Sheet2中 ,单元格B1C1然后返回到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 

在这里输入图像说明

另一种不使用VBA的方法,比你的例子中显示的2行,2列和2个连接的string输出更普遍,它可以从input数据中select列标题和行标题。

我将假设你的数据具有如下结构:

  • 所需输出表的“主体”有I行和J列
  • 输出表的每个“单元”由K个“数据串”

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

该方法基于挑选第i个项目标签,第j个标题标签和构成第(i,j)个单元的数据串的input数据列表内的位置。 请注意我和j不同于我和J.

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

  1. 假设项目中的第一个标题标签位于input数据列表中的位置p处。 下一个标题标签将出现在列表下方的1 + K位置,即在位置p + 1 + K处。 如果J> 2(即input数据中多于两个标题标签),则第三个标题标签将出现在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))位置出现。 由于数据列表中的第一个位置是项目标签,因此项目标签的位置一般可以写为
    1 + n(1+J(1+K)) n=0,1,...,I-1
  3. 返回1中的p的值,项目中的第一个标题标签出现在项目标签之后的位置。 项目标签在2中列出,其中方便重写为1 + (i-1)(1+J(1+K)) i=1,2,...,I 。 将该expression式加1并将其代入p中得到input列表中的IJ标题标签的位置的expression式为2 2+(i-1)(1+J(1+K))+n(1+K) i=1,2,...,I n=0,...,J-12+(i-1)(1+J(1+K)) + (j-1)(1+K) i=1,2,...,I; j=1,2...,J 2+(i-1)(1+J(1+K)) + (j-1)(1+K) i=1,2,...,I; j=1,2...,J
  4. 3中的最后一个expression式提供了数据串位置所需的大部分内容。 这些发生在标题标签之后的K位置。 所以第一个数据串是通过给这个expression式加1得到的,第二个数据串是加上2,…,最后joinK.

这现在给出了所有的位置信息来构造输出表。

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

列标签(标题)由3中的最终expression式给出,并且由于这些标签对于每个项目都重复,所以可以selecti的任何值。 以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)开始的string的连接, (2+K)+(i-1)(1+J(1+K)) + (j-1)(1+K) (其中i在1和1之间,j在1和J之间) )。 数据串的位置是i和j的函数。

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

更新基于3个项目,4个标题和每个输出单元5个string的工作示例在这里