Разширено VBA ръководство за MS Excel

Ако тепърва започвате с VBA , тогава ще искате да започнете да изучавате нашето ръководство за VBA за начинаещи(VBA guide for beginners) . Но ако сте опитен VBA експерт и търсите по-усъвършенствани неща, които можете да правите с VBA в Excel , тогава продължете да четете.

Възможността за използване на VBA кодиране в Excel отваря цял свят на автоматизация. Можете да автоматизирате изчисленията в Excel , бутони и дори да изпращате имейли. Има повече възможности за автоматизиране на ежедневната ви работа с VBA , отколкото предполагате.

Разширено ръководство за VBA за Microsoft Excel(Advanced VBA Guide For Microsoft Excel)

Основната цел на писането на VBA код в Excel е така, че можете да извличате информация от електронна таблица, да извършвате различни изчисления върху нея и след това да записвате резултатите обратно в електронната таблица

По-долу са най-честите употреби на VBA в Excel .

  • Импортирайте(Import) данни и извършвайте изчисления
  • Изчислете(Calculate) резултати от натискане на бутон от потребител
  • Изпращане(Email) на резултатите от изчисленията на някого

С тези три примера би трябвало да можете да напишете разнообразие от свой собствен усъвършенстван 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 файла са импортирани във вашата празна електронна таблица, в 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 , като използвате същата процедура по-горе. Кодът за този бутон ще включва използване на обекта CDO на Excel(Excel CDO) за конфигуриране на настройките за SMTP имейл и изпращане на резултатите по имейл в четим от потребителя формат.

За да активирате тази функция, трябва да изберете Инструменти и препратки(Tools and References) . Превъртете надолу до Microsoft CDO за Windows 2000 Library(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 и (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

Аз съм компютърен професионалист с над 10 години опит. В свободното си време обичам да помагам на бюрото в офиса и да уча децата как да използват интернет. Моите умения включват много неща, но най-важното е, че знам как да помагам на хората да решават проблеми. Ако имате нужда от някой, който може да ви помогне с нещо спешно или просто искате някои основни съвети, моля, свържете се с мен!



Related posts