我有一点问题,我偶尔遇到这种问题,但到目前为止我还没有找到快速解决方案。
所以,假设我们有一个Excel工作表,让我们假设我们在“A”列中有几个数字,其中有一些空单元格。总而言之(只是为了简化)我们在“A”列中有前10个单元来观察。例如:
3
(empty cell)
(empty cell)
6
(empty cell)
4
(empty cell)
23
(empty cell)
2
现在在下一步中,我想使用VBA将这些数字收集到另一列(例如,列'B')。显然我只想收集那些包含数字的单元格,我想忽略空单元格。所以我想得到一个像这样的专栏:
3
6
4
23
2
我已经编写了以下代码,但此时我已陷入困境。
Sub collect()
For i = 1 To 10
if cells(i,1)<>"" then...
Next i
End Sub
有没有一种简单的方法可以解决这个问题?
提前致谢,
的Laszlo
答案 0 :(得分:3)
可能最快捷,最简单的方法是使用Excel的高级过滤器 - 您需要做的唯一修改是添加字段名称和标准。您甚至可以仅列出唯一商品
等效的VBA是
Sub test()
With Sheet1
.Range("B1:B8").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=.Range( _
"D1:D2"), CopyToRange:=.Range("F1"), Unique:=False
End With
End Sub
答案 1 :(得分:2)
您应该能够在评论中使用帖子中的方法,但您也可以使用SpecialCells
之类的Range("A:A").SpecialCells(xlCellTypeConstants,xlNumbers).Copy
来获取所有已填充的单元格。
编辑:需要的常量而不是公式。
答案 2 :(得分:0)
如果您希望手动循环播放不要介意指定最大行限制;
Dim i As long, values As long
for i = 1 To 10
if cells(i, 1).Value <> "" Then
values = (values + 1)
'//adjacent column target
cells(values, 2).value = cells(i, 1).value
end ff
next i
答案 3 :(得分:0)
这适用于您选择的任意数量的行。它将始终在您选择开始时的下一列输出,例如如果数据在B10开始,它将在C10中输出
Sub RemoveBlanks()
Dim cl As Range, cnt As Long
cnt = 0
For Each cl In Selection
If Not cl = vbNullString Then
Cells(Selection.Cells(1, 1).Row, Selection.Cells(1, 1).Column).Offset(cnt, 1) = cl
cnt = cnt + 1
End If
Next cl
End Sub