Использование кодового имени листа в коде сортировки

#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 с этого момента.