Как избежать использования Select в Excel VBA
Я много слышал о понятном отвращении к использованию .Select в Excel VBA, но не уверен, как его избежать. Я обнаружил, что мой код был бы более пригодным для повторного использования, если бы я мог использовать переменные вместо Select функций. Тем не менее, я не уверен, как ссылаться на вещи (например, и ActiveCell т. Д.), Если не использовать Select .
Важно отметить, что есть случаи, когда использование Select и / или и ActiveSheet т. Д. Совершенно неизбежно. Вот пример, который я нашел: stackoverflow.com/questions/22796286/…
И бывают случаи — редактирование данных диаграммы в ppt с использованием файла Excel — когда требуется активация или выбор.
@brettdj — вот недавний пример . Кажется .Select / .Selection , для того, чтобы установить для всех листов в книге одно и то же значение .
Set переменная до необходимого диапазона. Есть много способов обратиться к диапазону одной ячейки
Вы можете использовать ярлык для Evaluate метода, но он менее эффективен и его, как правило, следует избегать в рабочем коде.
Все приведенные выше примеры относятся к ячейкам на активном листе . Если вы специально не хотите работать только с активным листом, лучше также затемнить Worksheet переменную.
Если вы действительно хотите работать с ActiveSheet , для ясности , что лучше быть явным. Но будьте осторожны, так как некоторые Worksheet методы меняют активный лист.
Опять же, это относится к активной книге . Если вы специально не хотите работать только с ActiveWorkbook или ThisWorkbook , лучше также Dim Workbook переменную.
Если вы действительно хотите работать с ActiveWorkbook , для ясности , что лучше быть явным. Но будьте осторожны, так как многие WorkBook методы меняют активную книгу.
Вы также можете использовать ThisWorkbook объект для ссылки на книгу, содержащую исполняемый код.
Обычный (плохой) кусок кода — открыть книгу, получить некоторые данные и снова закрыть
Передайте диапазоны своим Sub s и Function s как переменные Range
Вы также должны применять методы (такие как Find и Copy ) к переменным
Если вы циклически изменяете диапазон ячеек, часто лучше (быстрее) сначала скопировать значения диапазона в вариантный массив и выполнить цикл по нему.
добавив к этому блестящему ответу, что для работы с диапазоном вам не нужно знать его фактический размер, если вы знаете верхний левый rng1(12, 12) угол . например, будет работать, даже если для rng1 было установлено [A1:A10] только.
@chrisneilsen Крис, я полагаю, что вы также можете использовать префикс рабочего листа перед краткой записью ссылки на ячейку, чтобы избавить вас от необходимости печатать Range так: ActiveSheet.[a1:a4] или ws.[b6] .
@ user3932000, который сделал бы интересным Q. Я уверен, что есть способы справиться с этим .. Вы были на ТАК достаточно долго, чтобы знать, что перехватить поток комментариев на старом Q — не самый
Две основные причины, по которым .Select / .Activate / Selection / Activecell / Activesheet / и Activeworkbook т. Д . следует избегать
1) Непосредственно работать с соответствующими объектами
2) При необходимости объявите свои переменные. Тот же код выше может быть записан как
Я считаю, что вам иногда может понадобиться сначала активировать лист, если вам нужно вставить или отфильтровать данные на нем. Я бы сказал, что лучше избегать активации, насколько это возможно, но есть случаи, когда вам нужно это сделать. Так что продолжайте активировать и выбирать до абсолютного минимума согласно ответу выше.
@ Ник Вам не нужно активировать листы, чтобы вставить их или отфильтровать. Используйте объект листа в ваших командах вставки или фильтрации. Это становится легче, когда вы изучаете объектную модель Excel на практике. Я полагаю, что единственный раз, когда я использую .Activate, это когда я создаю новый лист, но я хочу, чтобы исходный лист появлялся, когда код готов.
@phrebh Вам не нужно использовать .Activate для перехода к исходному листу, просто используйте Application.Goto
Я добавлю один небольшой акцент ко всем превосходным ответам, данным выше:
Вероятно, самое большое, что вы можете сделать, чтобы избежать использования Select, — это максимально использовать именованные диапазоны (в сочетании со значимыми именами переменных) в вашем коде VBA . Этот момент был упомянут выше, но немного затенен; Однако это заслуживает особого внимания.
Вот еще несколько причин, по которым можно свободно использовать именованные диапазоны, хотя я уверен, что мог бы придумать еще.
Как отсортировать данные в Excel с помощью VBA (пошаговое руководство)
- Хороший пример того, когда вас могут оправдать использование, .Activate и .Select когда вы хотите убедиться, что конкретный Рабочий лист выбран по визуальным причинам. Например, ваш Excel всегда будет открываться с выбранным первым листом обложки, независимо от того, какой лист ActiveSheet был закрыт при закрытии файла.
Дискуссия о том, хороши ли названные диапазоны или нет, дизайн электронных таблиц продолжается — я твердо в лагере. По моему опыту, они увеличивают количество ошибок (для обычных пользователей, которым не нужен код).
Удаление надстройки VBA-Excel
Мы сожалеем, что наша программа не подошла для Вас. Мы стараемся усовершенствовать ее внедряя новый функционал и исправляя выявленные ошибки. Будем рады если Вы дадите нам обратную связь, на основе которой мы поймем в каком направлении нам двигаться.
Инструкция по отключению надстройки
В результате вкладка с надстройкой исчезнет с компьютера и больше не будет загружаться вместе с Excel.
Вы сможете подключить надстройку тогда, когда она понадобиться.
Полное удаление программы
Если Вы больше не планируете пользоваться программой, то помимо отключения надстройки необходимо удалить сам файл с программой. Для этого:
Выпадающий список в Excel с помощью инструментов или макросов
- Откройте диалоговое окно Надстройки повторив действия указанные выше.
- Выделите надстройку VBA-Excel и нажмите Обзор.
- Откроется местоположение файла. Удалите его и программа удалится полностью.
Я много слышал о понятном отвращении к использованию .Select в Excel VBA, но не уверен, как его избежать. Я обнаружил, что мой код был бы более пригодным для повторного использования, если бы я мог использовать переменные вместо Select функций. Тем не менее, я не уверен, как ссылаться на вещи (например, и ActiveCell т. Д.), Если не использовать Select .