我已将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 |
我假设最直接的方法是编写一个自定义排序宏,可以按标题排序为分隔符
任何人都可以给我一个快速启动吗?
答案 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
答案 1 :(得分:1)
另一种不使用VBA的方法,它比你的例子中显示的2行,2列和2个连接字符串输出更通用,它选择列标题以及输入数据中的行标题... < / p>
我将假设您的数据具有以下结构:
您的输入数据列表将包含I项标签,IJ标题标签(因为每个项目有J个标题标签)和IJK数据字符串,所以I + IJ + IJK = I(1 + J(1 + K))总值。为方便起见,输入数据列的行按顺序编号,从1开始。
该方法基于挑选第i项标签,第j个标题标签和包括第(i,j)个单元的数据串的输入数据列表内的位置。请注意i和j与I和J不同。
我会首先处理标题标签,因为这可能是最容易理解的。
p+n(1+K) for n=0,1,...,J-1
我很快就会回到p的值。1 + n(1+J(1+K)) n=0,1,...,I-1
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
。现在提供构造输出表的所有位置信息。
行标签(项目)由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