Vba сравнение двух массивов

Что касается проблемы, мне нужно иметь возможность сравнивать все данные в массиве вариантов A со всеми данными в массиве вариантов B. Я знаю, что мне нужен какой-то двойной цикл (чтобы каждое значение A проверялось по всем значениям B), но Я не могу понять, как это сделать. Вот что у меня так далеко:

Итак, trgtRange — это вариант A, а tempRange — это вариант B. Я знаю, что мог бы установить вариант B немного проще, но я уже сделал это таким образом. В конце концов, код должен быть отполирован как последняя операция в любом случае.

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

1 ответ

Вот мой ответ. Зачем вам нужно две петли, чтобы сделать это. Некоторые относительные адресации решают эту проблему довольно хорошо. Настройте электронную таблицу следующим образом:

и ваш код просто это

Комментарии в коде объясняют, как это работает. Это лучше, чем двойной цикл, потому что относительные ссылки быстрее, использование памяти более эффективно, и вам нужно сделать только один проход в каждой строке.

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

4 Kotty [2015-08-13 12:33:00]

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

Читайте также:  Mw3 системные требования на pc

Проблема с этим кодом, помимо его неэффективности (что не является проблемой, поскольку оба массива очень малы) заключается в том, что LastRow: а) изменяется с каждой добавленной строкой, б) только учитывает LastRow в массиве1, поэтому, если массив2 больше, он не идет полностью вниз, c) если ячейка пуста, она добавляет строку с пустой ячейкой в ​​соответствующий массив, даже если я добавлю

Я знаю, что решение, вероятно, связано с определением обоих массивов и использованием LBound для Ubound, но я не мог обвести его вокруг. Большое спасибо за помощь!

EDIT: Последняя строка, кажется, теперь исправлена, однако я все еще не могу каким-то образом пропускать пустые ячейки и ячейку в последней, которая содержит текст "Grand Total" внутри и, следовательно, не сортируется в отличие от остальной части диапазона. У кого-нибудь есть идеи, как обойти это? Вот как выглядит код:

ИЗМЕНИТЬ 2: Я понял это наконец! Я добавил еще одно условие, чтобы добавить строку в противоположную таблицу, если она найдет значение "Grand Total". Не нужно беспокоиться о пустых ячейках!

arrays vba excel

1 ответ

1 Решение Miss Palmer [2015-08-13 13:15:00]

хороший аккуратный вопрос для перемен! Вот мои мысли о первых двух частях:

a) с циклом for, начальные условия (Lastrow в этом случае) считываются только при запуске цикла, поэтому, если вы меняете Lastrow во время цикла, цикл будет выполняться только до исходного значения.

чтобы обойти это, вы могли бы реструктурировать его как цикл while. используя общий пример:

b) почему бы не просто оценить оба и выбрать большее из двух?

c) закончилось здесь, надеюсь, кто-то другой может помочь.

У меня есть два 2D массива (назовем их А и В) и содержащий серийные номера на элемент 0 и даты в элементе 1. Многие из серийных номеров в А находятся в B (около 60%). Там, где есть матч нужно проверить, если соответствующая дата в массиве B меньше, чем дата в массиве А, если так, то установите дату в пустое значение.

Читайте также:  Normal mode перевод на русский

В настоящее время я использую цикл внутри цикла:

Это прекрасно работает, но медленно (около 30 — 40 секунд), так что я пытался разработать другие методы, некоторые из них довольно дурацким, таких как

который занимает в два раза дольше, и вам необходимо обрабатывать не найденных ошибок.

Я попытался создать два один одномерные массивы (сериальные, даты) вместо 2D arrayB и использование application.match для обеспечения индекса на сегодняшний день, но это опять-таки занимает примерно в два раза дольше, чтобы закончить. В конце концов я не пытался писать данные на лист, получая даты через ВПР и сравнивая их, но это не быстрее, и это на самом деле не то, что я хочу.

Любые мысли оценили.

Вот некоторые основы для сравнения дат на основе серийных номеров.

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

¹/₃ секунду на 30K строк случайных данных в обоих Лист1 и Лист2.

Rate this post

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *