2012-08-08 95 views
2

我有一个电子表格,其中包含8列数据A-H,每一列的长度都不相同,可能包含我需要删除的值“0”。我试图用.Find方法来做到这一点,但由于find方法一直将空单元(列的长度小于最大长度列)分类为零,因此我正在尝试使用这种方法。当函数找到其中一个单元格时,它会选择并删除该列顶部的单元格,而不是选择特定的单元格。我试过使用我的代码使用0以外的值,它工作正常,所以这是一个与Excel分类空单元格为“0”的问题。如何查找“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

你能否张贴一点样本数据? – MikeD 2012-08-08 07:50:56

+0

我无法正确地格式化数据,但基本上我有8列数据,每个数据列可以包含任意数量的行(此时此行在234行和269行之间),其中都填充了数字。您可以通过在单元格中放置随机数字来创建虚拟数据,只需确保列的长度不同,并且散布的值为零。 – 2012-08-08 08:05:57

回答

2

试试这个

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

这将清除如果你想删除其中有“0”,那么你也可以使用.Find.FindNext细胞具有“0”

所有单元格。请参阅此链接

主题:.Find和.FindNext在Excel VBA

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

报价从该链接

在本教程中,我会强调如何使用。找到更快的搜索。

.Find的语法

expression.Find(什么,之后,看着,注视,SearchOrder,SearchDirection,MatchCase,MatchByte,SearchFormat)

表达式(必填):是任何有效的范围对象。因此,如果我们拿上面的例子,则范围将是范围(“A1:A” & LASTROW)

什么(可选,Variant):是“搜索值”

后(可选,Variant):细胞之后您想要搜索开始。

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

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

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

SearchDirection:可以是其中一个XlSearchDirection常量。 xlNext默认xl上一个

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

MatchByte(可选变体):仅在您选择或安装双字节语言支持时使用。如果双字节字符只匹配双字节字符,则为真。假使双字节字符与它们的单字节等价物匹配。

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

+0

这很好,但是有没有办法删除单元而不是清除它们? – 2012-08-08 07:55:50

+0

刷新页面;)我已经添加了该信息:) – 2012-08-08 07:59:29

+0

Sid,我认为问题是查找例程上的错误匹配 – brettdj 2012-08-08 08:01:26

0

而是然后用所有细胞工作,做初试工作,以确定所关注的范围 - 即具有数字在他们要么进入为常数,公式的单元格。这将从搜索中排除您的空白代码,从而加快代码速度并消除错误标记。

在此示例中,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 
+0

我实际上没有考虑这样做,这是一个很好的解决问题的方法。这说,而不是增加另一个Sub什么是一个快速增长的电子表格,我想我会去其他的答案,因为它解决了几个击键问题。 – 2012-08-08 08:19:27

0

我的建议是做0一般更换为= 0/0,这应该给一个错误(和仍然给你一个方法来恢复值回如果需要,由于独特的计算而为0),然后执行查找/选择特殊错误。

相关问题