在Excel中将表格转换为文本 – 在新行上的每个单元格

我在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 

我意识到转置function和一个表格文本,但我似乎无法实现我上面所说的。

使用简单的VBA可以有效地创build实际的文件。

此代码将数据从A1范围内的数据转移到activesheet列E中最后使用的单元格,并将其转储到文件C:\ temp \ dummy.txt

请改变你的path,以适应

在这里输入图像说明

 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 

我通常应用ROUNDMODOFFSET的组合将一组表格数据转换为一个表格。 这个问题有一个额外的皱纹,想把第二个数字放在右边的一列中,而跳过第一列中的数字。 而你想在每组数字之间放置一个间隔行。 这两个要求使得比通常的公式更加复杂。

对于第一列,从单元格A5开始,或者在行A是5的偶数倍的列A中的另一个单元格中,使用以下公式,

 = 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开始。

对于第二列,从列B中的单元格开始,在列A中的开始单元格的右侧,input此公式,

  = 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的行计算使用expression式

ROUNDDOWN(ROW(A5)/5-1,0)

在单元格A5中,此公式parsing为(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中显示(结果)值的行。在算术expression式中使用TRUE时,计算结果为1。 因此,当公式在第6,7,8,9,11,12等行中,我们将1加到列偏移量上,从而跳过数据行的B列。

最后,除数(MOD(ROW(A5),5)<>4) 。 当公式所在的行没有4的余数除以5时,这个expression式的计算结果为TRUE(或1)。这意味着只有当公式在第9,14,19和19行时,它的计算结果为FALSE或0。等等

这些实际上是我们想要在这些数字组之间留出空间的行。 这个除数的目的是当公式在这些行中时产生公式错误。 然后我们在包含整个公式的IFERROR函数中捕获这个错误,公式的输出变成“” – 空string。

我不会通过列Bexpression式,它使用相同的操作来拾取每个数据行中的第二个值,并显示在第一个值旁边。

为了便于复制和粘贴到工作表,以下是公式的未格式化版本:

 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),"")