我在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
我知道转置函数和表格到文本,但我似乎无法实现上面所说明的内容。
答案 0 :(得分:1)
我通常会应用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栏中,我们得到MOD(6, 5)
,列偏移为1.这意味着A6中的值将来自B列。
但我们不希望这样:每个数据行的B列中的值应该显示在结果范围的B列中。我们需要从A列跳到C列,以获得结果A列的下一个值。
因此第二个学期(MOD(ROW(A5),5)<>0))
。对于不的偶数为5的每一行,此值的计算结果为TRUE - 这些行是在A列和B列中显示(结果)值的行。当在a中使用时,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),"")
答案 1 :(得分:1)
使用简单的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