我有一个包含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
我宁愿不必循环遍历代码并依次搜索每一列,但它开始看起来像我可能必须这样做。
答案 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,由于独特的计算),然后做找到/选择特殊错误。