Vba массив в строку: Функции VBA для работы с массивами
Содержание
Функция Array (Visual Basic для приложений)
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
-
Возвращает значение Variant, содержащее массив.
Синтаксис
Array(arglist)
Обязательный аргументarglist представляет собой разделенный запятыми список значений, назначенных элементам массива, содержащимся в Variant. Если аргументы не указаны, создается пустой массив.
Эта нотация, используемая для ссылки на элемент массива, состоит из имени переменной, за которой в скобках содержится порядковый номер, указывающий нужный элемент.
В приведенном ниже примере первый оператор создает переменную с именемA
как переменную типа Variant. Второй оператор назначает массив переменной A
. Последний оператор присваивает значение, содержащееся во втором элементе массива, другой переменной.
Dim A As Variant, B As Long, i As Long A = Array(10, 20, 30) ' A is a three element list by default indexed 0 to 2 B = A(2) ' B is now 30 ReDim Preserve A(4) ' Extend A's length to five elements A(4) = 40 ' Set the fifth element's value For i = LBound(A) To UBound(A) Debug. Print "A(" & i & ") = " & A(i) Next i
Нижняя граница массива, создаваемого с помощью функции Array, определяется нижней границей, указанной в операторе Option Base, кроме случаев, когда к Array добавляется имя библиотеки типов (например, VBA.Array). Если имя библиотеки типов добавлено, оператор Option Base не влияет на функцию Array.
Примечание.
Переменная Variant, не объявленная как массив, также может содержать массив. Переменная Variant может содержать массив любого типа, за исключением строк фиксированной длины и пользовательских типов. Хотя переменная Variant, содержащая массив, по существу отличается от массива, элементы которого имеют тип Variant, доступ к элементам массива осуществляется так же.
Пример
В данном примере функция Array возвращает переменную Variant, содержащую массив.
Dim MyWeek, MyDay MyWeek = Array("Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun") ' Return values assume lower bound set to 1 (using Option Base ' statement). MyDay = MyWeek(2) ' MyDay contains "Tue". MyDay = MyWeek(4) ' MyDay contains "Thu".
См. также
- Функции (Visual Basic для приложений)
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Функция Split (Visual Basic для приложений)
Twitter
LinkedIn
Facebook
Адрес электронной почты
-
Статья -
-
Возвращает одномерный массив с основанием 0, содержащий указанное число подстрок.
Синтаксис
Split(expression, [ разделитель, [ limit, [ compare ]]])
Синтаксис функции Split включает следующие именованные аргументы:
Part | Описание |
---|---|
выражение | Обязательно. Строковое выражение, содержащее подстроки и разделители. Если аргумент expression является строкой нулевой длины («»), функция Split возвращает пустой массив — без элементов и данных. |
Разделитель | Необязательный параметр. Строковый символ, используемый для разделения подстрок. Если этот аргумент не указан, в качестве разделителя используется знак пробела (» «). Если аргумент delimiter является строкой нулевой длины, возвращается массив с одним элементом, содержащим всю строку из аргумента expression. |
Предел | Необязательный параметр. Количество возвращаемых подстрок; -1 указывает, что возвращаются все подстроки. |
compare | Необязательно. Числовое значение, указывающее тип сравнения, который будет использоваться при оценке подстрок. Значения см. в разделе «Параметры». |
Параметры
Аргумент compare может принимать следующие значения:
Константа | Значение | Описание |
---|---|---|
vbUseCompareOption | –1 | Выполняет сравнение, используя параметр оператора Option Compare. |
vbBinaryCompare | 0 | Выполняется двоичное сравнение. |
vbTextCompare | 1 | Выполняется текстовое сравнение. |
vbDatabaseCompare | 2 | Только Microsoft Access. Выполняется сравнение на основе сведений из базы данных. |
Пример
В этом примере показано, как использовать функцию Split .
Dim strFull As String Dim arrSplitStrings1() As String Dim arrSplitStrings2() As String Dim strSingleString1 As String Dim strSingleString2 As String Dim strSingleString3 As String Dim i As Long strFull = "Dow - Fonseca - Graham - Kopke - Noval - Offley - Sandeman - Taylor - Warre" ' String that will be used. arrSplitStrings1 = Split(strFull, "-") ' arrSplitStrings1 will be an array from 0 To 8. ' arrSplitStrings1(0) = "Dow " and arrSplitStrings1(1) = " Fonesca ". ' The delimiter did not include spaces, so the spaces in strFull will be included in the returned array values. arrSplitStrings2 = Split(strFull, " - ") ' arrSplitStrings2 will be an array from 0 To 8. ' arrSplitStrings2(0) = "Dow" and arrSplitStrings2(1) = "Fonesca". ' The delimiter includes the spaces, so the spaces will not be included in the returned array values. 'Multiple examples of how to return the value "Kopke" (array position 3). strSingleString1 = arrSplitStrings2(3) ' strSingleString1 = "Kopke". strSingleString2 = Split(strFull, " - ")(3) ' strSingleString2 = "Kopke". ' This syntax can be used if the entire array is not needed, and the position in the returned array for the desired value is known. For i = LBound(arrSplitStrings2, 1) To UBound(arrSplitStrings2, 1) If InStr(1, arrSplitStrings2(i), "Kopke", vbTextCompare) > 0 Then strSingleString3 = arrSplitStrings2(i) Exit For End If Next i
См. также
- Функции (Visual Basic для приложений)
Поддержка и обратная связь
Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.
Преобразование значений массива вариантов в строки в vba
спросил
Изменено
1 месяц назад
Просмотрено
9к раз
У меня есть подпрограмма, которая принимает массив вариантов, сгенерированный в пользовательской форме, и я хотел бы извлечь все значения и вернуть их в виде одной строки с разделителями-запятыми. Это, вероятно, довольно просто, но у меня возникают проблемы с преобразованием значений из массива в строку. Я получаю несоответствие типов, когда пытаюсь преобразовать вариант в строку. Любая идея, что я делаю неправильно?
Подформа Поиск (Поиск массива параметров () как вариант) Dim returnString как строка ВозвращаемаяСтрока = "" Для i = LBound (поиск) To UBound (поиск) returnString = returnString + CStr(search(i)) + "," Следующий MsgBox returnString Конец сабвуфера
- массивы
- строка
- vba
- вариант
5
У меня была та же проблема, потому что входной массив был содержимым NamedRange на рабочем листе.
Несмотря на то, что NamedRange представлял собой один столбец ячеек, массив, возвращаемый VBA, представлял собой двумерный массив значений , поэтому для работы коду требовалась корректировка i,1 в функции CStr:
Функция getCellArrayAsString(RangeName как строка) как строка Dim arr() как вариант getCellArrayAsString = "" arr = ThisWorkbook. Names(RangeName).RefersToRange.value Для i = LBound(arr) + 1 To UBound(arr) getCellArrayAsString = getCellArrayAsString & CStr(arr(i, 1)) & "," Следующий Конечная функция
или как это будет применяться к коду OP:
Sub formSearch (ParamArray search() As Variant) Dim returnString как строка ВозвращаемаяСтрока = "" Для i = LBound (поиск) To UBound (поиск) returnString = returnString + CStr(search(i,1)) + "," Следующий MsgBox returnString Конец сабвуфера
Я подозреваю, что ваш код страдал от той же проблемы, поскольку ваш ввод был на самом деле двумерным массивом.
Зарегистрируйтесь или войдите в систему
Зарегистрируйтесь с помощью Google
Зарегистрироваться через Facebook
Зарегистрируйтесь, используя электронную почту и пароль
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Опубликовать как гость
Электронная почта
Требуется, но не отображается
Excel VBA: диапазон в массив строк за 1 шаг
Задавать вопрос
спросил
Изменено
4 года, 3 месяца назад
Просмотрено
92к раз
Я знаю, что вы можете легко взять диапазон ячеек и поместить их в Variant Array, но я хочу работать со строковым массивом (поскольку он одномерный и занимает меньше памяти, чем Variant array).
Есть ли способ автоматически преобразовать диапазон в массив строк?
Прямо сейчас я использую функцию, которая берет диапазон и сохраняет значения в массиве вариантов, а затем преобразует массив вариантов в массив строк. Это работает хорошо, но я ищу способ перейти непосредственно из диапазона в массив строк. Любая помощь будет принята с благодарностью.
Функция RangeToArray(ByVal my_range As Range) As String() Dim vArray как вариант Dim sArray() как строка Дим и пока vArray = мой_диапазон.Значение ReDim sArray (1 в UBound (vArray)) Для i = 1 To UBound (vArray) sArray(i) = vArray(i, 1) Следующий RangeToArray = sArray() Конечная функция ОБНОВЛЕНИЕ
:
Похоже, что нет способа пропустить шаг добавления данных в массив переменных, прежде чем преобразовать его в одномерный строковый массив. Обидно, если это правда (даже если это не требует особых усилий, мне нравится ультраоптимизировать, поэтому я надеялся, что есть способ пропустить этот шаг). Я закрою вопрос через несколько дней, если решение не появится. Спасибо за полезные комментарии, ребята!
ОБНОВЛЕНИЕ2:
Ответ принадлежит Саймону, который приложил огромные усилия (как и все остальные) и в конечном итоге указал, что действительно невозможно перейти от диапазона к массиву строк за один раз. Всем спасибо.
- массивы
- строка
- excel
- vba
- диапазон
3
На самом деле вы можете напрямую перейти от диапазона к массиву, используя функции Split, Join и разделитель, которого нет в тексте.
Предполагая, что вы уже назначили диапазон значений 1D как SrcRange
Dim Array() As String: Array = Split(Join(Application.Transpose(SrcRange), "#"), "#")
3
Как насчет…
Открытая функция RangeToStringArray(theRange As Excel.Range) As String() ' Получить значения в массив вариантов Dim variantValues As Variant variantValues = theRange. Value ' Создаем для них строковый массив Dim stringValues () как строка ReDim stringValues (1 в UBound (вариантные значения, 1), 1 в UBound (вариантные значения, 2)) «Положи их туда! Dim columnCounter As Long, rowCounter As Long Для rowCounter = UBound(variantValues, 1) To 1 Шаг -1 Для columnCounter = UBound(variantValues, 2) до 1 Шаг -1 stringValues (rowCounter, columnCounter) = CStr (variantValues (rowCounter, columnCounter)) Следующий столбецСчетчик Следующая строкаСчетчик ' Возвращаем массив строк RangeToStringArray = строковые значения Конечная функция
4
Функция RangeToStringArray (myRange как диапазон) как String() ReDim strArray (myRange.Cells.Count - 1) как строка Dim idx As Long Dim c As Диапазон Для каждого c в моем диапазоне strArray(idx) = c.Text ИДКС = ИДКС + 1 Следующий с RangeToStringArray = массив строк Конечная функция
Если вы не против изменить содержимое буфера обмена, то:
КОПИРОВАТЬ диапазон в буфер обмена методом Копировать:
MyTargetRange. Copy
Скопируйте содержимое из буфера обмена в строковую переменную (поищите на этом сайте или в другом месте функции для передачи строк в/из буфера обмена).
РАЗДЕЛИТЬ строку на вариантный массив:
MyStringArray = Разделить (MyClipboardText, vbCrLf)
ДОПОЛНИТЕЛЬНО: Массив будет иметь один дополнительный пустой элемент, потому что всегда есть дополнительный возврат (vbCrLf) в конце текста, который вы только что скопировали в буфер обмена. Чтобы удалить, просто измените размер массива:
Redim Preserve MyStringArray (Ubound (MyStringArray) - 1)
Очень просто и быстро!!!
Недостатки заключаются в том, что буфер обмена может измениться, когда вы меньше всего этого ожидаете (во время пересчета), и что он создает только массивы строк (не Doubles или другие типы числовых значений).
Это было бы ЧРЕЗВЫЧАЙНО ПОЛЕЗНЫМ, если вы работаете с большим количеством повторяющихся функций (тысячи), которые используют одни и те же данные (тысячи точек данных).