Извлечение (вырезание) части строки с помощью кода VBA Excel из значения ячейки или переменной. Функции Left, Mid и Right, их синтаксис и аргументы. Пример.
Эта функция извлекает левую часть строки с заданным количеством символов.
Синтаксис функции Left:
Left(строка, длина)
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается левая часть;
- длина — обязательный аргумент: числовое выражение, указывающее количество извлекаемых символов.
Если аргумент «длина» равен нулю, возвращается пустая строка. Если аргумент «длина» равен или больше длины строки, возвращается строка полностью.
Функция Mid
Эта функция извлекает часть строки с заданным количеством символов, начиная с указанного символа (по номеру).
Синтаксис функции Mid:
Mid(строка, начало, [длина])
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается часть строки;
- начало — обязательный аргумент: числовое выражение, указывающее положение символа в строке, с которого начинается извлекаемая часть;
- длина — необязательный аргумент: числовое выражение, указывающее количество вырезаемых символов.
Если аргумент «начало» больше, чем количество символов в строке, функция Mid возвращает пустую строку. Если аргумент «длина» опущен или его значение превышает количество символов в строке, начиная с начального, возвращаются все символы от начальной позиции до конца строки.
Функция Right
Эта функция извлекает правую часть строки с заданным количеством символов.
Синтаксис функции Right:
Right(строка, длина)
- строка — обязательный аргумент: строковое выражение, из значения которого вырезается правая часть;
- длина — обязательный аргумент: числовое выражение, указывающее количество извлекаемых символов.
Если аргумент «длина» равен нулю, возвращается пустая строка. Если аргумент «длина» равен или больше длины строки, возвращается строка полностью.
Пример
В этом примере будем использовать все три представленные выше функции для извлечения из ФИО его составных частей. Для этого запишем в ячейку «A1» строку «Иванов Сидор Петрович», из которой вырежем отдельные компоненты и запишем их в ячейки «A2:A4».
Sub Primer() Dim n1 As Long, n2 As Long Range(«A1») = «Иванов Сидор Петрович» ‘Определяем позицию первого пробела n1 = InStr(1, Range(«A1»), » «) ‘Определяем позицию второго пробела n2 = InStr(n1 + 1, Range(«A1»), » «) ‘Извлекаем фамилию Range(«A2») = Left(Range(«A1»), n1 — 1) ‘Извлекаем имя Range(«A3») = Mid(Range(«A1»), n1 + 1, n2 — n1 — 1) ‘Извлекаем отчество Range(«A4») = Right(Range(«A1»), Len(Range(«A1»)) — n2) End Sub |
На практике часто встречаются строки с лишними пробелами, которые необходимо удалить перед извлечением отдельных слов.
Содержание
- Mid function
- Syntax
- Remarks
- Example
- See also
- Support and feedback
- Функция Mid
- Синтаксис
- Примечания
- Пример
- См. также
- Поддержка и обратная связь
- VBA Substring – How to Substring in Excel Macro
- LEFT Substring function:
- Examples:
- Right Substring function:
- Example:
- MID Substring function:
- Example:
- SPLIT Substring function:
- Example:
- VBA Substring Macro Example:
- Subscribe and be a part of our 15,000+ member family!
- 2.13.1.5. Примеры использования функций VBA
- 2.13.1.5.1. Удаление ненужных символов
- 2.13.1.5.2. Определение длины строки
- 2.13.1.5.3. Сравнение и поиск строк
- 2.13.1.5.4. Выделение части строки
Mid function
Returns a Variant (String) containing a specified number of characters from a string.
Syntax
The Mid function syntax has these named arguments:
Part | Description |
---|---|
string | Required. String expression from which characters are returned. If string contains Null, Null is returned. |
start | Required; Long. Character position in string at which the part to be taken begins. If start is greater than the number of characters in string, Mid returns a zero-length string («»). |
length | Optional; Variant (Long). Number of characters to return. If omitted or if there are fewer than length characters in the text (including the character at start), all characters from the start position to the end of the string are returned. |
To determine the number of characters in string, use the Len function.
Use the MidB function with byte data contained in a string, as in double-byte character set languages. Instead of specifying the number of characters, the arguments specify numbers of bytes. For sample code that uses MidB, see the second example in the example topic.
Example
The first example uses the Mid function to return a specified number of characters from a string.
The second example use MidB and a user-defined function (MidMbcs) to also return characters from string. The difference here is that the input string is ANSI and the length is in bytes.
See also
Support and feedback
Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.
Источник
Функция Mid
Возвращает значение типа Variant (String), содержащее указанное число символов строки.
Синтаксис
Синтаксис функции Mid состоит из следующих именованных аргументов:
Часть | Описание |
---|---|
строка | Обязательный аргумент. Строковое выражение, из которого возвращаются символы. Если строка содержит значение NULL, возвращается NULL. |
начало | Обязательный аргумент. Long. Позиция символа в строке, с которой начинается забираемая часть. Если значение аргумента начало больше, чем число символов в строке, функция Mid возвращает строку нулевой длины («»). |
длина | Необязательный аргумент. Variant (Long). Число возвращаемых символов. Если не указано или если меньше, чем символов длины в тексте (включая символ в начале), возвращаются все символы от начальной позиции до конца строки. |
Примечания
Чтобы определить число символов в строке, используйте функцию Len.
Используйте функцию MidB для работы с содержащимися в строке байтами, например в языках с двухбайтовыми кодировками (DBCS). Вместо указания числа символов аргументы задают число байтов. Образец кода с использованием функции MidB приведен во втором примере.
Пример
В первом примере с помощью функции Mid возвращается указанное количество знаков строки.
Во втором примере с использованием функции MidB и определяемой пользователем функции (MidMbcs) также возвращаются знаки из строки. Отличие от первого примера состоит в том, что исходная строка представляет собой строку ANSI и ее длина выражена в байтах.
См. также
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Источник
VBA Substring – How to Substring in Excel Macro
Substring is one of the most popular functions in any programming language. It eases your tasks while dealing with strings. As the name suggests a substring function divides a string into different parts based on particular criteria.
There are multiple VBA Substring functions. In practical situations, these substring functions can be quite useful in extracting a portion of a string.
Today in this post I am going to explain all the VBA substring functions that you can use in Excel macros:
Table of Contents
LEFT Substring function:
The LEFT function in Excel VBA is used for fetching a specified number of characters from the start of the string. The syntax of the LEFT function is as follows:
- Here ‘text_string’ refers to an input string that is to be separated.
- And ‘length’ refers to the number of characters to be extracted.
Examples:
Note: Instead of using a hardcoded string in the first argument you can also fetch ‘text_string’ from your excel sheet like ActiveSheet.Range(«A1»).
Right Substring function:
The RIGHT Function in Excel VBA is just opposite to the LEFT function. It returns a specified number of characters from the end of the text string. The syntax of the RIGHT function is as follows:
- Here ‘text_string’ refers to an input string that is to be separated.
- And ‘length’ refers to the number of characters to be extracted but extraction begins from the right side.
Example:
Note: Instead of using a hardcoded string in the first argument you can also fetch ‘text_string’ from your excel sheet as ActiveSheet.Range(«A1»).
MID Substring function:
MID is a much better function than the first two, it gives you the ability to specify the start and end positions of the extracted string. The syntax of the MID VBA Substring function is as under:
- Here ‘text_string’ refers to an input string that is to be separated.
- ‘start_position’ refers to the numeric position from where extraction is to be started.
- And ‘length’ refers to the number of characters to be extracted.
Example:
Note: Instead of using a hardcoded string in the first argument you can also fetch ‘text_string’ from your excel sheet as ActiveSheet.Range(«A1»).
SPLIT Substring function:
The SPLIT function is another VBA function that can be used for sub-stringing or splitting a string. The SPLIT function can come very handy when you are dividing a text string into more than one parts based on a delimiter. The syntax of a split function is as under:
- Here, ‘text_string’ refers to an input string that is to be separated.
- ‘Delimiter’ refers to the delimiter character which separates the string into parts. This is an optional argument, if it is left blank then, the space character » » is assumed to be the default delimiter.
- ‘limit’ refers to the maximum number of substring parts into which the string should be divided. It is also an optional argument, the default value is (-1) which means that substring should happen at every position where the delimiter is encountered.
- ‘compare’ is an optional numerical value that specifies the comparison to use when evaluating substrings.
Example:
For instance, you have a text string as «This is a text string» and now you have to break this string into individual words, so in this case, you will use space » » as a delimiter. The split function will be used as:
The result of this split function is an array of words: «This» «is» «a» «text» «string».
VBA Substring Macro Example:
Below I have created a macro that illustrates all the substring techniques available in VBA programming. This is a simple and self-explanatory macro, in this, I have simply divided a text string with the 4 methods that I have described above.
Below is the code that I have used for this macro:
So, this was all about VBA substring functions. Do share your view related to the topic.
Subscribe and be a part of our 15,000+ member family!
Now subscribe to Excel Trick and get a free copy of our ebook «200+ Excel Shortcuts» (printable format) to catapult your productivity.
Источник
2.13.1.5. Примеры использования функций VBA
2.13.1.5.1. Удаление ненужных символов
Зачастую строки в программе содержат ненужные символы пробелов
в конце или в начале строки, которые необходимо удалить, т.к. посторонние начальные или конечные пробелы в строке могут вызвать «неполадки»
в работе программы. В VBA имеются три функции, предназначенные для удаления начальных и конечных пробелов из строки: LTrim, RTrim, Trim . Эти функции не изменяют исходную строку, а возвращают копию строки с удаленными лишними пробелами.
Dim Стр0, Стр1, Стр2, Стр3 Стр0 = » Строка «
Стр1 = RTrim(Стр0) Стр2 = LTrim(Стр0) Стр3 = Trim(Стр0)
MsgBox «(» & Стр1 & «)» & Chr(13) & _ «(» & Стр2 & «)» & Chr(13) & _
При выполнении этой процедуры выводится диалоговое окно
2.13.1.5.2. Определение длины строки
Длину строки, как правило, надо знать при форматировании сообщений для пользователя или при форматировании строковых данных, вводимых процедурой в рабочий лист Excel или документ Word. VBA для этих целей использует функцию Len . В приведенным ниже листинге между знаками круглых скобок и словом присутствует по два пробела.
Dim Стр0 As String, Стр1 As Byte
Стр1 = Len(Стр0) MsgBox «Стр1=» & Стр1
Строка фиксированной длины имеет всегда одну и ту же длину, и поэтому функция Len всегда возвращает объявленную длину строки, незави-
симо от фактической длины строки. Например, если в строковой переменной фиксированной длины Стр0 определить длину, равную 20 символам, а фактически находится слово «Строка», то функция Len(Стр0) возвратит результат, равный 20.
Dim Стр0 As String * 20, Стр1 As Byte
Стр1 = Len(Стр0) MsgBox «Стр1=» & Стр1
Чтобы в таком случае узнать фактическую длину строки (в нашем случае – 6), необходимо использовать комбинацию функций
Dim Стр0 As String * 20, Стр1 As Byte
Стр1 = Len(Trim(Стр0)) MsgBox «Стр1=» & Стр1
2.13.1.5.3. Сравнение и поиск строк
В VBA имеются две функции, помогающих сравнивать строки:
StrComp и InStr .
StrComp ( String1 , String2 [, Compare ])
где String1 , String2 – любые два строковых выражения, которые необходимо сравнивать. Compare – необязательный аргумент, может быть любой из следующих предопределенных констант:
vbBinaryCompare – бинарное сравнение двух строк;
vbTextCompare – текстовое сравнение двух строк.
При бинарном сравнении коды символов упорядочены в соотвествии с их двоичным значением, и коды строчных и прописных букв раразличаются при сравнении. При текстовом сравнении VBA прописные и строчные буквы не различает. Если аргумент Compare опускается, то используется текущая установка Option Compare.
Если аргумент Compare опускается, то используется текущая установка инструкции Option Compare (см. Примечание к п. Инструкция условного перехода If…Then…Else).
В данном примере инструкция Option Compare используется для задания метода сравнения строковых данных, используемого по умолчанию.
Option compare Binary ‘ т.е. «AAA» Строка1 меньше, чем Строка2 , и поэтому значение R1=–1, во втором они равны (R2=0) и в третьем Строка2 больше, чем Строка1 (R3=1).
Функция InStr дает возможность определить, содержит ли одна строка другую строку.
InStr ([ Start ,] String1 , String2 [, Compare ])
String1, String2 – любые допустимые строковые выражения. Функция проверяет, содержится ли String1 в String2.
Start – необязательный аргумент, является численным выражением и указывает положение символа в String1, с которого должна начинаться проверка. Аргумент Start является обязательным , если указывается аргумент
Compare имеет тот же смысл, что и в функции StrComp .
InStr возвращает число, обозначающее положение символа в String1, где было обнаружено String2. Если InStr не находит String2 в String1, то возвращается 0. Если String1 (или String2) имеет значение Null (“Пусто”), то функция также возвращает Null.
Dim R1 As String, R2 As String R1 = «Строка ввода»
MsgBox «R2 входит в R1 с позиции » & _
InStr(1, R1, R2, vbTextCompare)
2.13.1.5.4. Выделение части строки
Задачу выделения части строки в VBA решают три функции:
Left, Right и Mid .
Left ( String , Length )
String – любое допустимое строковое выражение;
Length – любое численное значение.
Функция возвращает копию String , начиная с первого символа и включая количество символов, заданных с помощью Length . Если Length является числом, большим, чем фактическая длина String , то возвращается всё строковое выражение String .
Right ( String, Length )
String – любое допустимое строковое выражение;
Length – любое численное значение.
Функция возвращает копию String , начиная с последнего символа и включая справа налево количество символов, заданных с помощью Length . Если Length является числом, большим, чем фактическая длина String , то возвращается все строковое выражение String . Функция Right всегда копирует символы от конца строки к ее началу.
Mid ( String , Start , [, Length ])
String – любое допустимое строковое выражение;
Length, Star t – любые численные значения.
Функция Mid возвращает копию String , начиная с положения символа в String , задаваемого с помощью аргумента Start . Необязательный аргу-
Источник
Excel VBA SubString
A SubString is a part of the string or portion, or the character of the string is called “SubString.” There are three types of SubString functions in VBA: LEFT, RIGHT, and MID. They are similar to the worksheet substrings in Excel.
A string is nothing but a series of characters. The characters could be alphabets, numbers, special characters, and combinations.
Often in Excel, when we work with data, which is the string, we need to get only the portion of the string to facilitate our purpose. We may not need the full string to use, but we need only the part of the string for our use. For example, if you have the name “Sachin Tendulkar,” you may need only the first part of the name, i.e., only “Sachin.” It is known as the SubString of the string in Excel VBA. We have built-in functions under the TEXT function in the excelTEXT function in excel is a string function used to change a given input to the text provided in a specified number format. It is used when we large data sets from multiple users and the formats are different.read more category to deal with these strings.
This article will discuss getting the substring from the full string in VBAString functions in VBA do not replace the string; instead, this function creates a new string. There are numerous string functions in VBA, all of which are classified as string or text functions.read more.
Table of contents
- Excel VBA SubString
- How to Use SubString Functions in VBA?
- Example #1 – Using Left Function
- Example #2 – Get SubString from the Right
- Example #3 – Using Instr Function
- Recommended Articles
- How to Use SubString Functions in VBA?
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 SubString (wallstreetmojo.com)
How to Use SubString Functions in VBA?
To extract the substring from the string, we have some of the built-in text functions, and some of the important functions are LEFT, RIGHT, INSTR and MID in excelThe mid function in Excel is a text function that finds strings and returns them from any mid-part of the spreadsheet. read more. The function Instr will serve as the supporting function for the other three functions.
We will see how to use these functions to extract the substrings practically. Please read the below examples to understand them.
You can download this VBA SubString Excel Template here – VBA SubString Excel Template
Example #1 – Using Left Function
If you have the full name as “Sachin Tendulkar” and need only the first name extracted as the substring, use the following code to get the same.
Step 1: Create a macro name and define two variables as a string.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String End Sub
Step 2: Now, assign the name “Sachin Tendulkar” to the variable FullName.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String FullName = "Sachin Tendulkar" End Sub
Step 3: The variable FullName holds the value of “Sachin Tendulkar.” We need to extract the Excel VBA substring of the first name from the full name. So, assign the value for the variable FirstName through the LEFT function.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String FullName = "Sachin Tendulkar" FirstName = Left( End Sub
Step 4: The VBA Excel VBA Left is an inbuilt worksheet text function that facilitates the user to extract a certain number of characters (denoted as N) from the left side of a string. It helps in pulling the leftmost substring from a particular string in the data set.read more LEFT function’s first argument is String. That is what is the full value or full string. In this example, our full value or string is “Sachin Tendulkar,” assigned to the variable FullName.
So supply variable FullName as the argument.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String FullName = "Sachin Tendulkar" FirstName = Left End Sub
Step 5: The next argument is how many characters we need from the supplied string. So, in this case, we need the first name “Sachin,” so totally, we need 6 characters from the left side.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String FullName = "Sachin Tendulkar" FirstName = Left(FullName, 6) End Sub
Step 6: Now, show the result in a message box in VBAVBA 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.
Code:
Sub SubString_Example1() Dim FullName As String Dim FirstName As String FullName = "Sachin Tendulkar" FirstName = Left(FullName, 6) MsgBox FirstName End Sub
Step 7: Run the macro and see the first name as a substring in the message box.
Example #2 – Get SubString from the Right
Like how we have extracted the substring from the left similarly, we can also extract it from the right. Again, take the same name as an example.
Step 1: Define two variables as String.
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String End Sub
Step 2: As usual, assign the value to the variable FullName as “Sachin Tendulkar.”
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String FullName = "Sachin Tendulkar" End Sub
Step 3: Now, for the variable LastName, assign the value through the RIGHT excelRight function is a text function which gives the number of characters from the end from the string which is from right to left. For example, if we use this function as =RIGHT ( “ANAND”,2) this will give us ND as the result.read more function.
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String FullName = "Sachin Tendulkar" LastName = Right( End Sub
Step 4: String is our FullName, so supply the variable.
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String FullName = "Sachin Tendulkar" LastName = Right(FullName, End Sub
Step 5: Length is how many characters we need from the right side. We need 9 characters on the right side.
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String FullName = "Sachin Tendulkar" LastName = Right(FullName, 9) End Sub
Step 6: Show this value in the message box.
Code:
Sub SubString_Example2() Dim FullName As String Dim LastName As String FullName = "Sachin Tendulkar" LastName = Right(FullName, 9) MsgBox LastName End Sub
Step 7: Run the macro. We will see the last name in the message box.
Example #3 – Using Instr Function
In the above examples, we had only one name. So, we have directly supplied how many characters we need from the left and right. But in the case of many names, first name and name characters are not the same. It will differ from name to name. So, in those cases, we cannot supply the number of characters directly so that we can use the function Instr.
The Instr function will return the supplied character position in the string. For example, look at the below code.
Code:
Sub SubString_Example3() Dim Position As String Position = InStr(1, "Sachin", "a") MsgBox Position End Sub
InStr(1, “Sachin,” “a”), this will identify the position of the letter “a” as the first appearance in the string “Sachin.” In this case, the letter “a” is in the second position. So, we will get 2 as a result in the message box.
Like this, we can use the Instr function to find the space character between the first name and last name.
For example, look at the name below in the Excel sheet.
We can extract the substrings using the LEFT, RIGHT, and Instr functions. For example, below is the code to extract the first name.
Code:
Sub FirstName() Dim K As Long Dim LR As Long LR = Cells(Rows.Count, 1).End(xIUp).Row For K = 2 To LR Cells(K, 2).Value = Left(Cells(K, 1).Value, InStr(1, Cells(K, 1).Value, "") - 1) Next K End Sub
Run the macro and see the first name as a substring in the message box.
Use the below code to extract the last name as a substring.
Code:
Sub LastName() Dim K As Long Dim LR As Long LR = Cells(Rows.Count, 1).End(xIUp).Row For K = 2 To LR Cells(K, 3).Value = Right(Cells(K, 1).Value, Len(Cells(K, 1)) - InStr(1, Cells(K, 1).Value, "")) Next K End Sub
Run the macro. We will see the last name in the message box.
We have assigned the macro buttonA Macro is nothing but a line of code to instruct the excel to do a specific task. Once the code is assigned to a button control through VBE you can execute the same task any time in the workbook. By just clicking on the button we can execute hundreds of line, it also automates the complicated Report.read more to the worksheet. Download the workbook and use them.
Recommended Articles
This article has been a guide to VBA Substring. Here, we learn how to extract substring using the Left, Right, and Instr VBA function, examples, and a downloadable Excel template. Below you can find some useful Excel VBA articles: –
- Excel VBA New Line
- VBA Count Function
- Substring Function in Excel
- Excel VBA Replace String
На чтение 12 мин. Просмотров 18.3k.
Функция VBA InStr является одной из наиболее часто используемых функций в VBA. Он используется для нахождения текста внутри строки и действительно отлично справляется с работой.
Тем не менее, она часто используется, чтобы помочь извлечь часть строки, и эту задачу она выполняет плохо.
Если вы обнаружили, что извлечение текста в VBA является болезненным процессом, тогда читайте дальше. Эта статья покажет вам более простой и лучший способ, используя три реальных примера!
Содержание
- Краткое руководство к статье
- Краткая справка
- Введение
- Когда VBA InStr, Left, Right и Mid полезны
- Работа со строками различной длины
- Использование функции VBA InStr с Mid
- Функция Split
- Пример 1: Получение части имени файла
- Пример 2: диапазон IP-адресов
- Пример 3. Проверьте правильность имени файла
- Заключение
Краткое руководство к статье
В следующей таблице приведено краткое руководство к тому, что рассматривается в этой статье.
Строка | Тип | Задача | Как |
1234ABC334 | Фиксированный размер | Оставить слева 4 символа | Left(s,4) |
1234ABC334 | Фиксированный размер | Оставить справа 3 символа |
Right(s,3) |
1234ABC334 | Фиксированный размер | Оставить 5, 6, 7 символы | Mid(s,5,3) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить имя | Split(s,» «)(0) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить отчество |
Split(s,» «)(1) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Split(s,» «)(2) |
«Иван Петрович Сидоров» |
Переменный размер |
Оставить фамилию |
Dim v As Variant v = Split(s, » «) lastname= v(UBound(v)) |
Краткая справка
Чтобы узнать больше об элементах, упомянутых в статье, перейдите по следующим ссылкам:
- Если вы хотите узнать больше о функциях InStr или InStrRev, пожалуйста, прочитайте Поиск в строке.
- Если вы хотите узнать больше о функциях Mid, Left или Right, посмотрите раздел Извлечение части строки.
- Для получения дополнительной информации о функции Split проверьте Строка в массив, используя Split.
- Оператор Like включен в Сравнение строк с шаблоном
Я использую Debug.Print в моих примерах. Он печатает значения в Immediate Window, которое вы можете просмотреть, нажав Ctrl + G (или выберите View-> Immediate Window)
Введение
В этой статье я собираюсь показать вам лучший способ извлечения символов из строки, чем использование функции VBA InStr с Left, Right или Mid.
Эта статья разбита следующим образом:
- Раздел 1: Как извлечь из строк фиксированного размера.
- Раздел 2: Как извлечь из строк переменного размера.
- Раздел 3: Как извлечь из строки переменного размера, используя функцию Split.
- Разделы с 4 по 6: некоторые примеры из реальной жизни.
Когда VBA InStr, Left, Right и Mid полезны
Если вы хотите проверить, содержит ли строка значение, InStr подходит для этой работы. Если вы хотите сделать простое извлечение, то отлично подойдут Left, Right и Mid.
Использование InStr для проверки, содержит ли строка текст
В следующем примере мы проверяем, содержит ли ФИО «Петрович». Если возвращаемое значение InStr больше нуля, то строка содержит значение, которое мы проверяем.
' Проверьте, содержит ли строка Петрович If InStr("Иван Петрович Сидоров", "Петрович") > 0 Then Debug.Print "Найдено" End If
Извлечение с Left, Right и Mid
Функция Left используется для получения символов слева от строки.
Функция Right используется для получения символов справа от строки.
Функция Mid используется для середины строки. Она такая же, как
Left, за исключением того, что вы даете ему стартовую позицию.
Sub IzvlechTekst() Dim s As String: s = "ABCD-7789.WXYZ" Debug.Print Left(s, 2) ' Печатает AB Debug.Print Left(s, 4) ' Печатает ABCD Debug.Print Right(s, 2) ' Печатает YZ Debug.Print Right(s, 4) ' Печатает WXYZ Debug.Print Mid(s, 1, 2) ' Печатает AB Debug.Print Mid(s, 6, 4) ' Печатает 7789 End Sub
Эти три функции работают нормально, если требуемый текст всегда одинакового размера и в одном и том же месте. Для других сценариев они требуют использования InStr, чтобы найти определенную позицию в строке. Это усложняет их использование.
Используйте Left, Right или Mid, когда символы всегда будут в одной и той же позиции.
Работа со строками различной длины
Многие из строк, с которыми вы имеет дело, разной длины. Простой пример — когда у вас есть дело со списком имен. Длина строки и требуемая часть (например, имя) могут каждый раз отличаться. Например:
Brooke Hilt
Pamela Jurado
Zack Kinzel
Eddy Wormley
Kaitlyn Rainer
Jacque Trickett
Kandra Stanbery
Margo Hoppes
Berenice Meier
Garrett Hyre
(Если вам нужен случайный список имен, попробуйте этот генератор случайных имен)
Использование функции VBA InStr с Left
В следующем примере мы собираемся получить имя из строки. В этой строке первое имя — это имя перед первым пробелом.
Мы используем функцию VBA InStr, чтобы получить позицию первого пробела. Мы хотим получить все символы до пробела. Мы вычитаем одну из позиции, так как это дает нам позицию последней буквы имени.
Sub PoluchitImya() Dim s As String, lPosition As Long s = "John Henry Smith" ' Печатает John lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) s = "Lorraine Huggard" ' Печатает Lorraine lPosition = InStr(s, " ") - 1 Debug.Print Left(s, lPosition) End Sub
Давайте посмотрим на первый пример в приведенном выше коде. Первый пробел находится в позиции 5. Мы вычтем 1, что дает нам позицию 4. Это позиция последней буквы John, т.е.
Затем мы даем 4 функции Left, и она возвращает первые четыре символа, например, «John»
Мы можем выполнить ту же задачу в одной строке, передав возвращаемое значение из InStr в функцию Left.
Dim s As String s = "John Henry Smith" ' Печатает John Debug.Print Left(s, InStr(s, " ") - 1)
Использование функции VBA InStr с Right
В этом примере мы получим последнее слово в строке, то есть Smith. Мы можем использовать функцию InStrRev. Это то же самое, что InStr, за исключением того, что поиск выполняется с конца строки.
Важно отметить, что InStrRev дает нам позицию с начала строки. Поэтому нам нужно использовать его немного иначе, чем мы использовали InStr и Left.
Sub PoluchitFamiliyu() Dim s As String: s = "John,Henry,Smith" Dim Position As Long, Length As Long Position = InStrRev(s, ",") Length = Len(s) ' Печатает Smith Debug.Print Right(s, Length - Position) ' Альтернативный метод. Печатает Smith - делает в одну строку Debug.Print Right(s, Len(s) - InStrRev(s, ",")) End Sub
Как работает приведенный выше пример:
- Мы получаем позицию последнего пробела, используя InStrRev: 11
- Мы получаем длину строки: 16.
- Вычитаем позицию из длины: 16-11 = 5
- Мы даем 5 функции Right и возвращаем Smith
Использование функции VBA InStr с Mid
В следующем примере мы получим «Henry» из строки. Слово, которое мы ищем, находится между первым и вторым пробелом.
Мы будем использовать функцию Mid здесь.
Sub PoluchitVtoroeImya() Dim s As String: s = "John Henry Smith" Dim firstChar As Long, secondChar As Long Dim count As Long ' Найти пробел плюс 1. Результат 6 firstChar = InStr(s, " ") + 1 ' Найти 2-й пробел. Результат 11 secondChar = InStr(firstChar, s, " ") ' Получить число символов. Результат 5 count = secondChar - firstChar ' Печатает Henry Debug.Print Mid(s, firstChar, count) End Sub
Как видите, это сложно сделать и требует немного усилий, чтобы выяснить. Нам нужно найти первое место. Тогда нам нужно найти второе место. Затем мы должны вычесть одно из другого, чтобы дать нам количество символов, которые нужно взять.
Если у вас есть строка с большим количеством слов, то это может быть очень сложно. К счастью для нас, гораздо проще было извлечь символы из строки. Это называется функцией Split.
Функция Split
Мы можем использовать функцию Split для выполнения приведенных выше примеров. Функция Split разбивает строку на массив. Тогда мы можем легко получить доступ к каждому элементу.
Давайте попробуем те же три примера еще раз, и на этот раз мы будем использовать Split.
Dim s As String: s = "John Henry Smith" Debug.Print Split(s, " ")(0) ' John Debug.Print Split(s, " ")(1) ' Henry Debug.Print Split(s, " ")(2) ' Smith
Ого! Какая разница с использованием Split. Как это работает:
- Функция Split разбивает строку везде, где есть пробел.
- Каждый элемент помещается в массив, начиная с нуля.
- Используя номер местоположения, мы можем получить доступ к элементу массива.
В следующей таблице показано, как может выглядеть массив после использования Split.
Примечание: первая позиция в массиве равна нулю. Наличие нулевых массивов является стандартным в языках программирования.
0 | 1 | 2 |
John | Henry | Smith |
В приведенном выше коде мы разделяем строку каждый раз, когда ее используем. Мы также можем разделить строку один раз и сохранить ее в переменной массива. Тогда мы можем получить к нему доступ, когда захотим.
Sub SplitName() Dim s As String: s = "John Henry Smith" Dim arr() As String arr = Split(s, " ") Debug.Print arr(0) ' John Debug.Print arr(1) ' Henry Debug.Print arr(2) ' Smith End Sub
Если вы хотите узнать больше о массивах, я написал о них целую статью под названием «Полное руководство по использованию массивов в Excel VBA».
В следующих разделах мы рассмотрим примеры из реальной жизни. Вы увидите преимущество использования Split вместо функции InStr.
Пожалуйста, не стесняйтесь попробовать это сами. Это отличный способ учиться, и вы можете повеселиться, пытаясь понять их (или, может быть, только у меня так!)
Пример 1: Получение части имени файла
Представьте, что мы хотим извлечь числа из следующих имен файлов
«VB_23476_Val.xls»
«VV_987_Val.txt»
«VZZA_12223_Val.doc»
Это похоже на пример, где мы получаем второй элемент. Чтобы получить значения здесь, мы используем подчеркивание (то есть «_»), чтобы разбить строку. Смотрите пример кода ниже:
Sub PoluchitNomer() ' Печатает 23476 Debug.Print Split("VB_23476_Val.xls", "_")(1) ' Печатает 987 Debug.Print Split("VV_987_Val.txt", "_")(1) ' Печатает 12223 Debug.Print Split("ABBZA_12223_Val.doc", "_")(1) End Sub
В реальном мире вы обычно читаете такие строки из разных ячеек. Допустим, эти имена файлов хранятся в ячейках от А1 до А3. Мы немного изменим приведенный выше код:
Sub ChitatNomera() Dim c As Range For Each c In Range("A1:A3") ' Разделите каждый элемент по мере его прочтения Debug.Print Split(c, "_")(1) Next c End Sub
Пример 2: диапазон IP-адресов
Пример здесь взят из вопроса на веб-сайте StackOverflow.
У пользователя есть строка с IP-адресом в формате «BE-ABCDDD-DDS 172.16.23.3».
Он хочет, чтобы IP в диапазоне от 172,16 до 172,31 был действительным. Так например:
- «BE-ABCDDD-DDS 172.16.23.3» действителен
- «BE-ABCDDD-DDS 172.25.23.3» действителен
- «BE-ABCDDED-DDS 172.14.23.3» не действителен
- «BE-ABCDDDZZ-DDS 172.32.23.3» не действителен
Вот как бы я это сделал. Сначала я разбил строку по периодам. Число, которое мы ищем, находится между первым и вторым периодом. Поэтому это второй пункт. Когда мы разделяем строку, она помещается на первую позицию в массиве (помните, что массив начинается с нулевой позиции).
Полученный массив будет выглядеть так:
0 | 1 | 2 | 3 |
BE-ABCDDD-DDS 172 | 31 | 23 | 3 |
Код ниже показывает, как это сделать.
Sub IPAdd() ' Проверьте номер, чтобы проверить разные IP-адреса Dim s1 As String: s1 = "BE-ABCDDD-DDS 172.31.23.3" ' Разбить строку, используя символ точки Dim num As Long num = Split(s1, ".")(1) ' Проверьте правильность номера Debug.Print num >= 16 And num <= 31 End Sub
Пример 3. Проверьте правильность имени файла
В этом последнем примере мы хотим проверить правильность имени файла. Есть три правила.
- Должно заканчиваться на .pdf
- Он должен содержать АА
- Он должен содержать 1234 после А
В следующих таблицах показаны некоторые допустимые и недействительные элементы:
Имя файла | Статус |
AA1234.pdf | Действителен |
AA_ljgslf_1234.pdf | Действителен |
AA1234.pdf1 | Недействительно — не заканчивается на .pdf |
1234 AA.pdf | Недействительно — АА не до 1234 |
12_AA_1234_NM.pdf | Действителен |
Сначала мы сделаем это, используя функции InStr и Right.
Sub IspInstr() Dim f As String: f = "AA_1234_(5).pdf" ' Сначала найдите АА, так как 1234 должен идти после Dim lPos As Long: lPos = InStr(f, "AA") ' Ищите 1234 и убедитесь, что последние четыре символа - .pdf Debug.Print InStr(lPos, f, "1234") > 0 And Right(f, 4) = ".pdf" End Sub
Этот код очень грязный. К счастью для нас, у VBA есть Сравнение с шаблоном. Мы можем проверить шаблон строки без необходимости искать элементы и позиции и т.д. Мы используем оператор Like в VBA для сопоставления с шаблоном. Пример ниже показывает, как это сделать.
Sub IspSravnenie() Dim f As String: f = "AA_1234_(5).pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Debug.Print f Like pattern ' ИСТИНА End Sub
В приведенном выше примере звездочка в шаблоне относится к любому количеству символов.
Давайте разберем этот паттерн * AA * 1234 * .pdf
*- любая группа символов
AA — точные символы AА
*- любая группа символов
1234 — точные символы 1234
*- любая группа символов
.pdf — точные символы .pdf
Чтобы показать, что это работает правильно, давайте попробуем это на всех именах примеров в таблице.
Sub IspSravnenieTest() ' Создать коллекцию имен файлов Dim coll As New Collection coll.Add "AA1234.pdf" coll.Add "AA_ljgslf_1234.pdf" coll.Add "AA1234.pdf1" coll.Add "1234 AA.pdf" coll.Add "12_AA_1234_NM.pdf" ' Определить шаблон Dim pattern As String: pattern = "*AA*1234*.pdf" ' Проверьте каждый элемент по шаблону Dim f As Variant For Each f In coll Debug.Print f Like pattern Next f End Sub
На выходе:
ИСТИНА
ИСТИНА
ЛОЖЬ
ЛОЖЬ
ИСТИНА
Чтобы узнать больше о сопоставлении с шаблоном и ключевом слове Like, ознакомьтесь с этой публикацией.
Заключение
InStr и InStrRev действительно полезны только для простых задач, таких как проверка наличия текста в строке.
Left, Right и Mid полезны, когда положение текста всегда одинаково.
Функция Split — лучший способ извлечь переменную строку.
При попытке проверить формат строки, которая не является фиксированной по размеру, ключевое слово Like (т.е. Сопоставление с образцом) обычно обеспечивает более простое решение.
roman6509 0 / 0 / 0 Регистрация: 15.10.2019 Сообщений: 3 |
||||
1 |
||||
Excel Как в макросе выделить часть строки из выделенной?15.10.2019, 23:51. Показов 810. Ответов 3 Метки нет (Все метки)
всем привет! подскажите пожалуйста, есть вот такой макрос, созданный при помощи записи:
мне нужно чтобы вместо: «Range(«A5625:W5625″).Select» выделился диапазон от A до W в той строке которая была выделена в самом начале, а не 5625-я строка. Заранее спасибо.
0 |
1813 / 1135 / 346 Регистрация: 11.07.2014 Сообщений: 4,002 |
|
16.10.2019, 05:58 |
2 |
в той строке которая была выделена в самом начале хорошо бы знать, что это за строка в самом начале
0 |
ArtNord 370 / 268 / 93 Регистрация: 18.11.2015 Сообщений: 990 |
||||
16.10.2019, 09:00 |
3 |
|||
1 |
0 / 0 / 0 Регистрация: 15.10.2019 Сообщений: 3 |
|
16.10.2019, 11:31 [ТС] |
4 |
спасибо, сейчас буду пробовать
0 |