我正在Excel中用VB编写一个宏,它将从一个单元格表/一个范围中找到一个填充(非空)单元格。 我知道一点C ++,但我认为在VB中制作一个小宏并不太难。
这里的问题是宏没有找到填充的单元格,只是跳过它。我做错了什么?
Sub Datum()
Dim Horizontal As Integer
Horizontal = 10
Dim Vertical As Integer
Vertical = 10
Dim h As Integer
Dim v As Integer
h = 0
v = 0
Range("A1").Select
For v = 0 To Vertical
For h = 0 To Horizontal
If ActiveCell.Value = True Then
Exit For
Exit For
End If
ActiveCell.Offset(0, 1).Select
Next
ActiveCell.Offset(1, 0).Select
h = 0
Next
MsgBox ActiveCell.Value
End Sub
PS。我已经在互联网上进行了研究,但似乎没有像我这样的问题。
答案 0 :(得分:1)
您不应该选择每个单元格,因为这非常耗时。如果您的范围是10 * 10,这无关紧要,但我认为这是一个实验。
此代码替换您的循环。我使用了你的变量。
Dim Found as Boolean
Found = False
With ActiveSheet
For v = 1 to vertical
For h = 1 to horizontal
If IsEmpty(.Cells(v, h).Value) Then
Found = True
Exit For
End If
Next
If Found then
Exit For
End If
Next
If Found Then
' Action empty cell (v,h) found in range
Else
' Action no empty cell in range
End If
在此实验中,您的范围是10x10。你知道真的大小吗?您想在运行时确定使用的范围吗?在我们提供整体解决方案之前,必须解决这些问题。
答案 1 :(得分:0)
问题的一部分是我想的循环:
Exit For
Exit For
这不会做你想要的,因为第一个命令会让你跳出内部For
循环,你永远不会碰到第二个,所以你将继续执行外部for循环。
使用Do-While类型循环可能会更好:
Dim blnFound as Boolean
Dim v as integer
dim h as integer
blnFound = false
v = 0
Do while v <= Vertical and not blnFound
h = 0
Do while h <= Horizontal and not blnFound
If ActiveCell.Value = True Then
blnFound = True
End If
h=h+1
ActiveCell.Offset(0, 1).Select
loop
v = v+1
ActiveCell.Offset(1, 0).Select
loop
我也不确定您的Offset
来电会做您想做的事情,特别是在下一栏的顶部。您最好使用v
和h
值来选择要更精确检查的单元格(例如ActiveSheet.Cell(h,v)
)
注意:我没有测试过这段代码,所以可能需要调整,但它应该给出一个想法。