Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.02.2013, 14:50   #1
Aegi
Новичок
Джуниор
 
Регистрация: 06.02.2013
Сообщений: 9
По умолчанию Макрос по избирательному удалению картинок

Доброго времени суток!
Проблема в следующем - часто копирую страницы из интернета и помещаю их в Excel, вместе с нужными данными копируются и картинки. Картинки делятся на 2 группы - нужные и ненужные. Удалять ненужные даже используя функцию "выбор объекта" всё равно получается утомительно - количество их приближается к тысяче.
Заметил что при переносе в Excel ненужные картинки идут: в одном случае под чётными номерами, во втором под нечётными.
Помогите написать макрос по удалению их согласно чётности/нечётности номера картинки.
Высшим мастерством будет удаление ненужных картинок по их уникальным свойствам например размерам(все ненужные картинки имеют одинаковый отличный от нужных размер).
заранее благодарен.
Aegi вне форума Ответить с цитированием
Старый 06.02.2013, 15:24   #2
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Код работает с активным листом.
Код:
Sub Procedure_1()
    
    'В константах указываем нужные размеры рисунка.
    'Если размеры рисунков дробные (например, 100,1), то
        'могут возникнуть проблемы, т.к. в программировании проблемы
        'с использованием дробных чисел. Поэтому, если есть возможность,
        'лучше работать с целыми числами или нужно принудительно округлять 
        'числа, даже если мы видим, что число и так имеет нужный вид.
        'Проблемы могут быть в том, что указанные вами размеры не будут
        'совпадать с размерами рисунков, хотя всё визуально кажется точно.
    'Double - используется для работы с дробными числами.
    'Long - используется для работы с целыми числами.
    Const myWidth As Double = 100
    Const myHeight As Double = 100

    Dim myShape As Excel.Shape
    Dim i As Long
    
    '1. Отключаем обновление монитора, чтобы код быстрее работал.
    Application.ScreenUpdating = False
    
    'Если что-то удаляем, то лучше двигаться с конца в начало,
        'т.к. порядковые номера (и может быть ещё что-нибудь) меняются.
    For i = ActiveSheet.Shapes.Count To 1 Step -1
    
        '2. Даём VBA-имя "myShape" рисунку для удобства написания кода.
            'Через это имя будем управлять рисунком.
        Set myShape = ActiveSheet.Shapes(i)
        
        '3. Узнаём размеры рисунка. Размеры в пунктах.
        If myShape.Width = myWidth And myShape.Height = myHeight Then
            '4. Удаляем рисунок.
            myShape.Delete
        End If
        
    Next i
    
    '5. Включаем обновление монитора.
    Application.ScreenUpdating = True
    
    '6. Сообщение, что работа кода завершена.
    MsgBox "Работа кода завершена.", vbInformation
    
End Sub

Последний раз редактировалось Скрипт; 07.02.2013 в 09:00.
Скрипт вне форума Ответить с цитированием
Старый 06.02.2013, 16:21   #3
Aegi
Новичок
Джуниор
 
Регистрация: 06.02.2013
Сообщений: 9
По умолчанию

Сразу вопрос (из свойств и размера рисунка) высота 0.64,ширина 0.77 - как правильно записывать в константы? Просто записал как
Const myWidth As Double = 0.77
Const myHeight As Double = 0.64
Числа дробные, действительно проблема - ничего не происходит при выполнении кода.

Может всё таки проще по условию чётности/нечётности удалять?

Последний раз редактировалось Aegi; 06.02.2013 в 16:23.
Aegi вне форума Ответить с цитированием
Старый 06.02.2013, 16:26   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Размеры задаются в пикселах - соответственно, таких дробных размеров у картинок быть не может.

Поглядите также эту программу для работы с картинками:
http://excelvba.ru/programmes/PastePictures

Она умеет не только вставлять картинки, но и удалять их (как со всего листа, так и из выделенного диапазона ячеек)
Может, получится как-то выделить ячейки, где расположены неподходящие картинки
EducatedFool вне форума Ответить с цитированием
Старый 06.02.2013, 16:39   #5
Aegi
Новичок
Джуниор
 
Регистрация: 06.02.2013
Сообщений: 9
По умолчанию

