2015-03-30 5 views
1

Я написал макрос, который открывает файл CSV, содержащий новые данные, копирует содержимое (минус строку заголовка) и вставляет его в основную книгу. Теперь мне нужно, чтобы также отсортировать весь набор данных (все данные в основной лист) по номеру образца, приведенного в колонке А. Я пробовал 2 разные методы:Excel VBA sort a

Set rData = ThisWorkbook.Sheets("Data").Range("A1") 
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4)) 
rData.Sort Key1:=Range("A:A"), Order1:=xlAscending, Header:=xlYes 'Debug points here 

Этот метод возвращает время выполнения ошибки 1004 : «Недопустимая ссылка на сортировку».

Set rData = ThisWorkbook.Sheets("Data").Range("A1") 
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4)) 
ThisWorkbook.Sheets("Data").Sort.SortFields.Clear 'Debug points here 
ThisWorkbook.Sheets("Data").Sort.SortFields.Add Key:=Range(_ 
    "A:A"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ 
    xlSortNormal 
With ThisWorkbook.Sheets("Data").Sort 
    .SetRange Range(rData) 
    .Header = xlYes 
    .MatchCase = False 
    .Orientation = xlTopToBottom 
    .SortMethod = xlPinYin 
    .Apply 
End With 

Этот метод возвращает ошибку времени выполнения 9: «Подзаголовок вне диапазона».

+0

В какой строке вы выбрасываете ошибку? –

+0

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

+0

Попробуйте 'Set rData = Таблицы (« Данные »). Диапазон (« A1: D »и таблицы (« Данные »). ИспользуетсяRange.Rows.Count)' Избавьтесь от 'Set rData = Range (rData, rData.End (xlDown) .Offset (0, 4)) ' – user1274820

ответ

1

Есть похожие вопросы на SO, с ответами, которые могут вам помочь.
'1004': “The sort reference is not valid.”
Excel VBA Run-Time Error 1004

За то, что я понимаю, ошибка лежит здесь: Key1:=Range("A:A"), возможно, изменить его Key1:=Range("A1") и быть уверенным, добавьте книгу или/и ссылки рабочей таблицы в диапазоне, а также.

+1

Добавление ссылки на рабочую книгу и листы в этом диапазоне сделало трюк. Благодаря! –

0

Я считаю, что здесь:

Set rData = Range(rData, rData.End(xlDown).Offset(0, 4)) 

попробовать это:

Set rData = Range(cells(1,1), cells(4,rData.End(xlDown).Offset(0, 4))) 

* Обратите внимание, я часто путают порядок строк/Col в .cells(), так что вам придется поменять их местами, если ваш диапазон неверен.

В любом случае,

Set rData = ThisWorkbook.Sheets("Data").Range("A1") 
Set rData = Range(rData, rData.End(xlDown).Offset(0, 4)) 

является избыточным, в лучшем случае вам нужно:

Set rData = Range("a1", rData.End(xlDown).Offset(0, 4)) 

Обновление на основе комментариев:

Я думаю, что проблема заключается в том, как вы указав свой диапазон для сортировки. Документы говорят, что вы можете сортировать любой диапазон, включая весь рабочий лист. Может также сортировать весь лист, так как это единственные данные, которые у вас есть, правильно?

set rdata = thisworkbook.sheets("Data") 
rdata.sort (Key1:=rdata.range("A:A"), Order1:=xlAscending, Header:=xlYes) 
+0

Я не вижу, как мой код избыточен. У макроса есть 2 книги, поэтому мне нужен мой код, чтобы указать на правильную книгу. Кроме того, я не вижу, как может работать ваша последняя строка. Как вы можете '.End (xlDown) .Offset (0, 4))' из переменной, которая еще не установлена? –

+1

Да, хорошо, действительные баллы. Я смотрел первый ряд вашего второго оператора 'Set rData =' и пропустил, увидев второе использование 'rData' там. Я возьму вторую трещину ... – FreeMan