2

我有一个包含 8 列数据 AH 的电子表格,每列都有不同的长度,并且可能包含我需要删除的“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

我宁愿不必遍历代码并依次搜索每一列,但看起来我可能不得不这样做。

4

3 回答 3

2

试试这个

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

这将清除所有具有“0”的单元格

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

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

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

从该链接引用

在本教程中,我将重点介绍如何使用 .Find 来加快搜索速度。

.Find 的语法是

表达式.Find(什么,之后,LookIn,LookAt,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat)

在哪里

表达式(必需):是任何有效的范围对象。因此,如果我们采用上面的示例,那么范围将是 Range(“A1:A” & lastRow)

什么(可选变体):是“搜索值”</p>

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

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

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

SearchOrder(可选变体):可以是以下 XlSearchOrder 常量之一:xlByRows 或 xlByColumns。

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

MatchCase(可选变体):True 使搜索区分大小写。默认值为假。

MatchByte(可选变体):仅在您选择或安装了双字节语言支持时使用。如果双字节字符只匹配双字节字符,则为真。False 使双字节字符匹配其单字节字符。

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

于 2012-08-08T07:51:59.297 回答
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
于 2012-08-08T07:57:36.797 回答
0

我的建议是将 0 普遍替换为 = 0/0,这应该会产生错误(并且由于唯一的计算,如果需要,仍然可以将值恢复为 0),然后执行 find/选择特殊错误。

于 2012-08-09T17:13:19.530 回答