Благодарю Скрипта за код(адаптирую его под другие нужды)), EducatedFool - надстройка действительно помогла и решила проблему,вам также спасибо).
Aegi вне форума Ответить с цитированием
Старый 06.02.2013, 16:50   #6
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Aegi, ширина и высота в VBA в данном случае измеряется в пунктах.
Скрипт вне форума Ответить с цитированием
Старый 06.02.2013, 22:56   #7
Aegi
Новичок
Джуниор
 
Регистрация: 06.02.2013
Сообщений: 9
По умолчанию

Скрипту

Sub Procedure_1()

Set etShape = ActiveSheet.Shapes("Picture 2")

Dim myShape As Excel.Shape
Dim i As Long

Application.ScreenUpdating = False

For i = ActiveSheet.Shapes.Count To 1 Step -1

Set myShape = ActiveSheet.Shapes(i)

If myShape.Width = etShape.Width And myShape.Height = etShape.Height Then
myShape.Delete
End If

Next i

Application.ScreenUpdating = True

MsgBox "Работа кода завершена.", vbInformation

End Sub

etShape("Picture 2") - ненужная картинка размеры которой использую для условия удаления.
Константы не могу использовать по причине незнания значений высоты и ширины картинки для VB.
Данный макрос работает, но есть один нюанс - когда доходит до сравнение эталона с эталоном и он удаляется, код прерывается из за отсутствия объекта для сравнения.
Подскажите как занести только значения размеров эталона, чтобы даже если он удалён его размеры остались.

Последний раз редактировалось Aegi; 07.02.2013 в 00:36.
Aegi вне форума Ответить с цитированием
Старый 07.02.2013, 01:13   #8
Казанский
Старожил
 
Аватар для Казанский
 
Регистрация: 31.12.2010
Сообщений: 2,133
По умолчанию

Код:
Sub Procedure_1()

Dim myShape As Excel.Shape
Dim i As Long, etWid, etHei

etWid = ActiveSheet.Shapes("Picture 2").Width
etHei = ActiveSheet.Shapes("Picture 2").Height

Application.ScreenUpdating = False

For i = ActiveSheet.Shapes.Count To 1 Step -1

Set myShape = ActiveSheet.Shapes(i)

If myShape.Width = etWid And myShape.Height = etHei Then
myShape.Delete
End If

Next i

Application.ScreenUpdating = True

MsgBox "Работа кода завершена.", vbInformation

End Sub
exceleved@yandex.ru Яндекс.Деньги: 410011500007619
Казанский вне форума Ответить с цитированием
Старый 07.02.2013, 09:05   #9
Скрипт
Форумчанин
 
Регистрация: 24.12.2012
Сообщений: 776
По умолчанию

Aegi, размеры рисунка в пунктах можно узнать так:
  1. перейдите в программу Excel и кликнете по рисунку, у которого надо узнать размеры;
  2. перейдите в программу VBA;
  3. View - Immediate Window. Откроется окно;
  4. в это окно вставьте этот код и нажмите клавишу "Enter". Будет получена ширина рисунка в пунктах.
    Код:
    print selection.shaperange(1).width
  5. удалите из окна код и вставьте этот код. Будет получена высота рисунка в пунктах.
    Код:
    print selection.shaperange(1).height
Скрипт вне форума Ответить с цитированием
Старый 07.02.2013, 09:53   #10
Aegi
Новичок
Джуниор
 
Регистрация: 06.02.2013
Сообщений: 9
По умолчанию

Узнал размеры через эти команды, подставил по первому коду всё работает. Огромное спасибо вам Скрипт).
Aegi вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Макрос для сохранения всех картинок из Word в файл Nitro Microsoft Office Word 5 24.05.2012 21:05
Как создать правильный скрипт, по удалению не нужных строк? wwizard Microsoft Office Excel 5 26.02.2010 18:35
Помогите пожалуйста написать макрос для автоматической пронумеровки картинок в Word Spot123 Microsoft Office Word 0 24.12.2009 09:22
Помогите решить проблему по удалению записи из DBGrid. Droid БД в Delphi 34 02.07.2009 13:39
Программа по удалению мусора KORN Софт 12 31.10.2007 08:58