2016-09-20 159 views
1

我想用一些解析我能够稍微调整。如果我在Excel中直接使用VBA,它工作正常。然而,当我在VB.NET使用相同的代码的模块,我得到的标题中错误的)的代码行范围类的AutoFilter方法在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 
+0

如果你只用更换范围'vTitles'会发生什么?你也可以试试这个'ws.Range(vTitles).AutoFilter(Nothing,Operator:= Excel.XlAutoFilterOperator.xlFilterValues)' – Codexer

+0

@Zaggler是的,它降落了同样的错误。我也试过你的代码片段,并且也收到了同样的错误。 – Darw1n34

+0

看起来像'ws.Range(vTitles).AutoFilter(Field:= 1)'有效。 –

回答

1

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

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