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

时间:2016-09-20 16:17:31

标签: 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

1 个答案:

答案 0 :(得分:2)

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

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