2015-06-23 23 views
2

难以将我的活动单元与预定义数组进行比较。活动单元不在阵列中

从另一个来源我要修剪出列输入数据后,我不需要

我已经修整数组作为两个不确定的,字符串和变异 并试图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 
+0

究竟是什么问题? – ApplePie

+0

我得到的If语句,然后VBA去调试 '运行时错误'1004' 无法获得WorksheetFunction类' – JBear

+0

@JBear的Match属性,您在进入循环之前设置了ActiveCell。在循环内,你还没有设置ActiveCell,如果它被删除,下一个ActiveCell是什么? – PaulFrancis

回答

1

你牺牲品的WorksheetFunction.Match的古怪行为时,它无法找到匹配,而是返回错误的,它抛出这牙龈了工程运行时错误。

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

  1. 使用Application.Match版本的函数而不是Application.WorksheetFunction.Match。不幸的是,Intellisense在这里不会帮你,但它是一个有效的功能。它有一个关键的区别,它会返回错误,而不是抛出运行时错误。然后你可以使用IsError来检查这个错误,就像你最初的想法一样。
  2. 使用On Error Goto XXX将错误路由到某处而不是If。您通常可以假设这里的错误意味着您没有找到条目,然后以这种方式解决它。

鉴于这两种选择,我强烈建议你选择1.该代码去会看起来像:

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 

我已经牺牲你的=0状况进行了检查上IsError(Application.Match(...))这将返回True如果该列未找到。

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

+0

这完美地工作......非常感谢@Byron – JBear