Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.61/18: Рейтинг темы: голосов - 18, средняя оценка - 4.61
3 / 3 / 0
Регистрация: 29.11.2013
Сообщений: 89

Зависание Excel при выполнении макроса подстановки картинок

11.05.2014, 14:16. Показов 3921. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Подскажите как можно убрать зависание Excel при подтягивании примерно 10 000 картинок?

Подставляю картинки следующим макросом:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
Sub фото()
Dim Foto_put As String
Dim lLastRow As Long
 
lLastRow = Cells(Rows.Count, 1).End(xlUp).Row
 
For i = 2 To lLastRow
    Foto_put = "C:\Users\iaks\Desktop\Foto-bank\FSB\" & Cells(i, 3).Value & ".jpg"
    ВставитьКартинку Cells(i, 11), Foto_put, True, True, True
    
    
    Next i
 
 
 
End Sub
Function ВставитьКартинку(ByRef PicRange As Range, ByVal PicPath As String, _
                     Optional ByVal AdjustWidth As Boolean, _
                     Optional ByVal AdjustHeight As Boolean, _
                     Optional ByVal AdjustPicture As Boolean = False)
    ' ==========  функция получает в качестве параметров:  ====================
   ' PicRange - прямоугольный диапазон ячеек, поверх которого будет расположено изображение
   ' PicPath - полный путь к файлу картинки (файл в формате JPG, BMP, PNG, и т.д.)
   ' AdjustWidth - если TRUE, то включен режим подбора ширины (подгонка по высоте)
   ' AdjustHeight - если TRUE, то включен режим подбора высоты (подгонка по ширине)
   ' AdjustPicture - если TRUE, то подгоняются размеры картинки под ячейку,
   '                 если FALSE (по умолчанию), то изменяются размеры ячейки
   ' [url]http://excelvba.ru/code/PastePictures[/url] - ссылка на оригинал статьи
 
    On Error Resume Next: Application.ScreenUpdating = False
    ' вставка изображения на лист
   Dim ph As Picture: Set ph = PicRange.Parent.Pictures.Insert(PicPath)
    ' совмещаем левый верхний угол ячейки и картинки
   ph.Top = PicRange.Top: ph.Left = PicRange.Left
 
    K_picture = ph.Width / ph.Height    ' вычисляем соотношение размеров сторон картинки
   K_PicRange = PicRange.Width / PicRange.Height    ' вычисляем соотношение размеров сторон диапазона ячеек
 
    If AdjustPicture Then    ' ПОДГОНЯЕМ РАЗМЕРЫ ИЗОБРАЖЕНИЯ под ячейку (оптимальный вариант)
 
        ' если AdjustWidth=TRUE, то высоту не трогаем - изменяем ширину
       If AdjustWidth Then ph.Width = PicRange.Width: ph.Height = ph.Width / K_picture
 
        ' если AdjustHeight=TRUE, то ширину не трогаем - изменяем высоту
       If AdjustHeight Then ph.Height = PicRange.Height: ph.Width = ph.Height * K_picture
 
        ' AdjustWidth=TRUE и AdjustHeight=TRUE: вписываем картинку в ячейку (без соблюдения пропорций)
       If AdjustWidth And AdjustHeight Then ph.Width = PicRange.Width: ph.Height = PicRange.Height
 
 
    Else    ' ИЗМЕНЯЕМ РАЗМЕРЫ ЯЧЕЙКИ под размеры изображения (нежелательно при вставке НЕСКОЛЬКИХ картинок...)
 
        If AdjustWidth Then    ' если AdjustWidth=TRUE, то высоту не трогаем - изменяем ширину
           PicRange.Cells(1).ColumnWidth = PicRange.Cells(1).ColumnWidth * ph.Width / PicRange.Cells(1).Width
            While Abs(PicRange.Cells(1).Width - ph.Width) > 0.1    ' точный подбор ширины ячейки
               PicRange.Cells(1).ColumnWidth = PicRange.Cells(1).ColumnWidth - 0.2 * (PicRange.Cells(1).Width - ph.Width)
            Wend
        End If
 
        If AdjustHeight Then    ' если AdjustHeight=TRUE, то ширину не трогаем - изменяем высоту
           PicRange.Cells(1).RowHeight = PicRange.Cells(1).RowHeight * ph.Height / PicRange.Cells(1).Height
            While Abs(PicRange.Cells(1).Height - ph.Height) > 0.1    ' точный подбор высоты ячейки
               PicRange.Cells(1).RowHeight = PicRange.Cells(1).RowHeight - 0.2 * (PicRange.Cells(1).Height - ph.Height)
            Wend
        End If
 
    End If
End Function

При подстановке примерно 100 фоток все подставляется молниеносно.
Может как-то можно сделать чтобы фото подставлялись блоками по 100-300 штук? Но как это осуществить?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
11.05.2014, 14:16
Ответы с готовыми решениями:

Не получается запретить сообщение Excel при выполнении макроса
Private Sub Workbook_BeforeClose(Cancel As Boolean) Dim Soobshenie As Variant Dim Imja1 As String, Imja2 As String Dim Stroka As Long...

