Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sorting excelvba排序_Sorting_Excel_Vba - Fatal编程技术网

Sorting excelvba排序

Sorting excelvba排序,sorting,excel,vba,Sorting,Excel,Vba,我是Excel VBA新手。这看起来应该很简单。 我需要从Access数据库中对电子表格进行排序 这是我的密码 目前我得到一个1004错误。“myRange=Range(Selection)”上对象范围的方法\u Global失败 非常感谢您的帮助 Sub sortBacklog() Dim appExcel As Excel.Application Dim myWorkbook As Excel.Workbook Dim myWorkSheet As Worksheet Dim myRang

我是Excel VBA新手。这看起来应该很简单。 我需要从Access数据库中对电子表格进行排序

这是我的密码

目前我得到一个1004错误。“myRange=Range(Selection)”上对象范围的方法\u 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

通常不需要在VBA中选择任何内容。录制的宏就是这样做的,但这不是有效的方法。尝试: 设置myrange=Sheet1.范围(“B1”,Sheet1.范围(“B1”).结束(xlDown).结束(xlToRight))


您看到的问题实际上可能是发生错误的行中缺少“set”。如果没有“set”,excel会尝试处理范围内容,而使用“set”则会处理范围对象本身

考虑到注释和更好的实践,我用注释重新编写了您的代码:

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

1) 2)将
myRange=Range(Selection)
更改为
Set myRange=Selection
,并将
.SetRange Range(myRange)
更改为
.SetRange myRange
。还有一件事-使用
xlDown
xlToRight
不可靠。读这个答案