DS28
@DS28
Аналитик (недоматематик, недопрограммист)

Как ускорить копирование (ВПР) картинок в Excel (VBA)?

На первом листе есть 100-1500 строк; в 15 столбце (O) записаны имена, которые повторяются.
На втором листе именам в соответствие поставлены картинки одинакового размера и формата, всего 30-40 штук.
Цель - подтягивать картинки в первую таблицу (она будет обновляться вставкой данных извне)

Есть код, который на малых выборках работает, но подвисает на полных.
Есть идеи как ускорить?
Код
Sub push()
Application.ScreenUpdating = False
Application.EnableEvents = False
Application.Calculation = xlCalculationManual
    Dim Row1 As Integer, Row2 As Integer, i As Integer
    Dim sh1 As Worksheet, sh2 As Worksheet
    
    Set sh1 = Sheets("Лист1")
    Set sh2 = Sheets("Лист2")
    Row1 = sh1.Cells(Rows.Count, 15).End(xlUp).Row
    Row2 = sh2.Cells(Rows.Count, 1).End(xlUp).Row

    For i = 8 To Row1
        If sh1.Cells(i, 15).Value > 0 Then
            sh2.Range("A2:A" & Row2).Find(what:=sh1.Cells(i, 15).Value, LookIn:=xlValues).Offset(0, 1).Copy
            sh1.Activate
            sh1.Cells(i, 16).Select
            ActiveSheet.Pictures.Paste(Link:=True).Select
        End If
        Application.CutCopyMode = False
    Next i
    
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
End Sub


Может есть более эффективный способ подтягивать картинки? Из папки или ещё как?
Цель: собирать pdf с картинками на основе данных из первой таблицы.
  • Вопрос задан
  • 1457 просмотров
Решения вопроса 1
honor8
@honor8
Принципы быстродействия VBA в описании
У объекта коллекции Sheets.Shapes.Item(1) есть свойство Left и Top, если второе задаётся значением высоты строки, то первое зависит от множества других параметров. Картинка находится не в ячейке, как это кажется на первый взгляд. Поэтому лучше сразу задавать рисунку имя Shapes.Item(1).Name.

Уберите методы Activate и Select, - макрос будет работать быстрее. Например, вот так:
sh2.Shapes.Item(1).Copy
sh1.Pictures.Paste

ЗЫ, в подобных задачах полезно пользоваться отладчиком: View -> Locals Window
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы