Расширенное руководство по VBA для MS Excel

Если вы только начинаете работать с VBA , вам следует начать с изучения нашего руководства по VBA для начинающих(VBA guide for beginners) . Но если вы опытный специалист по VBA и ищете более продвинутые возможности VBA в Excel , продолжайте читать.

Возможность использовать кодирование VBA в (VBA)Excel открывает целый мир автоматизации. Вы можете автоматизировать вычисления в Excel , кнопки и даже отправлять электронную почту. Существует больше возможностей для автоматизации вашей повседневной работы с VBA , чем вы можете себе представить.

Расширенное руководство по VBA для Microsoft Excel(Advanced VBA Guide For Microsoft Excel)

Основная цель написания кода VBA в (VBA)Excel состоит в том, чтобы вы могли извлекать информацию из электронной таблицы, выполнять над ней различные вычисления, а затем записывать результаты обратно в электронную таблицу.

Ниже приведены наиболее распространенные варианты использования VBA в Excel .

  • Импорт(Import) данных и выполнение расчетов
  • Вычислять(Calculate) результаты нажатия пользователем кнопки
  • Отправить(Email) результаты расчета по электронной почте кому-либо

С этими тремя примерами вы сможете написать собственный расширенный код VBA для Excel .(Excel VBA)

Импорт данных и выполнение расчетов(Importing Data and Performing Calculations)

Одна из самых распространенных задач, для которых люди используют Excel , — это выполнение вычислений с данными, существующими вне Excel . Если вы не используете VBA , это означает, что вам нужно вручную импортировать данные, выполнить вычисления и вывести эти значения на другой лист или отчет.

С помощью VBA вы можете автоматизировать весь процесс. Например, если у вас есть новый CSV - файл, загружаемый в каталог на вашем компьютере каждый понедельник(Monday) , вы можете настроить свой код VBA для запуска при первом открытии электронной таблицы во вторник(Tuesday) утром.

Следующий код импорта запустится и импортирует CSV - файл в электронную таблицу Excel .

Dim ws As Worksheet, strFile As String

Set ws = ActiveWorkbook.Sheets("Sheet1")
Cells.ClearContents

strFile = “c:\temp\purchases.csv”

With ws.QueryTables.Add(Connection:="TEXT;" & strFile, Destination:=ws.Range("A1"))
     .TextFileParseType = xlDelimited
     .TextFileCommaDelimiter = True
     .Refresh
End With

Откройте инструмент редактирования Excel VBA и выберите объект Sheet1 . В раскрывающихся списках объектов и методов выберите Worksheet и Activate . Это будет запускать код каждый раз, когда вы открываете электронную таблицу.

Это создаст функцию Sub Worksheet_Activate() . Вставьте приведенный выше код в эту функцию.

Это устанавливает активный рабочий лист в Sheet1 , очищает лист, подключается к файлу, используя путь к файлу, который вы определили с помощью переменной strFile , а затем цикл With проходит через каждую строку в файле и помещает данные в лист, начиная с ячейки A1. .

Если вы запустите этот код, вы увидите, что данные файла CSV импортируются в вашу пустую электронную таблицу в (CSV)Sheet1 .

Импорт — это только первый шаг. Затем вы хотите создать новый заголовок для столбца, который будет содержать результаты ваших вычислений. В этом примере предположим, что вы хотите рассчитать 5% налогов, уплачиваемых при продаже каждого товара.

Порядок действий, который должен выполнять ваш код, следующий:

  1. Создайте новый столбец результатов под названием налоги(taxes) .
  2. Прокрутите столбец проданных единиц(units sold) и рассчитайте налог с продаж.
  3. Запишите результаты расчета в соответствующую строку листа.

Следующий код выполнит все эти шаги.

Dim LastRow As Long
Dim StartCell As Range
Dim rowCounter As Integer
Dim rng As Range, cell As Range
Dim fltTax As Double

Set StartCell = Range("A1")

'Find Last Row and Column
LastRow = ws.Cells(ws.Rows.Count, StartCell.Column).End(xlUp).Row
Set rng = ws.Range(ws.Cells(2, 4), ws.Cells(LastRow, 4))

