Работа с текстом в коде VBA Excel. Функции, оператор &
и другие ключевые слова для работы с текстом. Примеры использования некоторых функций и ключевых слов.
Функции для работы с текстом
Основные функции для работы с текстом в VBA Excel:
Функция | Описание |
---|---|
Asc(строка) | Возвращает числовой код символа, соответствующий первому символу строки. Например: MsgBox Asc(«/Stop»). Ответ: 47, что соответствует символу «/». |
Chr(код символа) | Возвращает строковый символ по указанному коду. Например: MsgBox Chr(47). Ответ: «/». |
Format(Expression, [FormatExpression], [FirstDayOfWeek], [FirstWeekOfYear]) | Преобразует число, дату, время в строку (тип данных Variant (String)), отформатированную в соответствии с инструкциями, включенными в выражение формата. Подробнее… |
InStr([начало], строка1, строка2, [сравнение]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с начала строки. Подробнее… |
InstrRev(строка1, строка2, [начало, [сравнение]]) | Возвращает порядковый номер символа, соответствующий первому вхождению одной строки (строка2) в другую (строка1) с конца строки. Подробнее… |
Join(SourceArray,[Delimiter]) | Возвращает строку, созданную путем объединения нескольких подстрок из массива. Подробнее… |
LCase(строка) | Преобразует буквенные символы строки в нижний регистр. |
Left(строка, длина) | Возвращает левую часть строки с заданным количеством символов. Подробнее… |
Len(строка) | Возвращает число символов, содержащихся в строке. |
LTrim(строка) | Возвращает строку без начальных пробелов (слева). Подробнее… |
Mid(строка, начало, [длина]) | Возвращает часть строки с заданным количеством символов, начиная с указанного символа (по номеру). Подробнее… |
Replace(expression, find, replace, [start], [count], [compare]) | Возвращает строку, полученную в результате замены одной подстроки в исходном строковом выражении другой подстрокой указанное количество раз. Подробнее… |
Right(строка, длина) | Возвращает правую часть строки с заданным количеством символов. Подробнее… |
RTrim(строка) | Возвращает строку без конечных пробелов (справа). Подробнее… |
Space(число) | Возвращает строку, состоящую из указанного числа пробелов. Подробнее… |
Split(Expression,[Delimiter],[Limit],[Compare]) | Возвращает одномерный массив подстрок, извлеченных из указанной строки с разделителями. Подробнее… |
StrComp(строка1, строка2, [сравнение]) | Возвращает числовое значение Variant (Integer), показывающее результат сравнения двух строк. Подробнее… |
StrConv(string, conversion) | Изменяет регистр символов исходной строки в соответствии с заданным параметром «conversion». Подробнее… |
String(число, символ) | Возвращает строку, состоящую из указанного числа символов. В выражении «символ» может быть указан кодом символа или строкой, первый символ которой будет использован в качестве параметра «символ». Подробнее… |
StrReverse(строка) | Возвращает строку с обратным порядком следования знаков по сравнению с исходной строкой. Подробнее… |
Trim(строка) | Возвращает строку без начальных (слева) и конечных (справа) пробелов. Подробнее… |
UCase(строка) | Преобразует буквенные символы строки в верхний регистр. |
Val(строка) | Возвращает символы, распознанные как цифры с начала строки и до первого нецифрового символа, в виде числового значения соответствующего типа. Подробнее… |
WorksheetFunction.Trim(строка) | Функция рабочего листа, которая удаляет все лишние пробелы (начальные, конечные и внутренние), оставляя внутри строки одиночные пробелы. |
В таблице перечислены основные функции VBA Excel для работы с текстом. С полным списком всевозможных функций вы можете ознакомиться на сайте разработчика.
Ключевые слова для работы с текстом
Ключевое слово | Описание |
---|---|
& | Оператор & объединяет два выражения (результат = выражение1 & выражение2). Если выражение не является строкой, оно преобразуется в Variant (String), и результат возвращает значение Variant (String). Если оба выражения возвращают строку, результат возвращает значение String. |
vbCrLf | Константа vbCrLf сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит последующий текст на новую строку (результат = строка1 & vbCrLf & строка2). |
vbNewLine | Константа vbNewLine в VBA Excel аналогична константе vbCrLf, также сочетает в себе возврат каретки и перевод строки (Chr(13) + Chr(10)) и переносит текст на новую строку (результат = строка1 & vbNewLine & строка2). |
Примеры
Вывод прямых парных кавычек
Прямые парные кавычки в VBA Excel являются спецсимволами и вывести их, заключив в самих себя или в одинарные кавычки (апострофы), невозможно. Для этого подойдет функция Chr:
Sub Primer1() ‘Вывод одной прямой парной кавычки MsgBox Chr(34) ‘Отображение текста в прямых кавычках MsgBox Chr(34) & «Волга» & Chr(34) ‘Вывод 10 прямых парных кавычек подряд MsgBox String(10, Chr(34)) End Sub |
Смотрите интересное решение по выводу прямых кавычек с помощью прямых кавычек в первом комментарии.
Отображение слов наоборот
Преобразование слова «налим» в «Милан»:
Sub Primer2() Dim stroka stroka = «налим» stroka = StrReverse(stroka) ‘милан stroka = StrConv(stroka, 3) ‘Милан MsgBox stroka End Sub |
или одной строкой:
Sub Primer3() MsgBox StrConv(StrReverse(«налим»), 3) End Sub |
Преобразование слова «лето» в «отель»:
Sub Primer4() Dim stroka stroka = «лето» stroka = StrReverse(stroka) ‘отел stroka = stroka & «ь» ‘отель MsgBox stroka End Sub |
или одной строкой:
Sub Primer5() MsgBox StrReverse(«лето») & «ь» End Sub |
Печатная машинка
Следующий код VBA Excel в замедленном режиме посимвольно печатает указанную строку на пользовательской форме, имитируя печатную машинку.
Для реализации этого примера понадобится пользовательская форма (UserForm1) с надписью (Label1) и кнопкой (CommandButton1):
Код имитации печатной машинки состоит из двух процедур, первая из которых замедляет выполнение второй, создавая паузу перед отображением очередного символа, что и создает эффект печатающей машинки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
Sub StopSub(Pause As Single) Dim Start As Single Start = Timer Do While Timer < Start + Pause DoEvents Loop End Sub Private Sub CommandButton1_Click() Dim stroka As String, i As Byte stroka = «Печатная машинка!» Label1.Caption = «» For i = 1 To Len(stroka) Call StopSub(0.25) ‘пауза в секундах ‘следующая строка кода добавляет очередную букву Label1.Caption = Label1.Caption & Mid(stroka, i, 1) Next End Sub |
Обе процедуры размещаются в модуле формы. Нажатие кнопки CommandButton1 запустит замедленную печать символов в поле надписи, имитируя печатную машинку.
Текст — это функция рабочего листа в Excel, но ее также можно использовать в VBA при использовании свойства диапазона. Эта функция похожа на функцию Worksheet и принимает такое же количество аргументов, которые представляют собой значения, которые необходимо преобразовать, и указанный числовой формат.
Оглавление
- Текстовая функция Excel VBA
- Примеры текстовой функции VBA в Excel
- Пример №1
- Пример #2
- Применить форматирование к ячейкам
- Рекомендуемые статьи
- Примеры текстовой функции VBA в Excel
Текстовая функция Excel VBA
ТЕКСТ — это функция, доступная на рабочем листе, но, к сожалению, это не встроенная функция в Excel VBA. Вместо этого нам нужно использовать объект класса функции рабочего листа в VBA для доступа к этой функции. Текст функция в экселе преобразует значение в указанный числовой формат.
Одна из проблем с этой функцией — аргументы. Всякий раз, когда мы используем функцию рабочего листа VBAФункция рабочего листа VBAФункция рабочего листа в VBA используется, когда нам нужно сослаться на конкретный рабочий лист. Когда мы создаем модуль, код запускается на текущем активном листе рабочей книги, но мы можем использовать функцию рабочего листа для запуска кода в определенном классе рабочего листа.Читать далее, мы не видим четкого синтаксиса. как в нашем рабочем листе. Вместо этого он просто говорит «Arg1» и «Arg2».
Примеры текстовой функции VBA в Excel
Ниже приведены примеры функций Excel VBA TEXT.
.free_excel_div{фон:#d9d9d9;размер шрифта:16px;радиус границы:7px;позиция:относительная;margin:30px;padding:25px 25px 25px 45px}.free_excel_div:before{content:»»;фон:url(центр центр без повтора #207245;ширина:70px;высота:70px;позиция:абсолютная;верх:50%;margin-top:-35px;слева:-35px;граница:5px сплошная #fff;граница-радиус:50%} Вы можете скачать этот текстовый шаблон VBA Excel здесь — Текстовый шаблон VBA Excel
Пример №1
Позвольте мне показать вам простой пример TEXT в VBA Excel. Но сначала взгляните на приведенный ниже код в Visual BasicCode. В Visual Basic код VBA относится к набору инструкций, написанных пользователем на языке программирования приложений Visual Basic в редакторе Visual Basic (VBE) для выполнения определенной задачи. Подробнее.
Код:
Sub Text_Example1() Dim FormattingValue As String Dim FormattingResult As String FormattingValue = 0,564 FormattingResult = WorksheetFunction.Text(FormattingValue, «hh:mm:ss AM/PM») MsgBox FormattingResult End Sub
Во-первых, мы объявили две переменные в виде строки в VBA.
Dim FormattingValue As String Dim FormattingResult As String
Для первой переменной мы присвоили номер форматирования, который нам нужно отформатировать.
Значение форматирования = 0,564
Теперь для другой переменной мы назначили функцию ТЕКСТ.
FormattingResult = WorksheetFunction.Text(FormattingValue, «чч:мм:сс AM/PM»)
Если вы заметили, мы применили форматирование времени, то есть «чч:мм:сс AM/PM».
Затем, наконец, мы применили окно сообщения VBA. Функция VBA MsgBox — это функция вывода, которая отображает обобщенное сообщение, предоставленное разработчиком. Этот оператор не имеет аргументов, и персонализированные сообщения в этой функции записываются в двойных кавычках, а для значений предоставляется ссылка на переменную. Подробнее, чтобы показать результат.
MsgBox ФорматированиеРезультат
Когда мы запустим функцию кода ТЕКСТ, мы применим формат времени к числу 0,564 и отобразим результат ниже.
Итак, мы получили время как «13:32:10».
Пример #2
Как и в примере с форматом даты, в этом примере мы внесли небольшие изменения. Ниже приведен код.
Код:
Sub Text_Example2() Dim FormattingValue As String Dim FormattingResult As String FormattingValue = 43585 FormattingResult = WorksheetFunction.Text(FormattingValue, «DD-MMM-YYYY») MsgBox FormattingResult End Sub
Из предыдущего кода мы изменили значение форматирования с 0,565 на 43585 и изменили стиль форматирования на «ДД-МММ-ГГГГ».
Он применит форматирование к числу 43585 в качестве даты, и результат будет следующим.
Применить форматирование к ячейкам
Мы видели простые примеры. Теперь посмотрим, как работать с ячейками на листе. Для этого примера посмотрите на данные ниже.
Для всех этих чисел нам нужно применить формат времени. Этот код применит форматирование.
Код:
Sub Text_Example3() Dim k As Integer For k = 1 To 10 Cells(k, 2).Value = WorksheetFunction.Text(Cells(k, 1).Value, «hh:mm:ss AM/PM») Next k End Саб
Этот код будет проходить через 10 ячеек и применять форматирование ниже.
Используя функцию VBA TEXT, мы можем применить форматирование чисел к ячейкам.
Рекомендуемые статьи
Эта статья была руководством по текстовой функции VBA. Мы обсудили использование функции «Текст» в Excel VBA и несколько практических примеров. Кроме того, вы можете узнать больше о VBA из следующих статей:
- Объект коллекции VBA
- Текстовое поле в VBA
- Функция InStr в VBA
Text is a worksheet function in Excel, but it can also be used in VBA while using the range property. This function is similar to the Worksheet function and takes the same number of arguments, which are the values one must convert and a specified number format.
Table of contents
- Excel VBA Text Function
- Examples of VBA Text Function in Excel
- Example #1
- Example #2
- Apply Formatting to Cells
- Recommended Articles
- Examples of VBA Text Function in Excel
Excel VBA Text Function
The TEXT is the function available with the worksheet, but unfortunately, it is not a built-in function in Excel VBA. Instead, we need to use the worksheet function class object in VBA to access this function. The TEXT function in Excel converts a value to a specified number format.
One of the problems with this function is arguments. Whenever we use the VBA worksheet functionThe worksheet function in VBA is used when we need to refer to a specific worksheet. When we create a module, the code runs in the currently active sheet of the workbook, but we can use the worksheet function to run the code in a particular worksheet.read more class, we do not get to see the clear-cut syntax much like in our worksheet. Instead, it just says “Arg1” and “Arg2.”
- Arg1 is the value we need to apply the formatting to.
- Arg2 is the formatting we need to apply, and we need to specify the formatting code.
You are free to use this image on your website, templates, etc, Please provide us with an attribution linkArticle Link to be Hyperlinked
For eg:
Source: VBA Text (wallstreetmojo.com)
Examples of VBA Text Function in Excel
Below are examples of Excel VBA TEXT functions.
You can download this VBA Text Excel Template here – VBA Text Excel Template
Example #1
Let me show you a simple example of TEXT in VBA Excel. But, first, look at the below code in Visual BasicVBA code refers to a set of instructions written by the user in the Visual Basic Applications programming language on a Visual Basic Editor (VBE) to perform a specific task.read more.
Code:
Sub Text_Example1() Dim FormattingValue As String Dim FormattingResult As String FormattingValue = 0.564 FormattingResult = WorksheetFunction.Text(FormattingValue, "hh:mm:ss AM/PM") MsgBox FormattingResult End Sub
Firstly, we have declared two variables as a string in VBA.
Dim FormattingValue As String Dim FormattingResult As String
For the first variable, we have assigned the formatting number we need to format.
FormattingValue = 0.564
Now, for another variable, we have assigned the TEXT function.
FormattingResult = WorksheetFunction.Text(FormattingValue, "hh:mm:ss AM/PM")
If you observe, we have applied the formatting of time, i.e., “hh:mm:ss AM/PM.”
Then, finally, we applied a VBA message boxVBA MsgBox function is an output function which displays the generalized message provided by the developer. This statement has no arguments and the personalized messages in this function are written under the double quotes while for the values the variable reference is provided.read more to show the result.
MsgBox FormattingResult
When we run the code TEXT function, we will apply the time format to the number 0.564 and display the result below.
So, we got the time as “01:32:10 PM”.
Example #2
Similar to the date format example, we have made some minor changes in this example. Below is the code.
Code:
Sub Text_Example2() Dim FormattingValue As String Dim FormattingResult As String FormattingValue = 43585 FormattingResult = WorksheetFunction.Text(FormattingValue, "DD-MMM-YYYY") MsgBox FormattingResult End Sub
From the previous code, we have changed the formatting value from 0.565 to 43585 and changed the formatting style to “DD-MMM-YYYY.”
It will apply the formatting to the number 43585 as the date, and the result is as follows.
Apply Formatting to Cells
We have seen simple examples. Now, look at how to work with cells in a worksheet. For this example, look at the below data.
For all these numbers, we need to apply the time format. This code will apply the formatting.
Code:
Sub Text_Example3() Dim k As Integer For k = 1 To 10 Cells(k, 2).Value = WorksheetFunction.Text(Cells(k, 1).Value, "hh:mm:ss AM/PM") Next k End Sub
This code will loop through 10 cells and apply the formatting below.
Using the VBA TEXT function, we can apply number formatting to the cells.
Recommended Articles
This article has been a guide to VBA Text Function. We discussed using the Text function in Excel VBA and some practical examples. Also, you can learn more about VBA from the following articles: –
- VBA Collection Object
- TextBox in VBA
- InStr Function in VBA
Return to VBA Code Examples
This tutorial will demonstrate how to use the Text Function in VBA.
The Text function is used in an Excel worksheet to return a portion of a string in a specified format. The Text function is not a VBA function, but can be used in VBA by referring to the Worksheet Function object.
WorksheetFunction.Text
The syntax in VBA would therefore be as follows:
=WorksheetFunction.Text (Arg1, Arg2)
where Arg1 is the original string and Arg2 is the format of the string we want returned.
Sub TestWSFunction()
Dim dte As String
Dim strD As String
dte = "08/05/2021"
strD= WorksheetFunction.Text(dte, "mmmm")
MsgBox strD
End Sub
In the above example, the string variable dte is storing a date. The Text function then returns the month portion of the date.
Formatting Numbers with the Text Function
We can use the text function to format numbers in our VBA code.
Sub FormatCurrency()
Dim strNum As String
Dim strFormat As String
strNum = "75896.125"
strFormat = WorksheetFunction.Text(strNum, "$#,##0.00")
MsgBox strFormat
End Sub
The string returned in the above example would be $75,896.13.
Other examples of number formatting using the Text Function are:
=WorksheetFunction.Text(75896.125, "0")
this will return: "75896"
=WorksheetFunction.Text(75896.125, "0.0")
this will return: "75896.1"
=WorksheetFunction.Text(75896.125, "#,##0")
this will return: "75,896"
However, Excel does have a built in VBA function that we can use instead of the Text function if we wish to format dates and numbers within VBA. This is known as the Format function.
The VBA Format Function
Taking the example above, rather than using WorksheetFunction.Text, we can just use the Format Function to achieve the same results.
=Format(75896.125, "0")
this will return: "75896"
=Format(75896.125, "0.0")
this will return: "75896.1"
=Format(75896.125, "#,##0")
this will return: "75,896"
Similarly, we can use the Format Function to format date portions of a string.
Sub TestFormatFunction()
Dim dte As String
Dim strD As String
dte = "08/05/2021"
strD= Format(dte, "mmmm")
MsgBox strD
End Sub
VBA Coding Made Easy
Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!
Learn More!
Excel VBA Text Function
VBA Text function is only used in VBA. It seems like it converts the numbers to text. But in reality, it converts numbers to any format like Time, Date or number range. For this, we need to allow this function to enable as Class.
If we see the argument of VBA Text, then we will see it consists of Arg1 and Arg2 as shown below.
- Arg1 – Here we will put the value which we want to convert in the standard format.
- Arg2 – And here we will select the format in which we want to see the output coming as.
Both the variables will be defined as String.
How to Use Excel VBA Text Function?
We will learn how to use a VBA Text function with a few examples in excel.
You can download this VBA Text Excel Template here – VBA Text Excel Template
VBA Text Function – Example #1
We will be converting the text or numbers into the standard format in all the upcoming examples in different ways.
Follow the below steps to use Text function in VBA.
Step 1: Open a Module which is available in the Insert menu tab as shown below.
Step 2: In the opened VBA Module, write the subprocedure of VBA Text as shown below.
Code:
Sub VBA_Text1() End Sub
Step 3: As per the syntax of VBA Text, there are two arguments that we will need. So, define the first variable as String where we will be giving the input as shown below.
Code:
Sub VBA_Text1() Dim Input1 As String End Sub
Step 4: Now define another variable where we will be getting the output. And this would also be as String.
Code:
Sub VBA_Text1() Dim Input1 As String Dim Output As String End Sub
Step 5: Now consider any random number which we need to convert into the standard format. This could be the number which we want to see or it could be any random number. Suppose, if we consider a decimal number 0.123 and see what we would get.
Code:
Sub VBA_Text1() Dim Input1 As String Dim Output As String Input1 = 0.123 End Sub
Step 6: Now in the other defined variable which is Output, we will use it for putting VBA Text. Now, this function will be used as Worksheet function as shown below.
Step 7: Select the VBA Text function from the inbuilt function list. Now as per the syntax we will use our variable and format in which we want to convert that as Arg1 standard format as in which we want to convert that selected number.
Code:
Sub VBA_Text1() Dim Input1 As String Dim Output As String Input1 = 0.123 Output = WorksheetFunction.Text( End Sub
Step 8: In the Arg1 we write the Input1 variable which has our number that we need to convert and Arg2 will be the format as HH:MM:SS AM/PM.
Code:
Sub VBA_Text1() Dim Input1 As String Dim Output As String Input1 = 0.123 Output = WorksheetFunction.Text(Input1, "hh:mm:ss AM/PM") End Sub
Step 9: Now use MsgBox to see what comes as Output.
Code:
Sub VBA_Text1() Dim Input1 As String Dim Output As String Input1 = 0.123 Output = WorksheetFunction.Text(Input1, "hh:mm:ss AM/PM") MsgBox Output End Sub
Step 10: Now run the code by pressing the F5 key or by clicking on the Play Button. We will get the message box with a message as 02:57:07 AM.
We will see another time if we choose some other number.
Step 11: Now let’s change the input number as 12345 and changing the format of output in DD-MMM-YYYY as shown below.
Code:
Sub VBA_Text2() Dim Input1 As String Dim Output As String Input1 = 12345 Output = WorksheetFunction.Text(Input1, "DD-MM-yyyy") MsgBox Output End Sub
Step 12: Now again run the code. We will get the date as 18 Oct 1933
If we know the exact number by which we can get an exact date or time then that will be better.
VBA Text Function – Example #2
There is another direct way to apply VBA Text. For this, we will enter some numbers in the excel sheet as shown below.
Follow the below steps to use Text function in VBA.
Step 1: In a module, write the subcategory of VBA Text as shown below.
Code:
Sub VBA_Text3() End Sub
Step 2: Select the range of cells where we want to see the output. Let’s consider those cells be from B1 to B5.
Code:
Sub VBA_Text3() Range("B1:B5").Value End Sub
Step 3: Now select the range of cells which we need to convert. Here that range is from cell A1 to A5 along with Worksheet function.
Code:
Sub VBA_Text3() Range("B1:B5").Value = Range("A1:A5").Worksheet. End Sub
Step 4: Select the Index function along by evaluating it.
Code:
Sub VBA_Text3() Range("B1:B5").Value = Range("A1:A5").Worksheet.Evaluate("INDEX( End Sub
Step 5: Now consider the Text function and select the range that we need to convert. And the format be in multiple zeros.
Code:
Sub VBA_Text3() Range("B1:B5").Value = Range("A1:A5").Worksheet.Evaluate("INDEX(TEXT(A1:A5,""'000000""),)") End Sub
Step 6: Now run the code by pressing the F5 key or by clicking on the Play Button. We will see the numbers available in column A now got converted into text with multiple zeros which leads to 6 digit numbers in column B.
Now let’s see, what would happen if we change the output format again from leading zeros to time format.
Step 7: In Arg2, put time format as HH:MM:SS and change the output range cell to C1 to C5 without disturbing the output obtained from the previous code.
Code:
Sub VBA_Text3() Range("C1:C5").Value = Range("C1:C5").Worksheet.Evaluate("INDEX(TEXT(A1:A5,""hh:mm:ss""),)") End Sub
Step 8: Again run the code. We will see, column C will get filled with the default time format.
Let’s try another experiment.
Step 9: In this, we will change the output cell range from D1 to D5 where we will see the VBA Text. And change the Arg2, in Date format which is DD-MMM-YYYY as shown below.
Code:
Sub VBA_Text3() Range("D1:D5").Value = Range("D1:D5").Worksheet.Evaluate("INDEX(TEXT(A1:A5,""DD-MMM-YYYY""),)") End Sub
Step 10: Again run the code. This time we will see, the date will be seen in column D. And those dates are in the format that or DD-MMM-YYYY format.
This is how we can change the numbers in any standard format that we want.
Pros & Cons of Excel VBA Text Function
- This is easy to implement.
- We can change the numbers in any format that we want to see.
- We cannot convert any text into the required number format.
Things to Remember
- VBA Text converts only numbers into numbers. But the format of numbers will be the standard formats such as Date, Time, the combination of Date and Time or any digits sequence.
- If you are applying and changing the numbers into a format of preceding zeroes, then put the apostrophe before the zeros. So that numbers will get converted into text and the Zeros will appear.
- If we try to convert any text with VBA Text, then it will give the output as Text only.
- To get the exact output, we must know the combination of numbers which will provide the exact time and date that we want to see.
- Once done, always save the complete code in Macro-Enabled format, so that the code will not be lost.
Recommended Articles
This is a guide to VBA Text Function. Here we discuss how to use Text function in excel VBA along with practical examples and downloadable excel template. You can also go through our other suggested articles –
- VBA RGB
- VBA XML
- VBA Subscript out of Range
- VBA IsError
Время на прочтение
7 мин
Количество просмотров 312K
Приветствую всех.
В этом посте я расскажу, что такое VBA и как с ним работать в Microsoft Excel 2007/2010 (для более старых версий изменяется лишь интерфейс — код, скорее всего, будет таким же) для автоматизации различной рутины.
VBA (Visual Basic for Applications) — это упрощенная версия Visual Basic, встроенная в множество продуктов линейки Microsoft Office. Она позволяет писать программы прямо в файле конкретного документа. Вам не требуется устанавливать различные IDE — всё, включая отладчик, уже есть в Excel.
Еще при помощи Visual Studio Tools for Office можно писать макросы на C# и также встраивать их. Спасибо, FireStorm.
Сразу скажу — писать на других языках (C++/Delphi/PHP) также возможно, но требуется научится читать, изменять и писать файлы офиса — встраивать в документы не получится. А интерфейсы Microsoft работают через COM. Чтобы вы поняли весь ужас, вот Hello World с использованием COM.
Поэтому, увы, будем учить Visual Basic.
Чуть-чуть подготовки и постановка задачи
Итак, поехали. Открываем Excel.
Для начала давайте добавим в Ribbon панель «Разработчик». В ней находятся кнопки, текстовые поля и пр. элементы для конструирования форм.
Появилась вкладка.
Теперь давайте подумаем, на каком примере мы будем изучать VBA. Недавно мне потребовалось красиво оформить прайс-лист, выглядевший, как таблица. Идём в гугл, набираем «прайс-лист» и качаем любой, который оформлен примерно так (не сочтите за рекламу, пожалуйста):
То есть требуется, чтобы было как минимум две группы, по которым можно объединить товары (в нашем случае это будут Тип и Производитель — в таком порядке). Для того, чтобы предложенный мною алгоритм работал корректно, отсортируйте товары так, чтобы товары из одной группы стояли подряд (сначала по Типу, потом по Производителю).
Результат, которого хотим добиться, выглядит примерно так:
Разумеется, если смотреть прайс только на компьютере, то можно добавить фильтры и будет гораздо удобнее искать нужный товар. Однако мы хотим научится кодить и задача вполне подходящая, не так ли?
Кодим
Для начала требуется создать кнопку, при нажатии на которую будет вызываться наша програма. Кнопки находятся в панели «Разработчик» и появляются по кнопке «Вставить». Вам нужен компонент формы «Кнопка». Нажали, поставили на любое место в листе. Далее, если не появилось окно назначения макроса, надо нажать правой кнопкой и выбрать пункт «Назначить макрос». Назовём его FormatPrice. Важно, чтобы перед именем макроса ничего не было — иначе он создастся в отдельном модуле, а не в пространстве имен книги. В этому случае вам будет недоступно быстрое обращение к выделенному листу. Нажимаем кнопку «Новый».
И вот мы в среде разработки VB. Также её можно вызвать из контекстного меню командой «Исходный текст»/«View code».
Перед вами окно с заглушкой процедуры. Можете его развернуть. Код должен выглядеть примерно так:
Sub FormatPrice()End Sub
Напишем Hello World:
Sub FormatPrice()
MsgBox "Hello World!"
End Sub
И запустим либо щелкнув по кнопке (предварительно сняв с неё выделение), либо клавишей F5 прямо из редактора.
Тут, пожалуй, следует отвлечься на небольшой ликбез по поводу синтаксиса VB. Кто его знает — может смело пропустить этот раздел до конца. Основное отличие Visual Basic от Pascal/C/Java в том, что команды разделяются не ;, а переносом строки или двоеточием (:), если очень хочется написать несколько команд в одну строку. Чтобы понять основные правила синтаксиса, приведу абстрактный код.
Примеры синтаксиса
' Процедура. Ничего не возвращает
' Перегрузка в VBA отсутствует
Sub foo(a As String, b As String)
' Exit Sub ' Это значит "выйти из процедуры"
MsgBox a + ";" + b
End Sub' Функция. Вовращает Integer
Function LengthSqr(x As Integer, y As Integer) As Integer
' Exit Function
LengthSqr = x * x + y * y
End FunctionSub FormatPrice()
Dim s1 As String, s2 As String
s1 = "str1"
s2 = "str2"
If s1 <> s2 Then
foo "123", "456" ' Скобки при вызове процедур запрещены
End IfDim res As sTRING ' Регистр в VB не важен. Впрочем, редактор Вас поправит
Dim i As Integer
' Цикл всегда состоит из нескольких строк
For i = 1 To 10
res = res + CStr(i) ' Конвертация чего угодно в String
If i = 5 Then Exit For
Next iDim x As Double
x = Val("1.234") ' Парсинг чисел
x = x + 10
MsgBox xOn Error Resume Next ' Обработка ошибок - игнорировать все ошибки
x = 5 / 0
MsgBox xOn Error GoTo Err ' При ошибке перейти к метке Err
x = 5 / 0
MsgBox "OK!"
GoTo ne
Err:
MsgBox
"Err!"
ne:
On Error GoTo 0 ' Отключаем обработку ошибок
' Циклы бывает, какие захотите
Do While True
Exit DoLoop 'While True
Do 'Until False
Exit Do
Loop Until False
' А вот при вызове функций, от которых хотим получить значение, скобки нужны.
' Val также умеет возвращать Integer
Select Case LengthSqr(Len("abc"), Val("4"))
Case 24
MsgBox "0"
Case 25
MsgBox "1"
Case 26
MsgBox "2"
End Select' Двухмерный массив.
' Можно также менять размеры командой ReDim (Preserve) - см. google
Dim arr(1 to 10, 5 to 6) As Integer
arr(1, 6) = 8Dim coll As New Collection
Dim coll2 As Collection
coll.Add "item", "key"
Set coll2 = coll ' Все присваивания объектов должны производится командой Set
MsgBox coll2("key")
Set coll2 = New Collection
MsgBox coll2.Count
End Sub
Грабли-1. При копировании кода из IDE (в английском Excel) есь текст конвертируется в 1252 Latin-1. Поэтому, если хотите сохранить русские комментарии — надо сохранить крокозябры как Latin-1, а потом открыть в 1251.
Грабли-2. Т.к. VB позволяет использовать необъявленные переменные, я всегда в начале кода (перед всеми процедурами) ставлю строчку Option Explicit. Эта директива запрещает интерпретатору заводить переменные самостоятельно.
Грабли-3. Глобальные переменные можно объявлять только до первой функции/процедуры. Локальные — в любом месте процедуры/функции.
Еще немного дополнительных функций, которые могут пригодится: InPos, Mid, Trim, LBound, UBound. Также ответы на все вопросы по поводу работы функций/их параметров можно получить в MSDN.
Надеюсь, что этого Вам хватит, чтобы не пугаться кода и самостоятельно написать какое-нибудь домашнее задание по информатике. По ходу поста я буду ненавязчиво знакомить Вас с новыми конструкциями.
Кодим много и под Excel
В этой части мы уже начнём кодить нечто, что умеет работать с нашими листами в Excel. Для начала создадим отдельный лист с именем result (лист с данными назовём data). Теперь, наверное, нужно этот лист очистить от того, что на нём есть. Также мы «выделим» лист с данными, чтобы каждый раз не писать длинное обращение к массиву с листами.
Sub FormatPrice()
Sheets("result").Cells.Clear
Sheets("data").Activate
End Sub
Работа с диапазонами ячеек
Вся работа в Excel VBA производится с диапазонами ячеек. Они создаются функцией Range и возвращают объект типа Range. У него есть всё необходимое для работы с данными и/или оформлением. Кстати сказать, свойство Cells листа — это тоже Range.
Примеры работы с Range
Sheets("result").Activate
Dim r As Range
Set r = Range("A1")
r.Value = "123"
Set r = Range("A3,A5")
r.Font.Color = vbRed
r.Value = "456"
Set r = Range("A6:A7")
r.Value = "=A1+A3"
Теперь давайте поймем алгоритм работы нашего кода. Итак, у каждой строчки листа data, начиная со второй, есть некоторые данные, которые нас не интересуют (ID, название и цена) и есть две вложенные группы, к которым она принадлежит (тип и производитель). Более того, эти строки отсортированы. Пока мы забудем про пропуски перед началом новой группы — так будет проще. Я предлагаю такой алгоритм:
- Считали группы из очередной строки.
- Пробегаемся по всем группам в порядке приоритета (вначале более крупные)
- Если текущая группа не совпадает, вызываем процедуру AddGroup(i, name), где i — номер группы (от номера текущей до максимума), name — её имя. Несколько вызовов необходимы, чтобы создать не только наш заголовок, но и всё более мелкие.
- После отрисовки всех необходимых заголовков делаем еще одну строку и заполняем её данными.
Для упрощения работы рекомендую определить следующие функции-сокращения:
Function GetCol(Col As Integer) As String
GetCol = Chr(Asc("A") + Col)
End FunctionFunction GetCellS(Sheet As String, Col As Integer, Row As Integer) As Range
Set GetCellS = Sheets(Sheet).Range(GetCol(Col) + CStr(Row))
End FunctionFunction GetCell(Col As Integer, Row As Integer) As Range
Set GetCell = Range(GetCol(Col) + CStr(Row))
End Function
Далее определим глобальную переменную «текущая строчка»: Dim CurRow As Integer. В начале процедуры её следует сделать равной единице. Еще нам потребуется переменная-«текущая строка в data», массив с именами групп текущей предыдущей строк. Потом можно написать цикл «пока первая ячейка в строке непуста».
Глобальные переменные
Option Explicit ' про эту строчку я уже рассказывал
Dim CurRow As Integer
Const GroupsCount As Integer = 2
Const DataCount As Integer = 3
FormatPrice
Sub FormatPrice()
Dim I As Integer ' строка в data
CurRow = 1
Dim Groups(1 To GroupsCount) As String
Dim PrGroups(1 To GroupsCount) As String
Sheets(
"data").Activate
I = 2
Do While True
If GetCell(0, I).Value = "" Then Exit Do
' ...
I = I + 1
Loop
End Sub
Теперь надо заполнить массив Groups:
На месте многоточия
Dim I2 As Integer
For I2 = 1 To GroupsCount
Groups(I2) = GetCell(I2, I)
Next I2
' ...
For I2 = 1 To GroupsCount ' VB не умеет копировать массивы
PrGroups(I2) = Groups(I2)
Next I2
I = I + 1
И создать заголовки:
На месте многоточия в предыдущем куске
For I2 = 1 To GroupsCount
If Groups(I2) <> PrGroups(I2) Then
Dim I3 As Integer
For I3 = I2 To GroupsCount
AddHeader I3, Groups(I3)
Next I3
Exit For
End If
Next I2
Не забудем про процедуру AddHeader:
Перед FormatPrice
Sub AddHeader(Ty As Integer, Name As String)
GetCellS("result", 1, CurRow).Value = Name
CurRow = CurRow + 1
End Sub
Теперь надо перенести всякую информацию в result
For I2 = 0 To DataCount - 1
GetCellS("result", I2, CurRow).Value = GetCell(I2, I)
Next I2
Подогнать столбцы по ширине и выбрать лист result для показа результата
После цикла в конце FormatPrice
Sheets("Result").Activate
Columns.AutoFit
Всё. Можно любоваться первой версией.
Некрасиво, но похоже. Давайте разбираться с форматированием. Сначала изменим процедуру AddHeader:
Sub AddHeader(Ty As Integer, Name As String)
Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow)).Merge
' Чтобы не заводить переменную и не писать каждый раз длинный вызов
' можно воспользоваться блоком With
With GetCellS("result", 0, CurRow)
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
Select Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
Case 2 ' Производитель
.Font.Size = 12
End Select
.HorizontalAlignment = xlCenter
End With
CurRow = CurRow + 1
End Sub
Уже лучше:
Осталось только сделать границы. Тут уже нам требуется работать со всеми объединёнными ячейками, иначе бордюр будет только у одной:
Поэтому чуть-чуть меняем код с добавлением стиля границ:
Sub AddHeader(Ty As Integer, Name As String)
With Sheets("result").Range("A" + CStr(CurRow) + ":C" + CStr(CurRow))
.Merge
.Value = Name
.Font.Italic = True
.Font.Name = "Cambria"
.HorizontalAlignment = xlCenterSelect Case Ty
Case 1 ' Тип
.Font.Bold = True
.Font.Size = 16
.Borders(xlTop).Weight = xlThick
Case 2 ' Производитель
.Font.Size = 12
.Borders(xlTop).Weight = xlMedium
End Select
.Borders(xlBottom).Weight = xlMedium ' По убыванию: xlThick, xlMedium, xlThin, xlHairline
End With
CurRow = CurRow + 1
End Sub
Осталось лишь добится пропусков перед началом новой группы. Это легко:
В начале FormatPrice
Dim I As Integer ' строка в data
CurRow = 0 ' чтобы не было пропуска в самом начале
Dim Groups(1 To GroupsCount) As String
В цикле расстановки заголовков
If Groups(I2) <> PrGroups(I2) Then
CurRow = CurRow + 1
Dim I3 As Integer
В точности то, что и хотели.
Надеюсь, что эта статья помогла вам немного освоится с программированием для Excel на VBA. Домашнее задание — добавить заголовки «ID, Название, Цена» в результат. Подсказка: CurRow = 0 CurRow = 1.
Файл можно скачать тут (min.us) или тут (Dropbox). Не забудьте разрешить исполнение макросов. Если кто-нибудь подскажет человеческих файлохостинг, залью туда.
Спасибо за внимание.
Буду рад конструктивной критике в комментариях.
UPD: Перезалил пример на Dropbox и min.us.
UPD2: На самом деле, при вызове процедуры с одним параметром скобки можно поставить. Либо использовать конструкцию Call Foo(«bar», 1, 2, 3) — тут скобки нужны постоянно.