2016-12-28 96 views
0

我有多个列表在Excel中分开的列中,但有些列不包含数据。我需要做的是将这些有数据的列组合成一个大列。在两者之间Excel - 如果数据存在将多个列合并为一个

A 
B 
C 
D 
E 
F 
G 
H 
I 

由于没有空行:

Row 1 | A B 
Row 2 | C D E 
Row 3 | F 
Row 4 | G H I 

应结合成。如果可能的话,宁愿不使用宏。

谢谢!

+0

非常容易在VBA中,如果没有可行的话很困难。我建议你继续使用VBA,我们很乐意帮助你把它带到最后。 –

+0

你不想要宏的任何特定原因?一个公式将会非常棘手(呃,可能没有考虑到这里某些用户的聪明才智),但是VBA肯定会是一个更快的解决方案。另外,你到目前为止尝试过什么? – BruceWayne

回答

0

我可以想到一些方法来做到这一点。使用下面的公式。 (MyData,1 + INT((ROW(A1)-1)/ COLUMNS(MyData)),MOD(ROW(A1)-1 + COLUMNS(MyData),COLUMNS(MyData))+ 1)

这里假设'MyData'是一个命名范围。

作为替代方案,您可以使用简单的VBA脚本来完成这项工作。

Sub ConvertRangeToColumn() 
Dim Range1 As Range, Range2 As Range, Rng As Range 
Dim rowIndex As Integer 
xTitleId = "Title" 
Set Range1 = Application.Selection 
Set Range1 = Application.InputBox("Source Ranges:", xTitleId, Range1.Address, Type:=8) 
Set Range2 = Application.InputBox("Convert to (single cell):", xTitleId, Type:=8) 
rowIndex = 0 
Application.ScreenUpdating = False 
For Each Rng In Range1.Rows 
    Rng.Copy 
    Range2.Offset(rowIndex, 0).PasteSpecial Paste:=xlPasteAll, Transpose:=True 
    rowIndex = rowIndex + Rng.Columns.Count 
Next 
Application.CutCopyMode = False 
Application.ScreenUpdating = True 
End Sub 
+0

在宏中更新了“Paste:= xlPasteAll”为“Paste:= xlPasteValues”,因为单元格中有公式,而且我需要值但常规公式和宏都有效。谢谢! – vwalsh10

1

如果您不想使用宏,您至少需要使用过滤器来避免空行(我的解决方案中的零行)。

我假定你的数据位于列A,B和C

在列d我们下面的公式

=IF(MOD(ROW()+2,3)=0,INDEX(A:A,QUOTIENT(ROW()+2,3)),IF(MOD(ROW()+2,3)=1,INDEX(B:B,QUOTIENT(ROW()+2,3)),IF(MOD(ROW()+2,3)=2,INDEX(C:C,QUOTIENT(ROW()+2,3)),""))) 

拖动公式向下就可以。过滤此列以删除零。

Screenshot

0

如果你不想使用VBA宏我认为最好的方式得到它是B列,列C,然后列d,......一个拷贝下对方,像这样:

A 
C 
F 
G 
B 
D 

H 

E 

I 

然后使用菜单Data => Remove Duplicates删除多个空格。

如果您改变使用宏的想法,只需在Google上搜索“unpivot data Excel”,您就会发现很多解决方案。