如何找到“0”值而不是空单元格

时间:2012-08-08 07:44:20

标签: excel excel-vba vba

我有一个包含8列数据的电子表格,A-H,每个数据的长度不同,可能包含我需要删除的值“0”。我不是用循环来做这个,而是尝试使用.Find方法做这个,但是我变得不稳定,因为find方法将空单元格(其中列比最大长度列短)分类为零。当函数找到其中一个单元格时,它会选择并删除该列顶部的单元格,而不是选择特定单元格。我尝试使用我的代码使用0以外的值,它工作正常所以这是一个问题,excel将空单元格分类为“0”。

有没有办法专门搜索值“0”?我尝试使用str(0)指定字符串值“0”但得到相同的结果。我的代码的一个子集是:

Row = wf.Max(Cells(Rows.Count,1).End(xlUp).Row, Cells(Rows.Count,8).End(xlUp_.Row

'Originally I had zero = 0 or "0" but I tried the following to get a string version
zero = Str(0)
zerofix = Right(zero,1)

Do While Check_Val_Existence(zerofix,Row) = True
   Set aCell = ActiveSheet.Range(Cells(1,1), Cells(Row,8)).Find(What:=zerofix,LookIn:=xlValues)
   If Not aCell Is Nothing Then
      aCell.Delete Shift:=xlUp
   End If
Loop

,其中

Function Check_Val_Existence(ByVal Srch, ByVal Row) As Boolean

Dim rFnd As Range

Set rFnd = ActiveSheet.Range(Cells(1,1), Cells(Row,8)).Find(What:=Srch)
If Not rFnd Is Nothing Then
   Check_Val_Existence = True
Else
   Check_Val_Existence = False
End If

End Function

我宁愿不必循环遍历代码并依次搜索每一列,但它开始看起来像我可能必须这样做。

3 个答案:

答案 0 :(得分:2)

试试这个

Sheet1.Cells.Replace What:="0", Replacement:="", LookAt:=xlwhole, SearchOrder:= _
xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False  

这将清除所有具有“0”

的单元格

如果要删除“0”的单元格,则还可以使用.Find.FindNext。看到这个链接

主题:.Find和.FindNext在Excel VBA中

链接http://www.siddharthrout.com/2011/07/14/find-and-findnext-in-excel-vba/

从该链接引用

  

在本教程中,我将强调如何使用.Find来加快搜索速度。

     

.Find的语法是

     

expression.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat)

     

其中

     

Expression(必需):是任何有效范围的Object。因此,如果我们采用上面的例子,则范围将是Range(“A1:A”& lastRow)

     

什么(可选变体):是“搜索值”

     

之后(可选变体):您希望搜索开始的单元格。

     

LookIn(可选变体):信息类型。 (xlValues或xlFormulas)

     

LookAt(可选变体):可以是以下XlLookAt(常量)之一:xlWhole或xlPart。

     

SearchOrder(Optional Variant):可以是以下XlSearchOrder常量之一:xlByRows或xlByColumns。

     

SearchDirection:可以是这些XlSearchDirection常量之一。 xlNext默认xlPrevious

     

MatchCase(Optional Variant):True表示搜索区分大小写。默认值为False。

     

MatchByte(可选变体):仅在您选择或安装了双字节语言支持时使用。为True,双字节字符仅匹配双字节字符。假为双字节字符匹配其单字节等价物。

     

SearchFormat(可选变体):搜索格式。

答案 1 :(得分:0)

而不是使用所有单元格,进行预先工作以定义感兴趣的范围 - 即,其中包含数字的单元格作为常量或公式输入。这会从搜索中排除您的空白cels,这将加速您的代码,并消除错误的标记。

在此示例中,rng3返回ActiveSheet上感兴趣的单元格。然后,您将在此范围内运行Find例程

Sub LookAtZeros()
Dim rng1 As Range
Dim rng2 As Range
Dim rng3 As Range
On Error Resume Next
Set rng1 = Cells.SpecialCells(xlCellTypeConstants, xlNumbers)
Set rng2 = Cells.SpecialCells(xlCellTypeFormulas, xlNumbers)
On Error GoTo 0
If Not rng1 Is Nothing Then
If Not rng2 Is Nothing Then
Set rng3 = Union(rng1, rng2)
Else
Set rng3 = rng1
End If
Else
If Not rng2 Is Nothing Then Set rng3 = rng2
End If
If Not rng3 Is Nothing Then
MsgBox "Range with numeric constants and/or numeric formulae is " & rng3.Address(0, 0)
Else
MsgBox "no numbers", vbCritical
End If
End Sub

答案 2 :(得分:0)

我的建议是做一般0到0/0的替换,这应该给出一个错误(并且如果需要,仍然会给你一种方法将值恢复为0,由于独特的计算),然后做找到/选择特殊错误。