Activecell不在Array中

时间:2015-06-23 10:54:43

标签: vba

难以将我的activecell与预定义数组进行比较。

从其他来源导入数据后,我想删除我不需要的列

我将数组修为未定义,字符串和变体 并试过activecell / activecell.value <> NeededColumns 没有快乐:(

 Sub Trim()        
    Dim NeededColumns As Variant
        NeededColumns = Array("APPLICATION NUMBER", "DATE", "BRAND", "CHANNEL", "SCHEME")


    Range("A1").Select
    Do Until ActiveCell = ""
        If Application.WorksheetFunction.Match(ActiveCell.Value, NeededColumns, 0) = 0 Then
            ActiveCell.EntireColumn.Delete
        Else
            ActiveCell.Offset(0, 1).Select
        End If
    Loop
End Sub

1 个答案:

答案 0 :(得分:1)

WorksheetFunction.Match无法找到匹配项时,您已成为MATCH奇怪行为的受害者。它不会返回错误,而是抛出一个运行时错误,这会产生错误。

由于这个问题的前提是搜索列表中是否存在某些内容,因此您几乎可以保证看到此问题,因为您希望某些项目不会显示。在#N/A的公式版本中,如果找不到匹配项,您将获得Application.Match。在这里,您会收到运行时错误。有两种解决方案:

  1. 使用函数的Application.WorksheetFunction.Match版本而不是IsError。不幸的是,Intellisense在这里不会帮到你,但它是一个有效的功能。它的主要区别在于它将返回错误而不是抛出运行时错误。然后,您可以使用On Error Goto XXX检查此错误,就像您最初的想法一样。
  2. 使用If将错误路由到某处而不是Sub Trim() Dim NeededColumns As Variant NeededColumns = Array("APPLICATION NUMBER", "DATE", "BRAND", "CHANNEL", "SCHEME") Range("A1").Select Do Until ActiveCell = "" If IsError(Application.Match(ActiveCell.Value, NeededColumns, 0)) Then ActiveCell.EntireColumn.Delete Else ActiveCell.Offset(0, 1).Select End If Loop End Sub 。你通常可以假设这里的错误意味着你没有找到一个条目,然后以这种方式解决它。
  3. 鉴于这两个选择,我强烈建议您使用选项1.该代码看起来像:

    =0

    我已将IsError(Application.Match(...))条件换成True,但如果找不到该列,则会返回@FXML

    补充阅读:http://dailydoseofexcel.com/archives/2004/09/24/the-worksheetfunction-method/