VBA записывает несколько значений массива в несколько столбцов

Я пытался найти ответ на этот вопрос и ничего не нашел.

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

Когда я пишу обратно на лист, в настоящее время я использую следующий код:

Range("A" & StRow).Value = copyArr(newLine, 1)
Range("B" & StRow).Value = copyArr(wipLine, 2)
Range("C" & StRow).Value = copyArr(wipLine, 6)
...
Range("AA" & StRow).Value = copyArr(wipLine, 50)

Данные в каждом массиве не находятся в одном и том же месте в каждом (т.е. столбец 10 массива1 может быть столбцом 43 массива2 и т. д.).

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

Любой вклад приветствуется.

VBA записывает несколько значений массива в несколько столбцов

Возможно, вы захотите опубликовать небольшой скриншот своих данных — я не думаю, что понимаю, о чем вы спрашиваете.

SJR 17.03.2022 11:10

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

Toby 17.03.2022 11:40

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

Foxfire And Burns And Burns 17.03.2022 11:52

Итак, каков будет желаемый результат для этого?

SJR 17.03.2022 11:59

Извините, похоже, мой вопрос не так ясен, как я хотел. Я уже сравниваю столбцы/массивы в более раннем коде, но обратная запись на рабочие листы при выполнении условий означает, что мне нужно записывать каждую ячейку в строке отдельно из массива, поскольку порядок столбцов несопоставим между двумя массивами. Есть ли лучший способ написать обратно на листы, чем построчные инструкции, опубликованные в исходном вопросе?

Toby 17.03.2022 12:04

На примере изображения верхняя таблица — массив1, нижняя таблица — массив2. При переборе массивов, если UniqueID совпадает, мне нужно записать данные из массива1 в лист в позиции столбцов в массиве 2, т.е. Ref1 в массиве1 — это столбец A, а в массиве2 — столбец B и т. д.

Toby 17.03.2022 12:08

Вы можете использовать application.match, чтобы найти позицию столбца, которая будет действовать как номер столбца рабочей таблицы.

SJR 17.03.2022 13:02

Что вы ожидаете на выходе? Замечу, что иногда ID/Ref/Value совпадают, а иногда отличаются. В лучшем примере было бы как минимум два уникальных идентификатора и пример вывода.

Ron Rosenfeld 17.03.2022 13:26

@SJR Спасибо, я посмотрю на application.match.

Toby 17.03.2022 13:33

@RonRosenfeld ожидаемый результат - это данные сверху в соответствующие ссылки внизу, т. Е. Ref5 в нижней таблице должен быть «MNO».

Toby 17.03.2022 13:35

Разве это не то же самое, что сортировать столбцы массива 1 в том же порядке, что и в массиве 2?

Ron Rosenfeld 17.03.2022 14:00
Структурированный массив Numpy
Структурированный массив Numpy
Однако в реальных проектах я чаще всего имею дело со списками, состоящими из нескольких типов данных. Как мы можем использовать массивы numpy, чтобы...
T - 1Bits: Генерация последовательного массива
T - 1Bits: Генерация последовательного массива
По мере того, как мы пишем все больше кода, мы привыкаем к определенным способам действий. То тут, то там мы находим код, который заставляет нас...
Что такое деструктуризация массива в JavaScript?
Что такое деструктуризация массива в JavaScript?
Деструктуризация позволяет распаковывать значения из массивов и добавлять их в отдельные переменные.
0
11
49
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку исходные и целевые столбцы расположены в разном порядке, вам нужен какой-то способ сопоставления источника с целевым. Прямо сейчас вы выполняете сопоставление в коде, который записывает источник в пункт назначения. В результате вам потребуется строка кода для каждого сопоставления. Однако, если бы вы выполняли сопоставление в другой конструкции (например, в массиве), вы могли бы написать цикл для вывода. Вот пример:

    Dim source As Variant
    Dim dest As Variant
    Dim x As Integer
    
    source = Array(1, 2, 6, 50)
    dest = Array("A", "B", "C", "AA")
    
    For x = LBound(soruce) To UBound(source)
        Range(dest(x) + StRow).Value = copyArr(wipLine, source(x))
    Next

При первом прохождении цикла x будет равно 0, поэтому dest(x) будет равно "A", а source(x) будет равно 1. Поэтому:

Range(dest(x) + StRow).Value = copyArr(wipLine, source(x))

будет эквивалентно:

Range("A" & StRow).Value = copyArr(newLine, 1)

Во второй раз в цикле x будет равно 1, поэтому пункт назначения (x) будет равен «B», а источник (x) будет равен 2. Следовательно:

Range(dest(x) + StRow).Value = copyArr(wipLine, source(x))

будет эквивалентно:

Range("B" & StRow).Value = copyArr(newLine, 2)

Спасибо за это, я попробую этот метод. Я не думал об использовании большего количества массивов для сопоставления источника и назначения!

Toby 17.03.2022 13:39

@ Тоби, рад быть полезным. Если это сработает, я буду признателен за голосование и отметку этого ответа как правильного.

Gove 17.03.2022 13:58

Другие вопросы по теме