Обновление ячейки с помощью App.Match — быстрее, чем App.VLookup?

Я пытаюсь найти ключевое значение «Данные PR» в «Данных PR Windchill». После обнаружения я хотел бы скопировать 6-ю ячейку справа от найденной в «PR Data Windchill» и вставить обратно в исходный ключ в 6-й ячейке справа в «PR Data».

Я пробовал использовать Application.VLookup, и, хотя это работало, это было медленно. Я работаю с диапазонами данных длиной от 50 000 до 100 000 элементов.

Function Update()

Dim Master As Worksheet
Dim Slave As Worksheet
Dim lrS As Long
Dim i As Long, m, SLookup As Range

Set Master = ThisWorkbook.Worksheets("PR Data Windchill")
Set Slave = ThisWorkbook.Worksheets("PR Data")

Set SLookup = ThisWorkbook.Worksheets("PR Data Windchill").Columns(1)

lrS = Slave.Cells(Slave.Rows.Count, "A").End(xlUp).Row

With Slave
    For i = 7 To lrS
        Select Case .Range("G" & i)
        Case Is = "" '"Open", "Under Review", "Accepted"
        m = Application.Match(.Rows(i).Cells(1).Value, SLookup, 0)
        .Rows(i).Cells(1).Offset(0, 6).Copy Slave.Rows(i).Cells(1).Offset(0, 6)
        End Select
    Next i
End With

Application.CutCopyMode = False

MsgBox ("Status Update Complete")

End Function

Используйте словари и массивы. Это займет несколько секунд. Здесь вопрос, похожий на ваш.

Damian 22.05.2019 15:37
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
1
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Предполагая, что в столбце A на любом листе нет пробелов, а первая строка данных - это строка 1...

Function Update()

Dim Master As Worksheet
Dim Slave As Worksheet

Set Master = ThisWorkbook.Worksheets("PR Data Windchill")
Set Slave = ThisWorkbook.Worksheets("PR Data")

Dim dict As Object
Set dict = CreateObject("Scripting.Dictionary")

Dim rc As Long
rc = 1
Do Until Master.Cells(rc, 1) = ""
    If Not dict.Exists(Master.Cells(rc, 1).Value) Then dict.Add Master.Cells(rc, 1).Value, Master.Cells(rc, 7).Value
    rc = rc + 1
Loop

rc = 7 'changed from 1
Do Until Slave.Cells(rc, 1) = ""
    If Slave.Cells(rc, 7).Text = "" Then
        If dict.Exists(Slave.Cells(rc, 1).Value) Then Slave.Cells(rc, 7) = dict(Slave.Cells(rc, 1).Value)
    End If
    rc = rc + 1
Loop

MsgBox ("Status Update Complete")

End Function

Пропусков в ключевых ячейках нет. Столбец А одинаков на обоих листах. Данные в «PR Data Windchill» начинаются со строки 2, а данные в «PR Data» — с строки 7.

benwalden 22.05.2019 15:59

Просто нужно изменить вторую инициализацию «rc», как указано выше. Как правильно заметил Дэмиен, словари работают намного быстрее, когда делают такие вещи.

user11509084 22.05.2019 16:07

Словари вместе с массивами, вы все еще работаете на листе. Работа с листом увеличивает время выполнения, если вы поместите все в массивы, выполнение будет еще быстрее.

Damian 22.05.2019 16:24

Итак, мой исходный код смотрел только на пустые ячейки (Case Is = ""), но теперь я хочу заставить его работать (Case Is = "Открыто", "На рассмотрении", "Принято"). Могу ли я изменить Do Until... = "" на другие мои случаи?

benwalden 22.05.2019 16:43

Часть, которую нужно изменить, это Slave.Cells(rc, 7).Text = "". Так что у вас будет If Slave.Cells(rc, 7).Text = "" or Slave.Cells(rc, 7).Text = "Open" or ... Then. Есть несколько способов сделать это, но это самый простой

user11509084 23.05.2019 11:33

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