2014-02-27 39 views
3

我是Excel VBA的新手。這看起來應該很簡單。 我需要從Access數據庫中排序電子表格。Excel VBA排序

這是我的代碼。

目前我收到1004錯誤。 「myRange =範圍(選擇)」的「對象範圍_Global失敗的方法」

任何幫助,非常感謝。

Sub sortBacklog() 

Dim appExcel As Excel.Application 
Dim myWorkbook As Excel.Workbook 
Dim myWorkSheet As Worksheet 
Dim myRange As Range 

Set appExcel = CreateObject("Excel.Application") 
Set myWorkbook = appExcel.Workbooks.Open("C:\Users\gephilli\Desktop\Dispatch\SAP_Backlog.xls") 
Set myWorkSheet = myWorkbook.Sheets(1) 

myWorkSheet.Activate 
myWorkSheet.Select 

Range("B1").Select 
Range(Selection, Selection.End(xlDown)).Select 
Range(Selection, Selection.End(xlToRight)).Select 
myRange = Range(Selection) 

myWorkSheet.Sort.SortFields.Clear 

ActiveWorkbook.Worksheets("PLS Depot Backlog Report").Sort.SortFields.Add Key _ 
    :=Range("F2:F20491"), SortOn:=xlSortOnValues, Order:=xlAscending, _ 
    DataOption:=xlSortNormal 

With ActiveWorkbook.Worksheets("PLS Depot Backlog Report").Sort 
    .SetRange Range(myRange) 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

ActiveWorkbook.Save 
ActiveWorkbook.Close 
appExcel.Quit 
Set myWorkSheet = Nothing 
Set myWorkbook = Nothing 
Set appExcel = Nothing 
End Sub 
+0

1)[**避免使用Select /主動陳述**](http://stackoverflow.com/options/10714251/excel-macro-avoid-using-select)2)將'myRange = Range(Selection)'改爲'Set myRange = Selection' –

+0

並將'.SetRange Range(myRange)'改爲'.SetRange myRange '。還有一件事 - 使用'xlDown'和'xlToRight'不可靠。閱讀此答案[**如何確定最後一行/列**](http://stackoverflow.com/questions/11169445/error-finding-last-used-cell-in-vba/11169920#11169920) –

回答

2

通常不需要在VBA中選擇任何東西。這是錄製的宏所做的,但它不是有效的方式。嘗試: Set myrange = Sheet1.Range(「B1」,Sheet1.Range(「B1」)。End(xlDown).End(xlToRight))

您看到的問題實際上可能是缺少「設置「在發生錯誤的行中。如果沒有「set」,excel會嘗試處理範圍內容,「set」會對範圍對象本身起作用。

+0

我加入組。同一行上出現相同的錯誤。 :( – Gene

1

考慮到的意見和更好的做法,我重新寫你的代碼註釋:

Sub sortBacklog() 

    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    'Changed to late binding - no need to set reference to Excel ' 
    'and not reliant on a specific version of Excel.    ' 
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    Dim appExcel As Object 
    Dim myWorkbook As Object 
    Dim myWorkSheet As Object 
    Dim myRange As Object 

    Set appExcel = CreateObject("Excel.Application") 
    'appExcel.Visible = True 
    Set myWorkbook = appExcel.Workbooks.Open("C:\Users\gephilli\Desktop\Dispatch\SAP_Backlog.xls") 

    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    'You may want to change this to look at a named sheet. 
    'e.g. myWorkbook.Sheets("PLS Depot Backlog Report") ' 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    Set myWorkSheet = myWorkbook.Sheets(1) 

    '''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    'Everything between 'With' and 'End With' that  ' 
    'starts with a . (period) will apply to myWorksheet. ' 
    '''''''''''''''''''''''''''''''''''''''''''''''''''''' 
    With myWorkSheet 

     ''''''''''''''''''''''''''''''''''''''''''' 
     'Get range from B1 to last cell on sheet. ' 
     ''''''''''''''''''''''''''''''''''''''''''' 
     Set myRange = .Range(.Cells(1, 2), .Cells(.Cells.Find("*", , , , 1, 2).Row, .Cells.Find("*", , , , 2, 2).Column)) 

     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
     'Everything between 'With' and 'End With' that   ' 
     'starts with a . (period) will apply to myWorksheet.Sort. ' 
     ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
     With .Sort 
      .SortFields.Clear 

      ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
      'As using late binding Access won't understand Excel values so: ' 
      'xlSortOnValues = 0  xlYes   = 1      ' 
      'xlAscending = 1  xlTopToBottom = 1      ' 
      'xlSortNormal = 0  xlPinYin  = 1      ' 
      ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
      .SortFields.Add _ 
       Key:=myRange.offset(, 6).Resize(, 1), _ 
       SortOn:=0, _ 
       Order:=1, _ 
       DataOption:=0 

      .SetRange myRange 
      .Header = 1 
      .MatchCase = False 
      .Orientation = 1 
      .SortMethod = 1 
      .Apply 

     End With 

    End With 

    With myWorkbook 
     .Save 
     .Close 
    End With 

    appExcel.Quit 

    Set myWorkSheet = Nothing 
    Set myWorkbook = Nothing 
    Set appExcel = Nothing 

End Sub