VBA:编码

时间:2015-07-31 13:34:26

标签: excel vba excel-vba excel-2013 autofilter

这是来自a previous post的后续问题。

因此,我工作的公司最近更新了他们的Excel从2003年到2013年。我现在遇到一些非常基本的VBA代码的问题。特别是Cells.AutoFilter(x, y)行给了我一些问题。

几个月前我写了一个非常难看的程序,看起来像这样:

...
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=11, Criteria1:= _
    "0"
If wf.CountA(r) > 0 Then
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=8, Criteria1:= _
    Array("baseunitprice", "burden", "MTLBURRATE", "PurPoint", "Vendornum"), Operator _
    :=xlFilterValues
Range("K2:K50000").SpecialCells(xlCellTypeVisible).Select
ActiveCell.FormulaR1C1 = "MACROUSE"
Range(Selection, Selection.End(xlDown)).Select
Selection.FillDown
ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=8
...

这是我写的第一个程序,必须重写,原因很明显。

为了尝试以更优雅,可读的方式镜像上述代码,我在同一个模块中创建了另一个Sub:

Sub ActualProgram()

Dim firstRow As Integer
Dim lastRow As Integer
Dim firstCol As Integer
Dim lastCol As Integer
Dim allRange As Range
Dim vRange As Range
Dim bRange As Range
Dim commentsCol As Integer
Dim commentsColRng As Range
Dim fieldNameCol As Integer
Dim userCol As Integer

If Cells(2, 1) <> "" Then

    DeleteEmptyRows

    firstCol = 1
    lastCol = Cells(1, Columns.Count).End(xlToLeft).Column
    firstRow = 2
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    commentsCol = Rows(1).find("Comments").Column '11
    fieldNameCol = Rows(1).find("Field Name").Column '8
    userCol = Rows(1).find("User").Column '4

    Set allRange = Range(Cells(firstRow, firstCol), Cells(lastRow, lastCol))
    Set commentsColRng = Range(Cells(firstRow, commentsCol), Cells(lastRow, commentsCol))

    ActiveSheet.ListObjects("Table1").Range.AutoFilter 11, "0"     'WORKS
    Cells.AutoFilter commentsCol, "0"                              'FAILS

    Call MarkFieldNames(fieldNameCol, commentsColRng)

    Call MarkNonSMFields(commentsColRng)

    Call TargetFieldNames(fieldNameCol, commentsCol)

End If

End Sub

当然,从未在之前的程序中调用此子程序。我只想将两个代码放在一起,这样我就可以在编写新代码时参考前一个代码。

我在新代码中遇到问题的一行是 Cells.AutoFilter commentsCol, "0"

我在旧代码中使用的行是ActiveSheet.ListObjects("Table1").Range.AutoFilter Field:=11, Criteria1:="0"

旧代码仍然正常。新的抛出AutoFilter method of Range class failed运行时错误。在我看来,这两行完全相同,我在Excel 2013上使用了行Cells.AutoFilter(x, y)太多次来计算而没有错误。

我需要更改设置吗?我问,因为我看到 VBA&gt;工具&gt;选项&gt;编辑代码设置选项,例如Require Variable Declaration,这让我相信可能有一个设置会禁用我调用AutoFilter()方法的方式。

感谢您的时间。

1 个答案:

答案 0 :(得分:0)

我正在使用桌子。因此,ActiveSheet.ListObjects("Table1")...表的处理方式与常规单元格不同,因此,在自动过滤时必须专门针对它们。