我在 excel 中有一个表格,在下面的示例中,每个数字代表一个单元格:
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
我想将此表转换为如下所示的文本文件:
11 12
13
14
15
21 22
23
24
25
31 32
33
34
35
我知道转置功能和文本表格,但我似乎无法实现我上面说明的内容。
我在 excel 中有一个表格,在下面的示例中,每个数字代表一个单元格:
11 12 13 14 15
21 22 23 24 25
31 32 33 34 35
我想将此表转换为如下所示的文本文件:
11 12
13
14
15
21 22
23
24
25
31 32
33
34
35
我知道转置功能和文本表格,但我似乎无法实现我上面说明的内容。
我通常应用 、 和 的组合ROUND
将MOD
一OFFSET
组表格数据转换为单列。这个问题增加了希望将第二个数字放在右侧列中的组中,同时在第一列中跳过该数字。并且您想在每组数字之间放置一个间隔行。这两个要求都比通常的公式更复杂。
对于第一列,从单元格 A5 开始,或者在 A 列中的另一个单元格中,其行是 5 的偶数倍,使用以下公式,
= IFERROR(
OFFSET(
$A$1,
ROUNDDOWN( ROW(A5) / 5 - 1, 0),
MOD( ROW(A5), 5) + (MOD( ROW(A5), 5) <> 0)
) /
(MOD( ROW(A5), 5) <> 4),
""
)
并复制该列。这假定数据行从单元格 A1 开始。
对于第二列,从 A 列中起始单元格右侧的 B 列中的单元格开始,输入此公式,
= IFERROR(
OFFSET($A$1,
ROUNDDOWN( ROW(B5) / 5 - 1, 0),
MOD( ROW(B5), 5) + 1
) /
NOT( MOD( ROW(B5), 5) > 0),
""
)
再次将其复制下来。
公式如何工作
列 A 和列 B 函数都是 的详细说明OFFSET
,它的参数是起始地址,其结果范围将开始向下(或向上)的行数,以及右侧(或左侧)的列数范围将。(它还需要另外两个参数,即要返回的范围的宽度和高度。由于我们只关心单个单元格,因此我们可以忽略这两个参数。)
例如,列 A 的行计算使用表达式
ROUNDDOWN(ROW(A5)/5-1,0)
.
在单元格 A5 中,此公式解析为 (5/5 - 1) 或 0,无需四舍五入。因此,A1 的行偏移量为 0,这是有道理的,因为 A5 公式正在处理第一行数据。
在单元格 A6 中,公式变为 6/5 - 1、或 1.2 - 1 或 0.2,向下舍入为 0,这也是我们需要的,因为我们仍在从第 1 行获取数字。
这一直持续到单元格 A10,当我们得到 10/5 - 1 或 1 时。我们完成了第一行数据(与 a1 的偏移量为 0 行),现在转到第二行。行偏移的值将继续为 1,直到单元格 A15,此时它将再次增加 1。
列偏移的计算有点棘手:
MOD(ROW(A5),5)+(MOD(ROW(A5),5)<>0))
第一项是MOD(ROW(A5),5)
。在单元格 A5 中,MOD(5, 5)
结果为 0,因为 5 / 5 的整数余数为 0。同样,这是有道理的 - 单元格 A1 的列偏移量为 0 意味着我们将获取列 A 中的值。单元格 A6,我们得到MOD(6, 5)
,列偏移量为 1。这意味着 A6 中的值将来自 B 列。
但我们不希望这样:每个数据行的 B 列中的值应该显示在结果范围的 B 列中。我们需要从 A 列跳到 C 列,以获取结果 A 列的下一个值。
因此第二项(MOD(ROW(A5),5)<>0))
。对于不是5 的偶数倍数的每一行,其计算结果为 TRUE - 这些行在 A 列和 B 列中显示(结果)值。在算术表达式中使用时,TRUE 计算结果为 1。因此,当公式在第 6、7、8、9、11、12 等行中时,我们将列偏移量加 1,从而跳过数据行的 B 列。
最后是除数(MOD(ROW(A5),5)<>4)
。当公式所在的行除以 5 时余数不为 4 时,此表达式将计算为 TRUE(或 1)。这意味着仅当公式在第 9、14、19 行时,它才会计算为 FALSE 或 0,等等
这些实际上是我们希望在数字组之间留出空格的行。此除数的目的是在公式位于这些行中时产生公式错误。IFERROR
然后我们在包含整个公式的函数中捕获该错误,公式的输出变为“”——空字符串。
我不会介绍 B 列表达式,它使用相同类型的操作来获取每个数据行中的第二个值并将其显示在第一个值旁边。
为了方便复制和粘贴到您的工作表,以下是未格式化的公式版本:
Cell A5 Formula: =IFERROR(OFFSET($A$1,ROUNDDOWN(ROW(A5)/5-1,0),MOD(ROW(A5),5)+(MOD(ROW(A5),5)<>0))/(MOD(ROW(A5),5)<>4),"")
Cell B5 Formula: =IFERROR(OFFSET($A$1,ROUNDDOWN(ROW(B5)/5-1,0),MOD(ROW(B5),5)+1)/NOT(MOD(ROW(B5),5)>0),"")
使用简单的 VBA 可以有效地创建实际文件。
此代码将活动表列中从A1
到最后使用的单元格的范围内的数据转储E
到文件C:\temp\dummy.txt
请更改您的路径以适应
Sub RipData()
Dim X
Dim lngRow As Long
Dim lngCol As Long
Dim objFSO As Object
Dim objTF As Object
X = Range([a1], Cells(Rows.Count, "E").End(xlUp))
Set objFSO = CreateObject("scripting.filesystemobject")
Set objTF = objFSO.createtextfile("C:\temp\dummy.txt")
For lngRow = 1 To UBound(X, 1)
objTF.writeline X(lngRow, 1) & vbTab & X(lngRow, 2)
For lngCol = 3 To UBound(X, 2)
objTF.writeline X(lngRow, lngCol)
Next
objTF.writeline
Next
objTF.Close
End Sub