2017-02-17 15 views
0

所以我有一个从列A到J(行可以不同)的数据范围。我需要我的宏做的是拿起行a中的单元格值为IGNORE或#N/A的任何位置,并清除整行内容。此后我有VBA删除所有空白行。我遇到的问题是,VBA不想提取“#N/A”值并清除内容 - 如果我将其忽略掉,它完全符合我想要的只有IGNORE。我的宏没有拿起值“#N/A”来清除内容

请有人协助 - 我认为这可能与N/A没有作为文本拾取有关。

谢谢。

Dim end_range As Double 
Dim n As Double 

'Set the range in which to search for Ignore 

Sheets("Submit").Select 
Range("A1").End(xlDown).Select 
end_range = ActiveCell.Row 

'Store the values of in a range 
ReDim storeval(end_range) 

For n = 1 To end_range 
    storeval(n) = Range(Cells(n, 1), Cells(n, 1)).Value 
    Range(Cells(n, 2), Cells(n, 2)).Value = storeval(n) 
Next n 

'Delete the entirerow if the value contains ignore or N/A 
For n = 1 To end_range 
    If storeval(n) = "IGNORE" Or storeval(n) = "#N/A" Then 
    Range("A" & n).EntireRow.ClearContents 
    End If 
Next n 

Sheets("Submit").Columns("A:A").SpecialCells(xlCellTypeBlanks).EntireRow.Delete 

回答

3

如果您使用的是你的细胞=NA(),那么您看到的#N/A仅仅是一个错误对象的文本表示。 因此,而不是使用storeval(n) = "#N/A"的,你需要测试,如果:,

  • 这是一个错误使用IsError
  • 它是使用CVErr(xlErrNA)

这里NA误差稍微功能,将给你真正的是单元格是NA,如果它不是NA,则为false:

Function IsNa(value) 
    If Not IsError(value) Then 
     IsNa = False 
    ElseIf value = CVErr(xlErrNA) Then 
     IsNa = True 
    Else 
     IsNa = False 
    End If 
End Function 

然后只需要通过IsNa(storeval(n))

+0

你得到它的权利。 –

+0

对不起,这个愚蠢的问题,但在我的代码中,我打电话给它? – ifeelcrazy123

+0

'如果storeval(n)=“IGNORE”或IsNa(storeval(n))Then' –

2

要当场"#N/A",你需要寻找的单元格的值CVErr(xlErrNA)

您可能还需要切换你IfOrSelect Case

For n = 1 To end_range 
    Select Case storeval(n) 
     Case "IGNORE", CVErr(xlErrNA) 
      Range("A" & n).EntireRow.ClearContents 
    End Select 
Next n 
+0

我删除了我的帖子,我认为我们都太快了,如果单元格错误,运行时错误。 –

+0

感谢您的这一点,但是当我插入案例功能,如果它会给我错误类型不匹配。另外,只是一个简单的问题。在我的单元格中有#N/A是因为之前的公式错误,但在我正在查看的工作表中,它们被粘贴为值(单元格格式一般)。 CvErr(xlErrNA)会继续吗? – ifeelcrazy123