2016-09-20 34 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)

相關問題