- •Скрытые перемещения
- •Относительные перемещения
- •Перемещаемся по листам не зная их имён
- •Крайние перемещения
- •Выделения относительно активной ячейки
- •Относительные формулы
- •Столбцы и строки
- •Error. Обработка ошибок
- •Способ №1. Перенаправление программы
- •Способ №2. Настойчивость в исправлении ошибки
- •Скачать пример
- •Способ №3. Предупреждён. Сообщение об ошибке
- •Способ №4. Очистка ошибки
- •Способ №5. Идём напролом
- •Создание собственной функции
- •Цифры прописью
- •Заставка приветствия реализованная на UserForm
- •Выпадающий список ComboBox на UserForm
- •Работа с ComboBox
- •Как поставить значение по умолчанию в ComboBox?
- •Запрет ввода данных в ComboBox
- •Ускоряем работу макроса в Excel
- •Глобальное ускорение
Как поставить значение по умолчанию в ComboBox?
Если нам необходимо по умолчанию поставить какого-то сотрудника, например Василий, то в коде инициализации формы необходимо добавить ещё одну строку.
Private Sub UserForm_Initialize()
Dim Imena As String
Dim a As Byte
For a = 2 To 9 Step 1
Imena = Cells(a, 1)
Sotrudniki.AddItem Imena
Next a
Sotrudniki.ListIndex = 0 'отвечает за выбор сотрудника
End Sub
Обратите внимание, что номерация списка в ComboBox начинается с 0. То-есть если нам по умолчанию надо будет прописать Екатерину, то.
Sotrudniki.ListIndex = 1
Запрет ввода данных в ComboBox
Теперь необходимо доработать ещё один момент - это запрет ввода данных в ComboBox Вручную. Добавим в код инициализации формы ещё одну строчку, которая будет запрещать вносиьт изменеия в выпадающем списке.
Private Sub UserForm_Initialize()
Dim Imena As String
Dim a As Byte
For a = 2 To 9 Step 1
Imena = Cells(a, 1)
Sotrudniki.AddItem Imena
Next a
Sotrudniki.ListIndex = 0 'Отвечает за выбор сотрудника
Sotrudniki.Style = fmStyleDropDownList 'Запрет ввода данных
End Sub
Sotrudniki.Style = fmStyleDropDownList - именно эта надпись позволяет запретить ввод данных в ComboBox.
Ну вот, теперь мы можем создать свой собственный выпадающий список, обработать выбранные данные и поставить запрет на ввод данных в ComboBox.
Ускоряем работу макроса в Excel
Чем больше познаём мы макросы, тем интересней выгледят наши программы. А бывает, что их выполнение происходит очень долго, при сложных и долгих математических расчётах или составлении каких-то отчётов и табилц. В ходе выполнения макроса на мониторе происходит мелькание различных окон, открытие и закрытие книг, и прочая светомузыка. Для того чтобы этого не происходило, и чтобы время выполнение нашего макроса сократить раз в 100, можно воспользоваться командами описанные ниже.
Application.ScreenUpdating
Application.ScreenUpdating - отвечает за обновление экрана и может принимать два значения - False (обновление экрана отключено) и True (обновление экрана включено). В коде это обычно прописывается в том месете, где происходит мелькание различных окон или видно как производится расчёт и происходит заполнение таблицы. Ниже показан пример заполнения ячеек, и данную команду вставили в начало и конец макроса, т.е. сначала отключаем обновление экрана, а потом включаем обновление экрана. При такой записи мы не увидим процесс заполнения ячеек. А вот если убрать эти команды, то мы сможем наблюдать за процессом заполнения этих ячеек.
Sub Primer()
Application.ScreenUpdating = False
For a = 1 To 100
For b = 1 To 100
Cells(a, b) = "Пример"
Next b
Next a
Application.ScreenUpdating = True
End Sub
Application.Calculation
Application.Calculation - отвечает за автоматический расчёт в книге Excel и может принимать два значения - xlCalculationManual(ручной расчёт) и xlCalculationAutomatic (автоматический расчёт - по умолчанию установлен в Excel). Но тут есть одна осторожность, если вы перевели Excel в ручной расчёт, и в макросе произошла ошибка и он так и не выполнился до конца - т.е. не включился автоматический расчёт формул, то все ваши вычисления в дальнейшем будут в пустую. Так как формулы не будут автоматически пересчитываться, Excel превратиться в обычную таблицу. Но данная команда играет одну из основных ролей в быстроте выполнеия макроса. Вообщем лучше сделать код, который исключает ошибки, чтобы макрос полюбому выполнился и Excel перевёлся в автоматический расчёт. Если у Вас имеется большая таблица с многочисленными формулами, и часть вычислений вы производите при помощи макросов, то для быстроты выполнения расчётов разумно в начало и конец кода поместить команду Application.Calculation.
Sub Primer2()
Application.Calculation = xlCalculationManual
...................
...................
...................
Application.Calculation = xlCalculationAutomatic
End Sub
Application.EnableEvents
Application.EnableEvents - команда отвечающая за выполнение сторонних событий. Эту команду мы уже затрагивали в этом уроке. И она также может принимать два значения - это False (отключить собтие) и True (включить выполнение промежуточных событий). Но теперь ещё известно, что она играет значительную роль в скорости выполнения некоторых кодов макроса. Пример можно взять из Урока №23.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.EnableEvents = False
Target.Cells = "Привет"
Application.EnableEvents = True
End Sub
ActiveSheet.DisplayPageBreaks
ActiveSheet.DisplayPageBreaks - отображение границ листа. Может принимать два значения - False (отключить отображение границ) и True (включить отображение границ). Не знаю как это помогает на скорости выполнения макроса, лично я этого не ущутил, но некоторые говорят, что помогает. Я вообще не люблю когда отображаются границы листа, мне кажется, что это нужно только при распечатке. Помещать этот код можно в начало и конец макроса.
Private Sub Worksheet_Change(ByVal Target As Range)
ActiveSheet.DisplayPageBreaks = False
.........................
.........................
.........................
ActiveSheet.DisplayPageBreaks = True
End Sub
Application.DisplayStatusBar
Application.DisplayStatusBar - строка состояния. Может принимать два значения - False (отключить строку состояния) и True (включить строку состояния). При выполнении макросов в строке состояния отображаются все происходяще события. Для того чтобы не тратить время на просчёт событий и прорисовку их в статусбаре, отключаем её на время выполнения макроса, и включаем её когда макрос закончил выполняться.
Private Sub Worksheet_Change(ByVal Target As Range)
Application.DisplayStatusBar = False
.........................
.........................
.........................
Application.DisplayStatusBar = True
End Sub
Application.DisplayAlerts
Application.DisplayAlerts - команда отвечающая за события в Excel. Может принимать два значения - False (отключаем запросы Excel) и True (включаем события Excel). Это чень интересная и полезная команда при помощи которой можно отключить запросы Excel, например, чтобы он не спрашивал нужно ли сохранить изменения в книге, или отключить запрос на совместимость версий Excel. Ниже приведён пример, в котором книга закрывает сама себя, при этом независимо от того внесли вы изменения или нет в книгу, при закрытии книги вам не поступит запрос "Сохранить изменения", а книга просто закроется без сохранения и уведомления пользователя.
Sub Primer()
Application.DisplayAlerts = False
ThisWorkbook.Close
Application.DisplayAlerts = True
End Sub