Зависание формы при потере фокуса при выполнении в ней фоновых операций
Здравствуйте, коллеги. Возник следующий вопрос, который не получается решить самостоятельно. Информации по нему найти не удалось,...

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

8
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
11.05.2014, 21:51
iaks,
1. В модуле где сейчас код сверху добавьте
Visual Basic
1
2
3
4
Public Const FLDR$ = "C:\Users\iaks\Desktop\Foto-bank\FSB\"
Public Const PART& = 300 'по сколько фоток вставлять
 
Public lastRow&, j&, i&, Foto_put$
При необходимости меняйте константы тут.
2. Вставьте на лист кнопку CommandButton1 из элементов ActiveX. В модуль листа напишите
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Private Sub CommandButton1_Click()
If lastRow = 0 Then '1-st pass
  lastRow = Cells(Rows.Count, 1).End(xlUp).Row
  i = 2
  CommandButton1.Width = 160
End If
If i > lastRow Then CommandButton1.Enabled = False: Exit Sub
If i + PART > lastRow Then j = lastRow Else j = i + PART
CommandButton1.Caption = i & " - " & j & " из " & lastRow
For i = i To j
  Foto_put = FLDR & Cells(i, 3).Value & ".jpg"
  ВставитьКартинку Cells(i, 11), Foto_put, True, True, True
Next
End Sub
После очередного нажатия на кнопку на ней будут отображаться номера строк, заполненных при нажатии.
1
3 / 3 / 0
Регистрация: 29.11.2013
Сообщений: 89
11.05.2014, 22:03  [ТС]
Хороший вариант, но хочется сделать чтобы обрабатывалось по нажатию одной кнопки один раз.

т.е алгоритм следующий:

Макрос вставил первый блок фото
Подождали некоторое время
Макрос вставил второй блок фоток
....
Вставили последний блок фоток

Как можно сделать задержку?
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
11.05.2014, 22:13
iaks, ожидание ничего не даст, только увеличит время. Попробуйте с кнопкой, чтобы понять, после какого числа фоток наступает торможение.
А нельзя ли фотки разместить на нескольких листах?
0
3 / 3 / 0
Регистрация: 29.11.2013
Сообщений: 89
11.05.2014, 23:13  [ТС]
500 немного "подумав" проскакивает нормально
1000 уже зависает

Фото необходимо разместить на одном листе
Есть в обще какие-то ограничения в Excel на количество фоток на листе?

Добавлено через 44 минуты
После каждого нажатия кнопки вставка фото осуществляется все медленней.

Начиная с 3000 строки - время подстановки 300 шт. фоток составляет около минуты

Добавлено через 3 минуты
Переключился на браузер чтобы отписаться .... и теперь не могу сделать активной книгу Excel (((
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
11.05.2014, 23:42
iaks, каков объем фото (байты) и объем всей папки с фото?
При вставке в ячейку размер изображения уменьшается, как я понял. Может, перед вставкой уменьшить размер (в пикселах) всех фоток с помощью пакетной обработки в IrfanView, FastStone и т.п.? Экселю полегче будет.
1
3 / 3 / 0
Регистрация: 29.11.2013
Сообщений: 89
11.05.2014, 23:49  [ТС]
тоже думал, но надеялся что не придется, но увы
Фото по 30 КБ
536х357
0
15155 / 6428 / 1731
Регистрация: 24.09.2011
Сообщений: 9,999
12.05.2014, 01:23
iaks, итого 300 МБ фоток в одном файле Excel?
Срочно уменьшайте размер в 3-4 раза, чтобы объем упал не меньше, чем в 10 раз.
Если не предполагается менять положение картинок по отношению к друг другу (вставлять строки, сортировать строки), то можно в том же IrfanView создать вертикальный панорамный рисунок из 100...1000(...10000?) фоток и вставить за один раз.
1
3 / 3 / 0
Регистрация: 29.11.2013
Сообщений: 89
13.05.2014, 02:05  [ТС]
Да, видимо придется немного поменять задумку, так как файл с таким большим кол-вом тяжелых фото становится не транспортабельно-неперивариваемым )

Решил оставить миниатюры и ссылки на оригинал.
Для пакетной обработки фото использую кстати XnView
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
13.05.2014, 02:05
Помогаю со студенческими работами здесь

Зависание формы при выполнении цикла
Есть бот который выполняет get запросы каждые 30 секунд. Запрос находится в исключении, а исключение в цикле. Так вот, когда выполняется...

Необновление данных при выполнении макроса
Добрый день, коллеги. Решил поупражняться в VBA и написал небольшу игру, наподобие 21. Кидаешь кубик 3 раза, если набрал больше 11...

Type mismatch при выполнении макроса
Добрый день! Не могли бы Вы мне помочь. Я в программировании полный ноль, по работе достался макрос который переводит экслеевский файл в...

Остановка макроса при выполнении условия
Добрый день! Не могу разобраться почему заедает макрос. Суть макроса в следующем: при появлении данных в столбце В должна автоматически...

Защита от ошибок при выполнении макроса
Есть макрос: Dim lLastRow As Long lLastRow = Sheets("КП").Cells(Sheets("КП").Rows.Count, 3).End(xlUp).Row + 1 ActiveCell.Select ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru