VB.NET 中 Range 类的 AutoFilter 方法失败

Dar*_*n34 1 vb.net excel vba autofilter

我正在尝试使用一些我能够稍微调整的解析。如果我在excel的直接VBA中使用它,它工作正常。但是,当我在 VB.NET 中使用与模块相同的代码时,我在代码行的标题中收到错误

ws.Range(vTitles).AutoFilter()

(废话!)我不确定转换中出了什么问题,因为我不是一个铁杆的 VB.Net 程序员,所以我做了很多谷歌搜索,但没有找到很多有用的东西。关于如何解决这个问题的任何想法,或者我是否必须放弃在 VB.Net 中使用这个片段的想法?

这是我正在使用的代码:

'turned strict off or autofilter per     http://www.pcreview.co.uk/threads/autofilter-method-of-range-class-failed.3994483/
Option Strict Off
Imports xl = Microsoft.Office.Interop.Excel

Module ParseItems

Public Sub ParseItems(ByRef fileName As String)
    'Jerry Beaucaire  (4/22/2010)
    'Based on selected column, data is filtered to individual workbooks are named for the value plus today's date
    Dim wb As xl.Workbook
    Dim xlApp As xl.Application
    Dim LR As Long, Itm As Long, MyCount As Long, vCol As Long
    Dim ws As xl.Worksheet, MyArr As Object, vTitles As String, SvPath As String

    'Set new application and make wb visible
    xlApp = New xl.Application
    xlApp.Visible = True

    'open workbook
    wb = xlApp.Workbooks.Open(fileName)


    'Sheet with data in it
    ws = wb.Sheets("Original Data")

    'Path to save files into, remember the final "\"
    SvPath = "G:\MC VBA test\"

    'Range where titles are across top of data, as string, data MUST have titles in this row, edit to suit your titles locale
    vTitles = "A1:L1"

    'Choose column to evaluate from, column A = 1, B = 2, etc.
    vCol = xlApp.InputBox("What column to split data by? " & vbLf & vbLf & "(A=1, B=2, C=3, etc)", "Which column?", 1, Type:=1)
    If vCol = 0 Then Exit Sub

    'Spot bottom row of data
    LR = ws.Cells(ws.Rows.Count, vCol).End(xl.XlDirection.xlUp).Row

    'Speed up macro execution
    'Application.ScreenUpdating = False

    'Get a temporary list of unique values from key column
    ws.Columns(vCol).AdvancedFilter(Action:=xl.XlFilterAction.xlFilterCopy, CopyToRange:=ws.Range("EE1"), Unique:=True)

    'Sort the temporary list
    ws.Columns("EE:EE").Sort(Key1:=ws.Range("EE2"), Order1:=xl.XlSortOrder.xlAscending, Header:=xl.XlYesNoGuess.xlYes, _
       OrderCustom:=1, MatchCase:=False, Orientation:=xl.Constants.xlTopToBottom, DataOption1:=xl.XlSortDataOption.xlSortNormal)

    'Put list into an array for looping (values cannot be the result of formulas, must be constants)
    MyArr = xlApp.WorksheetFunction.Transpose(ws.Range("EE2:EE" & ws.Rows.Count).SpecialCells(xl.XlCellType.xlCellTypeConstants))

    'clear temporary worksheet list
    ws.Range("EE:EE").Clear()

    'Turn on the autofilter, one column only is all that is needed
    ws.Range(vTitles).AutoFilter()

    'Loop through list one value at a time
    For Itm = 1 To UBound(MyArr)
        ws.Range(vTitles).AutoFilter(Field:=vCol, Criteria1:=MyArr(Itm))

        ws.Range("A1:A" & LR).EntireRow.Copy()
        xlApp.Workbooks.Add()
        ws.Range("A1").PasteSpecial(xl.XlPasteType.xlPasteAll)
        ws.Cells.Columns.AutoFit()
        MyCount = MyCount + ws.Range("A" & ws.Rows.Count).End(xl.XlDirection.xlUp).Row - 1

        xlApp.ActiveWorkbook.SaveAs(SvPath & MyArr(Itm), xl.XlFileFormat.xlWorkbookNormal)
        'ActiveWorkbook.SaveAs SvPath & MyArr(Itm) & Format(Date, " MM-DD-YY") & ".xlsx", 51   'use for Excel 2007+
        xlApp.ActiveWorkbook.Close(False)

        ws.Range(vTitles).AutoFilter(Field:=vCol)
    Next Itm

    'Cleanup
    ws.AutoFilterMode = False
    MsgBox("Rows with data: " & (LR - 1) & vbLf & "Rows copied to other sheets: " & MyCount & vbLf & "Hope they match!!")
    xlApp.Application.ScreenUpdating = True
End Sub



End Module
Run Code Online (Sandbox Code Playgroud)

Jim*_*itt 5

看起来您至少需要指定一个可选参数。尝试这个:

ws.Range(vTitles).AutoFilter(Field:=1)