Visual Basic, цикл массива VBA

Я использовал http://www.homeandlearn.org/arrays_and_loops.html, чтобы помочь мне в этом.

У меня есть подключения к данным, которые фильтруются в одну таблицу. К сожалению, один из источников случайно помещает неверные данные (обычно дату) в неправильный столбец (столбец «Клиент»), когда программа экспортирует файл в Excel. То, что я хотел бы сделать, это нечто похожее на функцию index / match. Я хотел бы проверить каждый номер бронирования в этой мастер-таблице (A) против другой таблицы (B) в той же книге. Если номер резервирования с другого листа (B) совпадает с номером резервирования в главной таблице (A), я хотел бы иметь правильное значение Клиента, введенное в основную таблицу (A). Я все еще довольно новичок в VBA, поэтому любая помощь ценится. Я пытался изменить свой код здесь и там, но безрезультатно. Кроме того, я изначально запускал это как практику без реальных данных, поэтому я не испортил свой исходный файл. Я попытался добавить соответствующий синтаксис, чтобы ссылаться на другие листы, и что-то не так, я полагаю, что это можно было бы ввести неверно. Вот ближайший исходный код, который я придумал:

Sub TransferData() Dim MyArray(1 To 19) As Single MyArray(1) = 81899 MyArray(2) = 87172 MyArray(3) = 87275 MyArray(4) = 87394 MyArray(5) = 87446 MyArray(6) = 87496 MyArray(7) = 87621 MyArray(8) = 87631 MyArray(9) = 87726 MyArray(10) = 87822 MyArray(11) = 87858 MyArray(12) = 88041 MyArray(13) = 88097 MyArray(14) = 88127 MyArray(15) = 88160 MyArray(16) = 88191 MyArray(17) = 88359 MyArray(18) = 88487 MyArray(19) = 88545 For i = 1 To 19 If Worksheets("Sheet1").Range("B" & i).Value = MyArray(i) Then Worksheets("Sheet2").Range("P" & i).Value = _ Worksheets("Sheet1").Range("E" & i).Value End If Next i End Sub 

Я не помню ошибку, потому что код был не таким, как указано выше, но рядом с ним. Я считаю, что проблема, с которой он столкнулся, заключалась в том, что когда переменная i превысила 19, система не могла найти массивы> 19. Мне нужно VBA для проверки 19 массивов в постоянно меняющемся количестве строк, которое в настоящее время находится в 3k +. Я попытался добавить другое мышление переменных, если бы я сохранил переменные отдельно, я мог бы VBA проверить 19 массивов на все строки. Вот код, который я придумал для этого.

 Sub TransferData() Dim MyArray(1 To 19) As Single MyArray(1) = 81899 MyArray(2) = 87172 MyArray(3) = 87275 MyArray(4) = 87394 MyArray(5) = 87446 MyArray(6) = 87496 MyArray(7) = 87621 MyArray(8) = 87631 MyArray(9) = 87726 MyArray(10) = 87822 MyArray(11) = 87858 MyArray(12) = 88041 MyArray(13) = 88097 MyArray(14) = 88127 MyArray(15) = 88160 MyArray(16) = 88191 MyArray(17) = 88359 MyArray(18) = 88487 MyArray(19) = 88545 For i = 1 To 5000 For j = 1 To 19 If Worksheets("Sheet1").Range("B" & i).Value = MyArray(j) Then Worksheets("Sheet2").Range(i, 16).Value = Worksheets("Sheet1"). _ Range(i,5).Value Next j End If Next i End Sub 

С помощью этого кода я получаю ошибку компиляции: Далее без For. В поиске в Интернете я обнаружил, что это может быть потому, что у меня есть 2 «For» s, оператор if, «следующий» оператор в выражении if, затем другой «следующий» оператор вне цикла. Я думал, что это нужно сделать так, чтобы каждая ячейка в столбце B проверялась на все возможности массива.

См. Рисунки ниже. Мне нужно значение столбца P (фактическое имя фактуры) из листа: TMRtoSPIde, которое должно быть введено в колонку D (имя фактуры) на листе: RawData, когда номер резервирования в столбце K из листа: TMRtoSPIde соответствует резервированию в листе: RawData. Вы увидите лист: RawData имеет ошибочную 5-значную серийную дату в столбце «Идентификатор фактуры». Это то, что я пытаюсь заменить.

