我有各种品牌的巨大市场份额数据,如下所示:
1111 2222 3333 4444
5555 7777 8888
9999 0001 0002
0004 0005 0006 0007
哪些宏代码可用于获取以下输出:
1111
2222
3333
4444
5555
<emptyCell>
7777
8888
9999
0001
0002
<emptyCell>
0004
0005
0006
0007
还必须考虑空单元格。
还有可能在其他 Sheet 中获得输出吗?
更改INDEX为处理器密集度较低的版本
在您要将数据复制到的任何工作表的第 1 行中:
=INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1)
把它复制下来,一旦零开始出现,你就结束了。(这是唯一的问题 - 空白单元格将变为零。如果您也希望保留空白,那么您需要这个:
=IF(ISBLANK(INDEX($A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1)),"",INDEX( $A$1:$D$4,INT((ROW()-1)/4)+1,MOD(ROW()-1,4)+1))
)
如果您不是从第一行开始,则更ROW()改为ROW()-XX 是从顶部向下的行数(即第 2 行为 1,第 3 行为 2,第 800 行为 799)
如果有不同的列数,把4改成合适的数字
从 SeanC 的回答(感谢好友)修改为通用用法,以便具有其他范围维度和起始单元格的人可以使用它:
将“$RANGE$”替换为对您的范围的引用将“$CELL$”替换为对输出列的第一个单元格的引用:
=INDEX( $RANGE$ ,INT((ROW()-ROW( $CELL$ ))/COLUMNS( $RANGE$ ))+1,MOD(ROW()-ROW( $CELL$ ),COLUMNS( $RANGE$ ))+1)
把它拖下来。当然,请确保 $RANGE$ 和 $CELL$ 在行和列上都用“$”符号固定。
假设您的范围是 A1:D4,这里有一个 VBA 宏可以做到这一点(只需将值放在 E 列下)。
Sub RangeToColumn()
Dim varray As Variant
Dim i As Long, j As Long, k As Long
Application.ScreenUpdating = False
k = 1
varray = Range("A1:D4").value
For i = 1 To UBound(varray, 1)
For j = 1 To UBound(varray, 2)
Cells(k, 5).value = varray(i, j)
k = k + 1
Next
Next
Application.ScreenUpdating = True
End Sub
您可能会喜欢并使用字典对象并将数组转置到列上,但这更简单,并且字典对象在 Mac 上不起作用。您也可以使用 "Range("E" & k)" 而不是 "Cells(k, 5)" 但 Cells() 稍微快一些,因为它不需要连接。
另请注意,通过关闭屏幕更新,这将运行得更快。
Sub Makealist()
Application.ScreenUpdating = False
Dim rng As Range
' Destination of List
Worksheets("SomeWorksheet1").Activate
Worksheets("SomeWorksheet1").Range("SomeRange1").Select
' Range to Convert to list
Set rng = Worksheets("SomeWorksheet2").Range("SomeRange2")
' Makes sure that all "Blank cells are really Blank"
For Each c In rng.Cells
If Len(c) = 0 Then
c.Value = ""
End If
Next
' Creates the list
For Each c In rng.Cells
If IsEmpty(c.Value) = False Then
Selection.Value = c.Value
Selection.Offset(1, 0).Select
End If
Next
Application.ScreenUpdating = True
End Sub