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.
vbBinaryCompare0Выполняется двоичное сравнение.
vbTextCompare1Выполняется текстовое сравнение.
vbDatabaseCompare2Только 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 = массив строк
Конечная функция
 

Если вы не против изменить содержимое буфера обмена, то:

  1. КОПИРОВАТЬ диапазон в буфер обмена методом Копировать:

     MyTargetRange. Copy
     
  2. Скопируйте содержимое из буфера обмена в строковую переменную (поищите на этом сайте или в другом месте функции для передачи строк в/из буфера обмена).

  3. РАЗДЕЛИТЬ строку на вариантный массив:

     MyStringArray = Разделить (MyClipboardText, vbCrLf)
     
  4. ДОПОЛНИТЕЛЬНО: Массив будет иметь один дополнительный пустой элемент, потому что всегда есть дополнительный возврат (vbCrLf) в конце текста, который вы только что скопировали в буфер обмена. Чтобы удалить, просто измените размер массива:

     Redim Preserve MyStringArray (Ubound (MyStringArray) - 1)
     

Очень просто и быстро!!!

Недостатки заключаются в том, что буфер обмена может измениться, когда вы меньше всего этого ожидаете (во время пересчета), и что он создает только массивы строк (не Doubles или другие типы числовых значений).

Это было бы ЧРЕЗВЫЧАЙНО ПОЛЕЗНЫМ, если вы работаете с большим количеством повторяющихся функций (тысячи), которые используют одни и те же данные (тысячи точек данных).