2014-02-27 36 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