VBA END求一行或一列最后一个非空单元格时,如何跳过公共产生的空白

想定信到第二行里边最后一个非空单元格。如果用代码CELLS(2,2556).END(XLLEFT)只能定位到从CELLS(2,2556)往左遇到的第一个因公式产生的空白上,而不是我要的那个非空。 公式大致是这种=IF(H2="","",H2-D2)如何跳过公式产生的空白?定位到有效的非空单元格?如图,我想定位到F52 结果定位到J52就是因为J52有一个公式,如何跳过J52,或多个J52这样的单元格,定位到F52呢?

用公式返回的""是一条字符数量为0个的文本。
就是说这个单元格不是空值,它的值是一条字符数量为0个的文本。
先叉个话题,
求左界时的Cells(2, 2556)建议写成Cells(2, Columns.Count)
求上界时那上写成Range("A" & Rows.Count)
因为不行版本的软件,行数和列数有可能不一样多,比如你的Cells(2, 2556)在Office2003环境下运行时会报错,因为没有2556那么多列。而写成列数为Columns.Count、行数为Rows.Count则是动态的,该版本有多少列多少行,就指的是多少列多少行。
再把话题转回来,说说用VBA代替公式的问题:
既然你会VBA,你完全可以考虑不用公式,而用VBA代替公式,
这样就不会有""影响你定位左界的问题了。
使用工作表的Change变更事件进行运算,例如:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Row > 3 Then '如果发生变更的目标单元格的行号>3
Dim irow&
irow = Target.Row
If Target.Column = 4 Or Target.Column = 8 Then '如果目标的列号是4或8(D列或H列)
If Range("D" & irow) = "" Or Range("H" & irow) = "" Then '如果D或H有一个是空的
Range("J" & irow).ClearContents '那么清空J单元格
Else
Range("J" & irow) = Val(Range("H" & irow)) - Val(Range("D" & irow)) '否则求差
End If
End If
End If
End Sub追问

Range("4:4").Find("*", , xlValues, 1, , 2).Select
我用FIND 方法只找值,就实现了,但是知其然,不知其所以然,只能解读查找值 xlValues,但是为什么他会从右往左,或者说以后我想从下往上,从上往下 ,从左往右,又该如何 实现?这个就没弄明白。太闹心了。但凡我要处理的表标准点。也没那么闹心,
不骗你。我处理四个表,就从小白,整成了一个新手了。

追答

VBA中的工作表函数Find,主了参数如下:
给你讲讲这七个参数:Find(第一参数,第二参数,第三参数,第四参数,第五参数,第六参数,第七参数)
第一参数,必须(不可省略):
你想要查什么,比如文本、数值、日期等等各种类型的数据。
第二参数,可选(可以省略):
从什么地方开始查找,如果不省略,则必须是单个单元格。
第三参数,可选:
xlfromulas查询公式

xlvalues查询值
xlcomments查询批注

第四参数,可选:
xlWhole精确查找,可以简写为1
xlPart模糊查找,可以简写为2

第五参数,可选:
xlByRows优先按行查找,先行后列,可以简写为1
xlByColumns优先按列查找,先列后行,可以简写为2
第六参数,可选:
xlnext向后查找,可以简写为1
xlprevious向前查找,可以简写为2
此参数如果缺省,默认向后查找。
一般在需要向前查找时写上这个参数,否则就省略了吧。
第七参数,可选:
True,区分大小写,True和1是等效的,所以也可以写为1
False,不区分大小写,False和0是等效的,所以也可以写为0
此参数如果缺省,默认不区分大小写。
一般在需要区分大小写时写上这个参数False或0,否则就省略了吧。

温馨提示:答案为网友推荐,仅供参考
第1个回答  2021-07-31
没有办法的,END判断的时候,严格区分了空字符串单元格("")、和空单元格(EMPTY),遇到本帖例子的空文本就会停止,因为该单元格NOT EMPTY

一般的解决办法是:在END之后,再次使用WHILE跳过空文本单元格,例如:
C=CELLS(2,2556).END(XLLEFT).COLUMN
WHILE C>1 AND CELLS(2,C)=""
C=C-1
WEND
相似回答