Массивы слияния Vba Excel

Обновлено: 05.07.2024

Нажмите курсивный значок "fx" слева от строки формул, чтобы открыть диалоговое окно "Аргументы функций". Справка отображается для каждого аргумента.

бобсан42

Известный участник
  1. 365
  2. 2019
  3. 2016
  4. 2013
    1. Окна

    как именно объединить?
    добавить второй в конец первого
    или
    объединить их в двумерный массив?

    Обычная доска

    как именно объединить?
    добавить второй в конец первого
    или
    объединить их в двумерный массив?

    нет, я имею в виду, что у меня есть два массива
    array1=("aa","bb",cc")
    array2=("dd","ee",ff")

    я хочу объединить их в массив3=("aa","bb",cc","dd","ee",ff")

    Есть ли способ сделать это? спасибо.

    pgc01

    MrExcel MVP

    Встроенной функции для объединения массивов нет. Измерьте массив с общим количеством элементов и скопируйте в него исходные массивы.

    бобсан42

    Известный участник
    1. 365
    2. 2019
    3. 2016
    4. 2013
      1. Окна

      pgc01

      MrExcel MVP

      Ваше утверждение предполагает, что элементы массива не имеют запятых. Может быть, использовать для напр. Chr(1) как разделитель?
      Также допустимо только для строк (что, похоже, так и есть).

      бобсан42

      Известный участник
      1. 365
      2. 2019
      3. 2016
      4. 2013
        1. Окна

        да, вы правы, pgc01 - это должно быть более общим:

        array3 = Split(Join(array1, Chr(1)) & Chr(1) & Join(array2, Chr(1)), Chr(1))

        Апексим

        Новый участник

        да, вы правы, pgc01 - это должно быть более общим:

        array3 = Split(Join(array1, Chr(1)) & Chr(1) & Join(array2, Chr(1)), Chr(1))

        Стоит отметить, что это решение не будет работать для массивов сложных типов данных (объектов, массивов или пользовательских типов).
        Если это ваш случай, вам нужно создать новый массив (или расширить тот, который у вас уже есть).

        Случайно размещенная информация Excel и другие материалы

        Функция ArrayUnion Хуана Пабло. Он разместил его в комментарии, но, поскольку я знаю, что поищу его позже, я поместил его в библиотеку кода.

        Передайте два массива в качестве аргументов, и он вернет один массив, содержащий все элементы двух переданных массивов.

        Функция ArrayUnion( ByVal va1 As Variant , ByVal va2 As Variant ) As Variant
        Dim i As Long , Upper As Long
        If TypeName(va1) = “Empty” Then
        va1 = va2
        Else
        Upper = UBound (va1)
        If LBound (va2) = 0 Then Upper = Upper + 1
        ReDim Preserve va1( LBound (va1) To UBound (va1) + UBound (va2) – LBound (va2) + 1)
        For i = LBound (va2) To UBound (va2)
        va1(Upper + i) = va2(i)
        Next i
        Конец, если
        ArrayUnion = va1
        Конец функции

        12 мыслей о «Объединении массивов»

        Я восхищался этим кодом и придумал следующую загадку…

        Я регулярно использую многомерные массивы. Можно ли написать обобщенную функцию/процедуру для объединения двух из них?

        Я могу/создал/создал проверку ранга/размера, чтобы убедиться, что они действительно объединяются, и могу легко использовать приведенный выше код для механики слияния. Тем не менее, я ничего не понимаю, когда дело доходит до попытки создать оператор ReDim для увеличения размера конечного измерения….

        Есть ли способ сделать это? Или вам нужно жестко запрограммировать ReDim для каждого из возможных рангов (от 1 до 60) = вероятно, лучше всего использовать оператор Select…Case.

        Спасибо за всегда информативный и наводящий на размышления блог

        Стивен: Я пробовал то же самое, когда мне нужна была стандартная процедура сортировки массивов, которая обрабатывала бы любое количество измерений. Через некоторое время я решил, что проще иметь две программы; один для одномерных массивов и один для двухмерных массивов. Мне еще предстоит использовать трехмерный массив. Однако, возможно, стоит взглянуть еще раз.

        Я протестировал это в окне Immediate, вот результаты:

        a = Array(Sheet1)
        b = Array(ThisWorkbook)
        c = ArrayUnion(a,b)
        ? err.Description
        Объект не поддерживает это свойство или метод

        Боюсь, аргументы должны быть массивом. Пожалуйста, попробуйте.

        Sub TestingFunction()
        Dim ele
        a = Array(1, 2, 3)
        b = Array(4, 5, 6)
        c = ArrayUnion(a , б)
        Для каждого elm In c
        Debug.Print elm
        Следующий
        End Sub

        Два комментария:
        (1) проверка пустого массива не работает,
        TypeName() НЕ выделенного динамического массива целых чисел вернет «Integer()»

        2) цикл for для копирования второго массива: LBound второго массива не всегда равен единице, предлагаем изменить на
        va1(Upper + (i-LBound(va2)+1) = va2( я)

        Я думаю, ваш код всегда преобразуется в строки?

        А поскольку обработка строк, особенно объявление строк, обычно очень неэффективна в VBA, я бы предположил, что использование Split and Join работает медленно. Вы делали тесты?

        Несмотря на то, что "объединение" преобразуется в строку, в результате разделения получается массив (вариант). Так что нет смысла объявлять строки.
        Я объединил 2 массива по 100 элементов в массив из 200 элементов.
        Мой однострочник занял 1,3 мс, "цикл" сделал это за ,3 мс. (тест проводился на очень медленном компьютере PII, 350 МГц)
        Хотя разница в скорости составляет фактор 4, ни один пользователь не заметит разницы.

        Проверив это, я пришел к выводу, что результатом вашей однострочной строки всегда будет вариант, содержащий строки, что может быть неуместно, если вы вводите в него числа.

        Я согласен с тем, что в большинстве случаев разница в скорости не имеет значения, но для больших объемов данных разница в скорости может быть значительной.
        Если вы создали UDF, который объединил 2 массива по 10 000 элементов и имел 1000 экземпляров udf, разница во времени на моей быстрой машине составила бы около 20 секунд.

        Привет, я просмотрел код Хуана Пабло. Я еще не очень часто работал с массивами, и мне нравится простота этого кода. Мне интересно, если бы вы хотели добавить второй вектор не ниже первого вектора, а как новый столбец, как бы вы это закодировали?

        Очень интересно узнать!

        Этот код действительно потрясающий. Для людей, которые хотят присоединиться к большему количеству массивов, вы повторяете функцию для каждого нового массива. Если вы хотите отобразить свой массив в столбце, просто используйте =Transpose(ArrayUnion(..)

        В VBA массив — это одна переменная, которая может содержать несколько значений. Думайте о массиве как о диапазоне ячеек: каждая ячейка может хранить значение. Массивы могут быть одномерными (подумайте об одном столбце), двумерными (подумайте о нескольких строках и столбцах) или многомерными. Доступ к значениям массива можно получить по их положению (порядковому номеру) в массиве.

        Быстрый лист массива VBA

        Массивы

        Затемнить arr(от 1 до 3) как вариант
        Затемнить ячейку как диапазон, i как целое число
        i = LBound(arr)
        Для каждой ячейки в диапазоне("A1:A3")
        i = i + 1
        arr(i) = cell.value
        Следующая ячейка

        Быстрые примеры массивов VBA

        Давайте рассмотрим полный пример, прежде чем углубляться в детали:

        Здесь мы создали одномерный строковый массив: strNames размера четыре (может содержать четыре значения) и присвоили четыре значения. Наконец, мы отображаем третье значение в окне сообщения.

        В этом случае польза от использования массива невелика: требуется только одно объявление переменной вместо четырех.

        Тем не менее, давайте рассмотрим пример, демонстрирующий истинную мощь массива:

        Здесь мы создали массив, который может содержать 60 000 значений, и мы быстро заполнили массив из столбца A рабочего листа.

        Преимущества массива? – Скорость!

        Можно подумать, что массивы похожи на рабочие листы Excel:

        • Каждая ячейка (или элемент массива) может содержать собственное значение
        • Каждая ячейка (или элемент в массиве) доступна по ее положению в строке и столбце.
          • Рабочий лист Пример. ячейки (1,4). значение = «Строка 1, столбец 4»
          • Напр., массив arrVar(1,4) = «Строка 1, столбец 4»

          Так зачем возиться с массивами? Почему бы просто не читать и не записывать значения непосредственно в ячейки Excel? Одно слово: скорость!

          Чтение и запись в ячейки Excel — медленный процесс. Работа с массивами стала намного быстрее!

          Создать/объявить массив (Dim)

          Примечание. Массивы могут иметь несколько измерений. Для простоты мы начнем с работы только с одномерными массивами. Позже в этом руководстве мы познакомим вас с многомерными массивами.

          Статический массив

          Статические массивы — это массивы, размер которых не может изменяться. И наоборот, динамические массивы могут изменять размер. Они декларируются немного по-другому. Сначала рассмотрим статические массивы.

          Примечание. Если размер массива не изменится, используйте статический массив.

          Объявление переменной статического массива очень похоже на объявление обычной переменной, за исключением того, что вы должны определить размер массива. Существует несколько различных способов задать размер массива.

          Спасибо. Мы получили ваш запрос и незамедлительно ответим.

          Присоединяйтесь к нам!

          • Общаться с другими участниками
          • Уведомления об ответах
            на ваши сообщения
          • Поиск по ключевым словам
          • Доступ в один клик к вашим
            любимым форумам
          • Автоматические подписи
            на ваших сообщениях
          • Лучше всего то, что это бесплатно!

          *Функции Tek-Tips зависят от того, получают ли участники электронную почту. Присоединяясь, вы соглашаетесь на получение электронной почты.

          Правила публикации

          Реклама, продажа, рекрутинг, размещение курсовых и дипломных работ запрещено.

          Пользовательская форма Excel VBA: объединение двух массивов и удаление дубликатов

          Пользовательская форма Excel VBA: объединение двух массивов и удаление дубликатов

          Я создаю форму в Excel с двумя текстовыми полями, содержащими значения, разделенные знаком ";".Я хочу прочитать каждое из значений текстового поля и сохранить их в виде массивов, а затем объединить их в третий массив, удаляя дубликаты. То, что у меня есть до сих пор, похоже, не работает для создания комбинированного массива.

          Итак, я использую следующую функцию:

          КОД --> VBA

          Затем я проверяю это, используя следующий код

          КОД --> VBA

          selectedClosureReasonsTxt.Text в настоящее время имеет "ABR;ACS;"
          selectedRecallReasonsTxt.Text в настоящее время имеет "ABR;DIS;"

          Когда я запускаю код, мой вывод:
          1 ACS
          2
          3 DIS
          4

          Мне кажется, что он не читает данные в первом элементе массива. У кого-нибудь есть идеи, как это решить? Или можете предложить лучшее решение, чтобы я получил окончательный список уникальных значений из обоих текстовых полей в массиве

          Заранее большое спасибо

          <р>1. Зачем начинать с Counter = 1? Вы теряете свой первый элемент.

          <р>2. Зачем заканчивать строки символом ;? это добавляет пустой элемент.

          Каждый из ваших массивов имеет верхнюю границу 2, что означает наличие 3 элементов. Нижняя граница для каждого равна 0. Поэтому при объединении UBound + 1 для каждого массива, а затем, наконец, вычтите 1.


          Пропустить,

          Просто обменял свою СТАРУЮ тонкость.
          Нюанс!

          Почему вы так все усложняете? В зависимости от требований и значения точки с запятой в конце, вы можете
          - объединить тексты текстовых полей сначала с "&",
          - разделить,
          - использовать коллекцию для создания уникального списка с фильтрацией пустых строк при необходимости.

          Причина ";" заключается в том, что я использую список с флажками, чтобы пользователь мог выбрать коды, затем это заполняет текстовое поле. ";" разделение означает, что я могу отображать их пользователю в знакомом ему формате и могу отображать огромное количество кодов в одном текстовом поле без прокрутки (оба текстовых поля контролируются разными списками). Затем из пользовательского ввода я использую различные значения для создания кода SQL.

          Пропустить, спасибо, это решило мою проблему. Не могу поверить, что пропустил Ubound + 1.

          Combo, спасибо, что указали, как я усложнил соединение двух входных данных. Я снова стал жертвой дурной привычки прыгать в код без полного планирования того, что я хотел, и начал работать с моей первой идеей.

          Еще раз спасибо, ребята, как всегда, я ценю ваши мудрые слова мудрости.

          Отправлено предупреждение

          Благодарим вас за помощь в защите форумов Tek-Tips от неприемлемых сообщений.
          Персонал Tek-Tips проверит это и примет соответствующие меры.

          Ответить в этой теме

          Размещение сообщений на форумах Tek-Tips доступно только для участников.

          Нажмите здесь, чтобы присоединиться к Tek-Tips и пообщаться с другими участниками! Уже участник? Войти

          Читайте также: