难以将我的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
答案 0 :(得分:1)
当WorksheetFunction.Match
无法找到匹配项时,您已成为MATCH
奇怪行为的受害者。它不会返回错误,而是抛出一个运行时错误,这会产生错误。
由于这个问题的前提是搜索列表中是否存在某些内容,因此您几乎可以保证看到此问题,因为您希望某些项目不会显示。在#N/A
的公式版本中,如果找不到匹配项,您将获得Application.Match
。在这里,您会收到运行时错误。有两种解决方案:
Application.WorksheetFunction.Match
版本而不是IsError
。不幸的是,Intellisense在这里不会帮到你,但它是一个有效的功能。它的主要区别在于它将返回错误而不是抛出运行时错误。然后,您可以使用On Error Goto XXX
检查此错误,就像您最初的想法一样。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
。你通常可以假设这里的错误意味着你没有找到一个条目,然后以这种方式解决它。鉴于这两个选择,我强烈建议您使用选项1.该代码看起来像:
=0
我已将IsError(Application.Match(...))
条件换成True
,但如果找不到该列,则会返回@FXML
。
补充阅读:http://dailydoseofexcel.com/archives/2004/09/24/the-worksheetfunction-method/