在VB.NET中,Range类的AutoFilter方法失败
我正在尝试使用一些parsing,我可以稍微调整一下。 如果我在Excel中使用直VBA,它工作正常。 但是,当我在VB.NET中使用相同的代码作为模块时,我得到了代码行标题中的错误
ws.Range(vTitles).AutoFilter()
(duh!)我不确定在转换中出了什么问题,因为我不是一个硬核VB.Net程序员,所以我做了大量的Googlesearch,但没有find太多的工作。 任何想法如何可以修复,或者我不得不放弃在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
看起来你需要指定至less一个可选参数。 尝试这个:
ws.Range(vTitles).AutoFilter(Field:=1)