введите описание изображения здесь

введите описание изображения здесь

Словари и коллекции идеально подходят для сопоставления уникальных значений. В этом примере я использую Scripting.Dictionary для хранения уникальных идентификаторов и ссылок на EntireRow которые они найдены.

Примечание: Range().Range() вернет ссылку, Range("A10").EntireRow.Range("ZZ1").Address к первому объекту диапазона (например, Range("A10").EntireRow.Range("ZZ1").Address возвращает $ZZ$10 ).

Было бы проще хранить только необходимое значение, я просто хотел продемонстрировать, что вы можете хранить ссылки на объекты в словаре. Важно отметить, что вы можете хранить объекты как ключи и / или значения в словаре. Обычная ошибка, которую люди совершают, заключается в том, чтобы попытаться сохранить ссылки диапазона в качестве dictionary.Add Cells(1,1), Cells(1,2) будут хранить ссылку на Cells(1,1) в качестве ключа и Cells(1,2) поскольку это ценность. Проблема заключается в том, что словари не знают, как сравнивать ячейки, и вы не сможете искать свои ценности на основе ключевых отношений. dictionary.Add Cells(1,1).Value, Cells(1,2) – правильный синтаксис.

 Sub TransferData() Dim r As Range, Source As Range Dim d As Object Set d = CreateObject("Scripting.Dictionary") With Worksheets("TMRtoSPIde") For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp)) If Not d.Exists(r.Value) Then d.Add r.Value, r.EntireRow Next End With With Worksheets("RawData") For Each r In .Range("B2", .Range("B" & .Rows.Count).End(xlUp)) If d.Exists(r.Value) Then r.EntireRow.Range("K1").Value = d(r.Value).Range("P1").Value End If Next End With End Sub 

Ваша петля должна быть примерно такой:

 For i = 1 To 5000 For j = 1 To 19 If Worksheets("Sheet1").Cells(i, "B").Value = MyArray(j) Then Worksheets("Sheet2").Cells(i, "P").Value = Worksheets("Sheet1").Cells(i, "E").Value 'Exit from the "For j" loop if we found a match Exit For End If Next j Next i 
  • SUMPRODUCT для разброса строк за строкой с датой в виде строки
  • как сделать a для Loop в массиве в vba
  • Копирование динамического массива приводит к ошибке подстрочного индекса
  • Удалить элемент из массива по положению
  • Powershell Excel Добавить строку из массива
  • Excel> Найти первое первое / низкое ненулевое значение в несортированном массиве
  • Ruby WIN32OLE excel chart seriescollection значения
  • Средневзвешенная функция
  • Добавление значений в массив при очистке
  • excel match год и месяц в массиве
  • Элемент настройки «m» в переменной массива равен значению из активной строки в другом столбце
  • Interesting Posts

    Не удалось скрыть строку Excel 2003 из функции, вызванной из формулы

    Как изменить отступ для экспорта данных XML в Excel?

    Изменение свойств шрифта нескольких ячеек на основе значения одной ячейки

    Как печатать заголовки столбцов по данным бокового стола из веб-страницы, чтобы преуспеть с webdriver

    Код VBA – сохранение форматирования для данных, скопированных на другой лист

    Для каждой следующей ошибки несоответствия

    Есть ли простой способ предоставить возможность открыть Excel на экспорт форме SSRS reportviewer управления?

    Использовать идентификатор из родительской таблицы при импорте дочерней таблицы в MySQL

    C # Visual Studio инструменты для офиса дает эту ошибку: Excel сталкивается с проблемами с надстройкой X

    Как получить сумму разных значений ячейки в excel с помощью POI

    Excel VBA Проверка данных Ошибка VBA Runtime 1004 «Определенная пользователем или объектная ошибка»

    Почему мои пробелы не обрезаны

    Excel VBA: найдите параметр, скопируйте найденную строку в другую таблицу (вставляя начало в определенную ячейку)

    Скомпилировать список / резюме определенной ячейки из нескольких книг с VBA?

    Запись в файл xls excel с использованием графического интерфейса пользователя

    Давайте будем гением компьютера.