如何在Autofilter什么都不返回时捕获

时间:2013-06-26 12:47:05

标签: excel-vba vba excel

我无法弄清楚如何标题,但这里有更深入的描述。我已经创建了一个VBA代码,它将根据某些条件过滤excel文件,然后在单元格A(无论是什么行)中重命名Criteria的任何“匹配”,然后我的宏到达Criteria的末尾,然后到左边,并将其更改为需要重命名的任何内容,然后复制并粘贴到上面。

问题:截至目前,如果没有任何符合该标准的代码,代码会使我的光标或其他任何内容一直到文档的底部,并从电子表格的底部粘贴重命名的方式顶端。这显然是一个大问题,我觉得有一个简单的解决方案。

这是我的代码。在此先感谢,这个论坛很棒。

更新:我还附上了一个示例excel表,如果你运行这段代码(F8一直通过),你将能够看到错误发生的位置和方式。先谢谢你们。

以下是下载我的文件(Dropbox)的链接:https://www.dropbox.com/s/bx4ogcsdbmmzs59/ExcelExample11.xlsm?m

更新:我目前已经编辑了代码:大部分时间它都不会转到Else ...为什么当header列下面的单元格什么都没有时它会继续?我很困惑。

Range("M1").Select
ActiveSheet.Range(Selection, Selection.End(xlUp)).AutoFilter Field:=13, Criteria1:="=BCC*"
If Not Selection.Offset(0, 1) = "" Then
Selection.End(xlToLeft).Select
Selection.End(xlDown).Select
ActiveCell.FormulaR1C1 = "CLO"
Selection.Copy
Range(Selection, Selection.End(xlUp)).Select
ActiveSheet.Paste
Selection.End(xlUp).Select
Application.CutCopyMode = False
ActiveCell.FormulaR1C1 = "'Subtype"
Else
ActiveSheet.ShowAllData
Range("A1").Select
ActiveSheet.Range(Selection, Selection.End(xlUp)).AutoFilter Field:=1, Criteria1:="#N/A"
End If

1 个答案:

答案 0 :(得分:1)

我现在无法下载您的代码,但我99%肯定您可以通过查看这两个语句来解决问题:

Selection.End(xlToLeft).Select
Selection.End(xlDown).Select

当过滤器未返回任何内容时,其中第二个将带您一直到电子表格的底部。因此,在此声明之后,您需要测试行号 - 如果您的行号大于所使用的行数,则表示“已经完成了”。

首先,您需要知道电子表格中的最后一个“有效行”。你模块中的某个地方(或新模块)定义了一个这样的函数lastRowUsed(注意 - 你不能只使用ActiveSheet.UsedRange.Rows.Count,因为如果第一行是第一行,它将返回一个数字< last row如果对你来说情况绝非如此,你可以稍微简化一下你的生活:

Option Explicit

Function lastRowUsed()
' returns last row used on Active Sheet
  Dim address As String
  Dim lastRow As String
  Dim ii As Integer

  ' address of range has form $A$2:$C$10
  address = ActiveSheet.UsedRange.address
  lastRow = ""

  ' start at the end and work back until you find a "$"
  For ii = Len(address) To 1 Step -1
    If Mid(address, ii, 1) = "$" Then Exit For
    lastRow = Mid(address, ii, 1) + lastRow
  Next ii

  lastRowUsed = Val(lastRow)

End Function

一旦你定义了这个功能,你可以用一个简单的

测试你是否从边缘(Selection.End(xlDown).Select之后)掉了下来
if Selection.Row > lastRowUsed Then Goto NothingFound

在代码的底部,您可以创建一个标签

NothingFound:
  ' code you run when you had "nothing found"

在这里,您可以处理想要陷阱的案例。