Alex.Karev
Пользователь
Сообщений: 7
Регистрация: 24.03.2013
Всем доброго дня!
Прошу уважаемых форумчан помочь советом по следующей ситуации.
[VBA]: обрабатывается построчно текстовый файл большого размера (100+ Мб).
Каждая считанная строка имеет следующий вид (пример):
Код |
---|
{{"Василий","Инженер",55000,35},{"Михаил","Юрист",65000,42},{"Светлана","офис-менеджер",35000,27}} |
Согласно синтаксису VB (не VBA), подобная запись информации (с использованием вложенных литералов `{` и `}` ) соответствует записи двумерного массива.
А синтаксис описания массивов в VBA, к сожалению, иной и фигурные скобки не воспринимаются.
Требуется: присвоить содержимое вышеуказанной строки переменной, являющей двумерным массивом для последующей обработки строк и столбцов. К примеру — суммированию в цикле зарплат сотрудников, чей возраст менее 40 лет.
Проблема: описание массивов в VBA не воспринимает фигурные скобки. Можно было бы через RegExp привести строку к виду
Код |
---|
Array(Array("Василий","Инженер",55000,35),Array("Михаил","Юрист",65000,42),Array("Светлана","Офис-менеджер",35000,27)) |
и применить (бы) evaluate, но Evaluate в VBA обрабатывает только арифметические выражения…
Я пытался воспользоваться другим редактором:
Код |
---|
Dim d As New MSScriptControl.ScriptControl d.Language = "VBScript"... |
но он так же отличается от VB и не воспринимает синтаксис массива с применением фигурных скобок.
Уважаемые коллеги, подскажите, какие есть идеи или варианты на Ваш взгляд, кроме простого перебора строки и заполнения в цикле двумерного массива для приведения его к виду
Цитата |
---|
Василий Инженер 55000 35 Михаил Юрист 65000 42 Светлана Офис-менеджер 35000 27 |
Скорость работы решения важна, поскольку файл — большого размера.
Заранее благодарю Вас за участие в обсуждении!
Изменено: Alex.Karev — 18.08.2016 10:39:52
Копирование значений из диапазона ячеек в массив и обратно с помощью VBA Excel. Простейшие примеры обмена значениями между диапазоном и массивом.
Как известно, VBA обрабатывает информацию в массивах значительно быстрее, чем в ячейках рабочего листа Excel. Поэтому, при работе с большими объемами данных, удобнее использовать массивы, чем наблюдать во время выполнения кода за мерцанием изображения на экране или просто смотреть в неизменную картинку, если обновление экрана отключено (Application.ScreenUpdating = False). Здесь обмен значениями между массивом и диапазоном ячеек будет вполне уместен.
Копирование значений из диапазона ячеек в массив
Чтобы скопировать значения из диапазона ячеек в массив, необходимо объявить переменную универсального типа (As Variant) и присвоить ей значения диапазона ячеек с помощью оператора присваивания (=):
Dim a As Variant a = Range(«A1:C3») |
VBA Excel автоматически преобразует объявленную переменную в двумерный массив, соответствующий размерности диапазона ячеек, в нашем случае в массив — a(1 To 3, 1 To 3), и заполняет его значениями. Нумерация измерений массивов, созданных таким образом, начинается с единицы (1).
Можно, в этом случае, объявить сразу динамический массив, чтобы изначально указать, что эта переменная будет массивом. Так как свойством диапазона ячеек по умолчанию в VBA Excel является значение (Value), его можно в коде явно не указывать, но, при желании, можно и указать. Получится такая конструкция, аналогичная первой:
Dim a() As Variant a = Range(«A1:C3»).Value |
Стоит отметить, что для копирования значений из диапазона ячеек в массив можно использовать только обычную переменную или динамический массив универсального типа (Variant). VBA Excel автоматически преобразовывает их в двумерный массив. Если объявить двумерный массив с указанной заранее размерностью, использовать его не получится, будет сгенерирована ошибка с сообщением: Can’t assign to array (Нельзя назначать массив).
Копирование значений из массива в диапазон ячеек
Значения в диапазон ячеек добавляются из массива с помощью оператора присваивания (=):
Range(«A6:F15») = a ‘или Range(«A6:F15»).Value = a ‘где a — переменная двумерного массива |
Обратите внимание, что вставить значения в диапазон ячеек можно только из двумерного массива. Размерность такого массива может начинаться с нуля (0). Количество элементов в измерениях массива должно совпадать с количеством строк и столбцов в диапазоне ячеек. Если вам нужно вставить значения в одну строку или в один столбец, укажите размерность единственной строки или единственного столбца как (0) или (1 To 1), если вы хотите использовать нумерацию измерений своего массива с единицы. Например, для записи десяти значений из массива в одну строку можно объявить такой массив — massiv(9, 0), или в один столбец — massiv(0, 9).
Для вставки значений в диапазон ячеек из массива идеально подойдет массив, созданный для копирования в него значений из диапазона. В этом случае, данные с рабочего листа Excel переносятся в массив, обрабатываются и, после обработки, вставляются обратно в ту же или другую таблицу на том же или другом рабочем листе.
Обмен значениями между двумя диапазонами
Обмен значениями можно осуществить в VBA Excel не только между массивом и диапазоном, но и между двумя диапазонами одинаковой размерности:
Range(«B2:D6») = Range(«G7:I11»).Value |
У диапазона, являющегося источником значений, обязательно должно быть указано свойство Value
.
Если диапазон ячеек, принимающий значения, по размеру меньше диапазона-источника, то он будет заполнен полностью:
Range(«B2:D6») = Range(«G5:L13»).Value |
Если принимающий диапазон ячеек по размеру больше передающего, то часть его будет заполнена значениями диапазона-источника, а остальные ячейки — значениями #Н/Д
:
Range(«B2:D6») = Range(«G7:H9»).Value |
Простейшие примеры обмена значениями
Эти примеры составлены так, чтобы вам не пришлось совершать лишних действий, просто скопируйте их в свой модуль любой книги Excel с поддержкой макросов и запустите по очереди на выполнение.
Пример 1
Заполнение двумерного массива значениями и и их присвоение диапазону ячеек на рабочем листе Excel:
Sub Test1() Dim a(2, 2) As Variant a(0, 0) = «телепузик» a(0, 1) = «журналист» a(0, 2) = «ящерица» a(1, 0) = «короед» a(1, 1) = «утенок» a(1, 2) = «шмель» a(2, 0) = 200 a(2, 1) = 300 a(2, 2) = 400 Range(«A1:C3»).Value = a End Sub |
В данном случае переменная массива не обязательно должна быть универсального типа (As Variant), например, если бы в нее записывались только текстовые данные, ее можно было бы объявить как строковую (As String), и все бы работало.
Пример 2
Объявление обычной переменной универсального типа, присвоение ей значений из диапазона ячеек «A1:C3», записанных кодом первого примера, и вставка этих значений из полученного двумерного массива в диапазон «D10:F12»:
Sub Test2() Dim a As Variant a = Range(«A1:C3») Range(«D10:F12») = a End Sub |
Естественно, указанные диапазоны ячеек расположены на активном листе.
Пример 3
Допустим, на рабочем листе «Лист1» в ячейках «A1:A5» записано количество какого-то товара, а в ячейках «B1:B5» — его цена. Необходимо к этой информации добавить сумму каждого товара, умножив количество на цену, и перенести данные на «Лист2».
Sub Test3() Dim a As Variant, i As Long a = Лист1.Range(«A1:C5») For i = 1 To 5 a(i, 3) = a(i, 1) _ * a(i, 2) Next Лист2.Range(«A1:C5») = a End Sub |
Массив создан сразу с размерностью 5×3 с элементами под суммы. Даже если на первом листе в ячейках «C1:C5» есть какие-то значения, в массиве они будут перезаписаны результатами вычислений.
Копирование значений из массива в массив
Этот пример показывает, как в VBA Excel можно скопировать значения из одного массива в другой:
Sub Test4() Dim arr1, arr2 arr1 = Range(«G7:I11») arr2 = arr1 Range(«B2:D6») = arr2 End Sub |
A string is a collection of characters joined together. When these characters are divided and stored in a variable, that variable becomes an array for these characters. The method we use to split a string into an array is by using the SPLIT function in VBA, which splits the string into a one-dimensional string.
Like worksheets in VBA, too, we have functions to deal with String or Text values. We are familiar with the string operations like extracting the first name, last name, middle name, etc. But how about the idea of splitting string values into arrays in VBA? Yes, you heard it correctly we can split string sentences into an array using VBA codingVBA 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. This special article will show you how to split the string into an array in Excel VBA.
Table of contents
- Excel VBA Split String into Array
- What is Split String into an Array?
- How to Convert Split String into an Array in Excel VBA?
- Example #1
- Example #2
- Things to Remember
- Recommended Articles
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 Split String into Array (wallstreetmojo.com)
What is Split String into an Array?
Let me clarify this first, “String into Array” is nothing but “different parts of the sentence or string will split into multiple parts.” So, for example, if the sentence is “Bangalore is the capital city of Karnataka,” each word is a different array.
So, how to split this sentence into an array is the topic of this article.
How to Convert Split String into an Array in Excel VBA?
To convert the split string into an array in VBA, we have a function called “SPLIT.” This VBA functionVBA functions serve the primary purpose to carry out specific calculations and to return a value. Therefore, in VBA, we use syntax to specify the parameters and data type while defining the function. Such functions are called user-defined functions.read more splits supplied string values into different parts based on the delimiter provided.
For example, if the sentence is “Bangalore is the capital city of Karnataka,” space is the delimiter between each word.
Below is the syntax of the SPLIT function.
- Value or Expression: This is the string or text value we try to convert to the array by segregating each part of the string.
- [Delimiter]: This is nothing but the common things which separate each word in the string. In our sentence, “Bangalore is the capital city of Karnataka,” each word is separated by a space character, so our delimiter is space here.
- [Limit]: Limit is nothing but how many parts we want as a result. For example, in the sentence “Bangalore is the capital city of Karnataka,” we have seven parts. If we need only three parts, then we will get the first part as “Bangalore,” the second part as “is,” and the third part as the rest of the sentence, i.e., “the capital city of Karnataka.”
- [Compare]: One does not use this99% of the time, so let us not touch this.
You can download this VBA Split String into Array Excel Template here – VBA Split String into Array Excel Template
Example #1
Now, let us see practical examples.
Step 1: Define the VBA variableVariable declaration is necessary in VBA to define a variable for a specific data type so that it can hold values; any variable that is not defined in VBA cannot hold values.read more to hold the string value.
Code:
Sub String_To_Array() Dim StringValue As String End Sub
Step 2: For this variable, assign the string “Bangalore is the capital city of Karnataka.”
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnatka" End Sub
Step 3: Next, define one more variable which can hold each part of the above string value. We need to remember this because the sentence has more than one word, so we need to define the variable as “Array” to hold more than one value.
In this case, we have 7 words in the string so define the array as follows.
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnatka" Dim SingleValue() As String End Sub
Now, for this array variable, we will use the SPLIT function to split the string into an array in Excel VBAArrays are used in VBA to define groups of objects. There are nine different array functions in VBA: ARRAY, ERASE, FILTER, ISARRAY, JOIN, LBOUND, REDIM, SPLIT, and UBOUND.read more.
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnataka" Dim SingleValue() As String SingleValue = Split(StringValue, " ") End Sub
The expression is our string value, i.e., the variable already holds the string value, so enter the variable name only.
The delimiter in this string is a space character so supply the same.
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnataka" Dim SingleValue() As String SingleValue = Split(StringValue, " ") End Sub
As of now, leave other parts of the SPLIT function.
The SPLIT function splits the string value into 7 pieces, each word segregated at the expense of space character. Since we have declared the variable “SingleValue” as an array, we can assign all 7 values to this variable.
We can write the code as follows.
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnataka" Dim SingleValue() As String SingleValue = Split(StringValue, " ") MsgBox SingleValue(0) End Sub
Run the code and see what we get in the message box.
Now, we can see the first word, “Bangalore.” To show other words, we can write the code as follows.
Code:
Sub String_To_Array() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnataka" Dim SingleValue() As String SingleValue = Split(StringValue, " ") MsgBox SingleValue(0) & vbNewLine & SingleValue(1) & vbNewLine & SingleValue(2) & vbNewLine & SingleValue(3) & _vbNewLine & SingleValue(4) & vbNewLine & SingleValue(5) & vbNewLine & SingleValue(6) End Sub
Now, run the code and see what we get in the message box.
Each and every word has been split into arrays.
Example #2
Now, imagine a situation of storing these values in cells, i.e., each word in a separate cell. For this, we need to include the FOR NEXT loop in VBAAll programming languages make use of the VBA For Next loop. After the FOR statement, there is a criterion in this loop, and the code loops until the criteria are reached. read more.
The below code will insert each word into separate cells.
Sub String_To_Array1() Dim StringValue As String StringValue = "Bangalore is the capital city of Karnataka" Dim SingleValue() As String SingleValue = Split(StringValue, " ") Dim k As Integer For k = 1 To 7 Cells(1, k).Value = SingleValue(k - 1) Next k End Sub
It will insert each word, as shown in the below image.
Things to Remember
- One may use arrays and loops to make the code dynamic.
- The SPLIT function requires a common delimiter, which separates each word in the sentence.
- Array length starts from zero, not from 1.
Recommended Articles
This article has been a guide to VBA Split String into Array. Here, we discuss converting a split string into an array in Excel VBA, along with practical examples. You can learn more about VBA functions from the following articles: –
- Split Names in Excel
- VBA String Comparison
- Excel VBA String Array
- Find Next in VBA
Преобразование строки со значениями в массив
Ситуация: дана строка, в которой через запятую перечислены значения (или диапазоны значений)
Требуется подсчитать, сколько значений содержится в строке, или же разбить строку на массив, содержащий все значения из исходной строки.
И, если при исходных строках вида «5,6,8,18,2,21» всё просто (достаточно применить VB-функцию Split), то при наличии в строке диапазонов значений вида Число1-Число2 (например, строка «9-15,18,2,11-9«) задача заметно усложняется.
В этих случаях на помощь придёт функция ArrayOfValues
Function ArrayOfValues(ByVal txt$) As Variant ' Принимает в качестве параметра строку типа ",,5,6,8,,9-15,18,2,11-9,,1,4,,21," ' Возвращает одномерный (горизонтальный) массив в формате ' array(5,6,8,9,10,11,12,13,14,15,18,2,11,10,9,1,4,21) ' (пустые значения удаляются; диапазоны типа 9-15 и 17-13 раскрываются) arr = Split(Replace(txt$, " ", ""), ","): Dim n As Long: ReDim tmpArr(0 To 0) For i = LBound(arr) To UBound(arr) Select Case True Case arr(i) = "", Val(arr(i)) < 0 ' раскомментируйте эту строку, чтобы пустые и нулевые значения ' тоже добавлялись в результат (преобразовывались в значение -1) 'tmpArr(UBound(tmpArr)) = -1: ReDim Preserve tmpArr(0 To UBound(tmpArr) + 1) Case IsNumeric(arr(i)) tmpArr(UBound(tmpArr)) = arr(i): ReDim Preserve tmpArr(0 To UBound(tmpArr) + 1) Case arr(i) Like "*#-#*" spl = Split(arr(i), "-") If UBound(spl) = 1 Then If IsNumeric(spl(0)) And IsNumeric(spl(1)) Then For j = Val(spl(0)) To Val(spl(1)) Step IIf(Val(spl(0)) > Val(spl(1)), -1, 1) tmpArr(UBound(tmpArr)) = j: ReDim Preserve tmpArr(0 To UBound(tmpArr) + 1) Next j End If End If End Select Next i On Error Resume Next: ReDim Preserve tmpArr(0 To UBound(tmpArr) - 1) ArrayOfValues = tmpArr End Function
Использовать её можно так:
Sub ПримерИспользования() ' разбиваем строку в массив, содержащий все значения исходной строки a = ArrayOfValues(",,5,6,8,,9-15,18,2,11-9,,1,4,,21,") Debug.Print Join(a, ",") ' объединяем обратно созданный массив ' результатом будет строка "5,6,8,9,10,11,12,13,14,15,18,2,11,10,9,1,4,21" End Sub
Функция нашла применение в программе выгрузки тарифов в XML
Ещё один вариант функции, только она возвращает из аналогичной текстовой строки КОЛЛЕКЦИЮ НЕПОВТОРЯЮЩИХСЯ чисел от 1 до 255
Function ArrayOfValuesEx(ByVal txt$) As Collection ' Принимает в качестве параметра строку типа ",,5,6,8,,9-15,18,2,11-9,,1,4,,21," ' Возвращает колекцию уникальных чисел в формате (5,6,8,9,10,11,12,13,14,15,18,2,1,4,21) ' (удаляются все значения кроме целых чисел от 1 до 255; диапазоны типа 9-15 и 17-13 раскрываются) On Error Resume Next: Set ArrayOfValuesEx = New Collection MaxNumber& = 255 txt = Replace(Replace(txt, ".", ","), " ", "") For i = 1 To Len(txt) If Mid(txt, i, 1) Like "[0-9,-]" Then res = res & Mid(txt, i, 1) Else res = res & " " Next txt = Replace(res, " ", "") arr = Split(txt, ","): For i = LBound(arr) To UBound(arr) Select Case True Case arr(i) = "", Val(arr(i)) < 0 Case IsNumeric(arr(i)) v& = Val(arr(i)): If v > 0 And v <= MaxNumber& Then ArrayOfValuesEx.Add v, CStr(v) Case arr(i) Like "*#-#*" spl = Split(arr(i), "-") If UBound(spl) = 1 Then If IsNumeric(spl(0)) And IsNumeric(spl(1)) Then For j = Val(spl(0)) To Val(spl(1)) Step IIf(Val(spl(0)) > Val(spl(1)), -1, 1) v& = j: If v > 0 And v <= MaxNumber& Then ArrayOfValuesEx.Add v, CStr(v) Next j End If End If End Select Next i End Function Private Sub ArrayOfValuesEx_ПримерИспользования() ' разбиваем строку в массив, содержащий все значения исходной строки Dim coll As Collection Set coll = ArrayOfValuesEx(",,5,6,+8,,9-12,18//,2,11-9,,1,4.6,,21,7a,ajsgh55,4-") For Each Item In coll: Debug.Print Item;: Next: Debug.Print ' результатом будет 5 6 8 9 10 11 12 18 2 1 4 21 7 55 End Sub
- 20627 просмотров
Не получается применить макрос? Не удаётся изменить код под свои нужды?
Оформите заказ у нас на сайте, не забыв прикрепить примеры файлов, и описать, что и как должно работать.
Если у Вас установлен MS Excel 97 или Вы не хотите использовать Split, то можете использовать нижеприведённый код :
Visual Basic | ||
|
P.S. Не забудьте выделить ячейку, содержащую исходный текст, который необходимо ‘преобразовать’
To Massalov
Свой вариант написал ещё вчера, а учитывая что он не является полным клоном Вашего ответа, решил всё-таки опубликовать. Данный ответ не является ни критикой, ни дополнением к Вашему.