2015-02-23 2 views
0

Я скопировал код с этого сайта, который, как я думал, решит проблему, которую я пытался решить. Я скопировал исходный код с Using Sort in VBA for a Range that Changes Я сделал очень мало на пути изменений, просто определяя левый верхний край данных как находящийся в ячейке A3. Конечный код выполнялся следующим образом:«Ошибка выполнения 1004: ссылка недействительна»

Sub sortOnlySelectedArea() 
    Dim actSheet As Worksheet 
    Dim upper, lower As Integer 
    Dim tempString As String 
    Dim selectedArea As Range 
    Set actSheet = Application.Worksheets("Sheet1") 
    ' here you have to put in your part to make the right 
    'actSheet.Range("E5:G6").Select 
    ActiveSheet.Range("a3").CurrentRegion.Select 
    Set selectedArea = Selection 
    upper = selectedArea.Row 
    lower = upper + selectedArea.Rows.Count - 1 
    tempString = "F" & CStr(upper) & ":F" & CStr(lower) 
    actSheet.Sort.SortFields.Clear 
    actSheet.Sort.SortFields.Add Key:=Range(tempString), _ 
     SortOn:=xlSortOnValues, Order:=xlAscending, 
    DataOption:=xlSortNormal 
    With actSheet.Sort 
     .SetRange selectedArea 
     .Header = xlGuess 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 

Моя проблема в том, что код не работает почти в конце. Я прошел через код и правильно подбирал область данных. Он выходит из строя, когда он достигает последней, но одной строки (.Apply), которая затем подсвечивается. Отладочное сообщение указывает на ошибку Runtime 1004: Недопустимая ссылка на ссылку. Я не могу правильно следовать коду, чтобы узнать, как выбран диапазон сортировки. В идеале я хотел бы иметь возможность сортировать по столбцу C, но при необходимости рассчитывать на столбец A. Диапазон, который я пытаюсь сортировать, - A3: F105.

+2

'введите код here' –

+0

Учитывая, что вы используете Range.CurrentRegion у вас есть какие-либо пустые строки/столбцы внутри A3: F105? См. Https://msdn.microsoft.com/en-us/library/office/aa214248%28v=office.11%29.aspx – barryleajo

ответ

0

я смог воссоздать ошибку времени выполнения 1004, когда моя область не содержит никаких данных в столбце F.

Линия

tempString = "F" & CStr(upper) & ":F" & CStr(lower) 

является определение сортировки столбца. Если вы измените F на A, я думаю, что сортировка его по столбцу A.

+0

Вы были на месте. Я понял, насколько простой (и глупой) была моя ошибка. Я подумал, что когда я скопировал исходный код, я исправил его достаточно, чтобы решить свои проблемы.Я благодарю вас и других 2 респондентов за то, что было чрезвычайно полезным опытом обучения, который поможет мне в обработке сортировки и выбора диапазона в будущем. – DaveP

0

Я буду признавать, что вы знаете, как CurrentRegion Property представляет собой остров данных вокруг указанной ячейки или ячеек. Успех вашей операции сортировки будет зависеть от этого.

Наиболее очевидный потенциальный конфликт на моих глазах говорит actSheet представлять Лист1 но впоследствии рассказывал actSheet сортировать выбранный текущий регион на на ActiveSheet. Это не обязательно тот же рабочий лист.

Следующие попытки консолидировать ссылки на рабочие листы при использовании альтернативного метода кодирования для реальной процедуры сортировки.

Sub sortOnlySelectedArea() 
    With Worksheets("Sheet1").Range("a3").CurrentRegion 
     .Cells.Sort Key1:=.Columns(6), Order1:=xlAscending, _ 
        Orientation:=xlTopToBottom, Header:=xlYes 
    End With 
End Sub 

Имя этого подразделам обманывает в том, что оригинал выбран .CurrentRegion вокруг A3 ячейки активного рабочего листа, но он делает то же самое. Как уже упоминалось, существует некоторая путаница вокруг ActiveSheet и Worksheets("Sheet1"). Вам нужно выбрать один метод ссылок и придерживаться его. Отскок назад и вперед может привести только к конфликтам, которые могут не воспроизводить себя все время (например, только когда Sheet1 является не активным листом).

И, наконец, это не рекомендуется, чтобы Excel угадал, есть ли у вас строка заголовка или нет. Вы должны знать, делаете вы или нет.

+0

Спасибо. Кажется, я понимаю все комментарии. Как любитель, это очень помогает мне, когда мои неправильные представления сортируются. С помощью себя и других 2 сообщений я много разбирался в сортировке данных и выборе диапазона, которые меня обманули в прошлом. К счастью, моя проблема решена и может подойти к любому будущему такие проблемы самостоятельно – DaveP

2

Может быть, это больше того, что вам нужно ...

Sub someSortRoutine() 
    Dim sortsheet As Worksheet 
    Dim sortArea As Range 
    Dim keyColumn As Range 

    Set sortsheet = Application.Worksheets("Sheet1")  
    Set sortArea = sortsheet.Range("a3").CurrentRegion 
    Set keyColumn = Application.Intersect(sortsheet.Range("F:F"), sortArea) 

    sortsheet.Sort.SortFields.Clear 
    sortsheet.Sort.SortFields.Add Key:=keyColumn, _ 
     SortOn:=xlSortOnValues, Order:=xlAscending, _ 
    DataOption:=xlSortNormal 
    With sortsheet.Sort 
     .SetRange sortArea 
     .Header = xlGuess 
     .MatchCase = False 
     .Orientation = xlTopToBottom 
     .SortMethod = xlPinYin 
     .Apply 
    End With 
End Sub 
+0

Спасибо. С помощью всех трех респондентов я получил большой шаг вперед в своем опыте не только сортировки, но и определения диапазона, и я могу адаптировать это к небольшому проекту, который я отказался несколько раз ранее из-за моего отсутствия опыта – DaveP