#vba #excel
#vba #excel
Вопрос:
Я пытался написать весь свой код, используя кодовые имена, чтобы предотвратить ошибки при изменении имени и прекратить активацию / выбор листов. Все шло хорошо, пока я не добрался до кода сортировки, где, как я думал, будет выбрано следующее Sheet2
ActiveWorkbook.Sheets(2).Sort.SortFields.Clear
ActiveWorkbook.Sheets(2).Sort.SortFields.Add Key:=Range( _
"A2:A" amp; LastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
ActiveWorkbook.Sheets(2).Sort.SortFields.Add Key:=Range( _
"J2:J" amp; LastRow), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _
xlSortNormal
With ActiveWorkbook.Sheets(2).Sort
.SetRange Range("A1:J" amp; LastRow)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
На самом деле это работает на Sheet2, но после добавления нового листа я обнаружил, что он подсчитывает листы на основе их положения в документе (вкладки внизу).
Попытка заменить любую из этих строк чем-то вроде ActiveWorkbook.Sheet2.Sort.SortFields.Clear
выдает ошибку «438 — Объект не поддерживает это свойство или метод».
Единственный способ, которым я смог заставить это работать, — заменить его на ActiveWorkbook.Sheets(Sheet2.Name).Sort.SortFields.Clear
. Мне кажется, что, возможно, я чего-то здесь не хватает, но у меня возникают проблемы с поиском чего-либо, связанного с кодовым именем и сортировкой.
Комментарии:
1. находится ли код в той же книге? Процитирую OzGrid: «Кодовое имя sheets нельзя использовать только в тех случаях, когда вы ссылаетесь на лист, который находится в книге, отличной от той, в которой находится код». ozgrid.com/VBA/excel-vba-sheet-names.htm
2. Да, они находятся в одной книге
Ответ №1:
Просто присвоите лист переменной, используя кодовое имя:
Dim ws As Worksheet
Set ws = Sheet2
Затем вы должны вызывать каждую строку с:
ws.Sort...
Комментарии:
1. Я смог пропустить это и просто использовать
Sheet2.Sort.SortFields.Clear
но есть ли какой-нибудь способ сослаться на рабочую книгу? Я пыталсяThisWorkbook.Sheet2
, но это также выдало мне ошибку.2. нет, это один из тех случаев, когда вам захочется сделать что-то вроде.
ThisWorkbook.Activate
передSet ws = Sheet2
, чтобы убедиться, что выбрано правильное кодовое имя.3. Не понимаю, зачем вам нужно «ссылаться на рабочую книгу»?? Если у вас есть рабочий код с
Sheet2.Sort.SortFields.Clear
, то почему вы хотите попробовать добавить объект workbook в уравнение?#4. Если во время выполнения кода выбрана другая книга, не будет ли она сортировать активную выбранную книгу вместо предполагаемой, если я не определю, какую книгу?
5. Нет, Если вы поместите строку активировать непосредственно над установленной строкой, вероятность смещения рабочей книги за эту миллионную долю секунды практически исключена. И как только переменная установлена, ссылка на книгу также установлена и не изменится независимо от того, что активируется после. @tjb1
Ответ №2:
Используйте имя листа, а не его индекс, как в:
ActiveWorkbook.Sheets("Sheet2").Sort.SortFields.Clear
Это работает до тех пор, пока имя листа не изменится.
Комментарии:
1. Я избегаю использования фактического имени листа, чтобы предотвратить ошибки, если / когда оно будет изменено.
2. Всегда ли это активный рабочий лист при запуске скрипта? Если это так, то вы можете просто назначить переменную листа, а затем просто ссылаться на нее. Что-то вроде
Dim ws as worksheet; Set ws = ThisWorkbook.ActiveSheet
. Затем просто ссылайтесьws
с этого момента.