rowCounter = 2
Cells(1, 5) = "taxes"

For Each cell In rng
fltTax = cell.Value * 0.05
Cells(rowCounter, 5) = fltTax
rowCounter = rowCounter + 1
Next cell

Этот код находит последнюю строку в вашем листе данных, а затем устанавливает диапазон ячеек (столбец с продажными ценами) в соответствии с первой и последней строкой данных. Затем код перебирает каждую из этих ячеек, выполняет расчет налога и записывает результаты в новый столбец (столбец 5).

Вставьте приведенный выше код VBA под предыдущим кодом и запустите скрипт. Вы увидите результаты в столбце E.

Теперь каждый раз, когда вы открываете рабочий лист Excel , он автоматически выходит и получает самую свежую копию данных из файла CSV . Затем он выполнит расчеты и запишет результаты на лист. Вам больше не нужно ничего делать вручную!

Рассчитать результаты нажатия кнопки(Calculate Results From Button Press)

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

Кнопки управления(Control) полезны, если вы хотите управлять используемыми вычислениями. Например, в том же случае, что и выше, что, если вы хотите использовать ставку налога 5% для одного региона и ставку налога 7% для другого?

Вы можете разрешить автоматический запуск того же кода импорта CSV , но оставить код расчета налога для запуска при нажатии соответствующей кнопки.

Используя ту же электронную таблицу, что и выше, выберите вкладку « Разработчик(Developer) » и выберите « Вставить(Insert) » в группе « Элементы управления(Controls) » на ленте. Выберите кнопку (push button) ActiveX Control в раскрывающемся меню.

Нарисуйте кнопку в любой части листа, вдали от места, где будут храниться данные.

Щелкните правой кнопкой мыши кнопку и выберите « Свойства(Properties) » . В окне « Свойства(Properties) » измените заголовок на то, что вы хотите отобразить для пользователя. В этом случае это может быть Calculate 5% Tax .

Вы увидите этот текст, отраженный на самой кнопке. Закройте окно свойств(properties) и дважды щелкните саму кнопку. Это откроет окно редактора кода, а ваш курсор окажется внутри функции, которая запустится, когда пользователь нажмет кнопку.

Вставьте код расчета налога из раздела выше в эту функцию, сохраняя множитель налоговой ставки равным 0,05. Не забудьте включить следующие 2 строки, чтобы определить активный лист.

Dim ws As Worksheet, strFile As String

Set ws = ActiveWorkbook.Sheets("Sheet1")

Теперь повторите процесс еще раз, создав вторую кнопку. Сделайте заголовок « Calculate 7% Tax .

Дважды щелкните(Double-click) эту кнопку и вставьте тот же код, но сделайте налоговый множитель равным 0,07.

Теперь, в зависимости от того, какую кнопку вы нажмете, столбец налогов будет рассчитываться соответствующим образом.

Когда вы закончите, обе кнопки появятся на вашем листе. Каждый из них инициирует отдельный расчет налога и запишет разные результаты в столбец результатов. 

Чтобы отправить текст, выберите меню « Разработчик(Developer) » и выберите « Режим дизайна»(Design Mode) в группе « Элементы управления(Controls) » на ленте, чтобы отключить режим « Режим дизайна»(Design Mode) . Это активирует кнопки. 

Попробуйте выбрать каждую кнопку, чтобы увидеть, как изменится столбец результатов «налоги».

Отправить результаты расчета по электронной почте кому-либо(Email Calculation Results to Someone)

Что делать, если вы хотите отправить результаты в электронной таблице кому-то по электронной почте?

Вы можете создать еще одну кнопку под названием « Отправить лист электронной почты боссу(Email Sheet to Boss) », используя ту же процедуру, что и выше. Код для этой кнопки будет включать использование объекта Excel CDO для настройки параметров электронной почты (Excel CDO)SMTP и отправку результатов по электронной почте в удобном для пользователя формате.

Чтобы включить эту функцию, вам нужно выбрать « Инструменты и ссылки(Tools and References) » . Прокрутите вниз до Microsoft CDO для библиотеки Windows 2000(Microsoft CDO for Windows 2000 Library) , включите ее и нажмите OK .

Есть три основных раздела кода, который вам нужно создать, чтобы отправить электронное письмо и встроить результаты электронной таблицы.

Первый — настройка переменных для хранения темы, адресов « Кому» и « От кого» и тела письма.(From)

Dim CDO_Mail As Object
Dim CDO_Config As Object
Dim SMTP_Config As Variant
Dim strSubject As String
Dim strFrom As String
Dim strTo As String
Dim strCc As String
Dim strBcc As String
Dim strBody As String
Dim LastRow As Long
Dim StartCell As Range
Dim rowCounter As Integer
Dim rng As Range, cell As Range
Dim fltTax As Double
Set ws = ActiveWorkbook.Sheets("Sheet1")
strSubject = "Taxes Paid This Quarter"
strFrom = "[email protected]"
strTo = "[email protected]"
strCc = ""
strBcc = ""
strBody = "The following is the breakdown of taxes paid on sales this quarter."

Конечно, тело должно быть динамическим в зависимости от того, какие результаты находятся на листе, поэтому здесь вам нужно добавить цикл, который проходит через диапазон, извлекает данные и записывает строку за раз в тело.

Set StartCell = Range("A1")

'Find Last Row and Column
LastRow = ws.Cells(ws.Rows.Count, StartCell.Column).End(xlUp).Row
Set rng = ws.Range(ws.Cells(2, 4), ws.Cells(LastRow, 4))

rowCounter = 2
strBody = strBody & vbCrLf

For Each cell In rng
     strBody = strBody & vbCrLf
     strBody = strBody & "We sold " & Cells(rowCounter, 3).Value & " of " & Cells(rowCounter, 1).Value _
     & " for " & Cells(rowCounter, 4).Value & " and paid taxes of " & Cells(rowCounter, 5).Value & "."
     rowCounter = rowCounter + 1
Next cell

Следующий раздел посвящен настройке параметров SMTP , чтобы вы могли отправлять электронную почту через свой SMTP - сервер. Если вы используете Gmail , это обычно ваш адрес электронной почты Gmail , ваш пароль Gmail и (Gmail)SMTP(Gmail SMTP) - сервер Gmail (smtp.gmail.com).

Set CDO_Mail = CreateObject("CDO.Message") 
On Error GoTo Error_Handling
Set CDO_Config = CreateObject("CDO.Configuration")
CDO_Config.Load -1
Set SMTP_Config = CDO_Config.Fields

With SMTP_Config
.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "smtp.gmail.com"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = 1
.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "[email protected]"
.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "password"
.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 465
.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = True
 .Update
End With

With CDO_Mail
     Set .Configuration = CDO_Config
End With

Замените [email protected] и пароль своими данными учетной записи.

Наконец, чтобы инициировать отправку электронной почты, вставьте следующий код.

CDO_Mail.Subject = strSubject
CDO_Mail.From = strFrom
CDO_Mail.To = strTo
CDO_Mail.TextBody = strBody
CDO_Mail.CC = strCc
CDO_Mail.BCC = strBcc
CDO_Mail.Send

Error_Handling:
If Err.Description <> "" Then MsgBox Err.Description

Примечание(Note) . Если вы видите ошибку транспорта при попытке запустить этот код, скорее всего, ваша учетная запись Google блокирует запуск «менее безопасных приложений». Вам нужно будет посетить страницу настроек менее безопасных приложений(less secure apps settings page) и включить эту функцию.

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

Как видите, многое можно автоматизировать с помощью Excel VBA . Попробуйте поэкспериментировать с фрагментами кода, о которых вы узнали из этой статьи, и создайте свои собственные уникальные средства автоматизации VBA .



About the author

Я разработчик бесплатного программного обеспечения и сторонник Windows Vista/7. Я написал несколько сотен статей на различные темы, связанные с операционной системой, включая советы и рекомендации, руководства по ремонту и рекомендации. Я также предлагаю консультационные услуги, связанные с офисом, через мою компанию Help Desk Services. Я хорошо понимаю, как работает Office 365, его функции и способы их наиболее эффективного использования.



Related posts