Статьи из блога

Макрос массового уменьшения размеров всех рисунков

Иван задал вопрос:

Есть документ Word с картинками (их много) и текстом. Необходимо "ужать" количество страниц. Уменьшить шрифт текста - понятно, но как уменьшить размер всех картинок одновременно, скажем, на 50%?

Сделать это можно с помощью следующего макроса:

 

Первый вариант:

Sub changeImages()
Dim iShape As InlineShape 
For Each iShape In ActiveDocument.InlineShapes 
  iShape.Height = iShape.Height * 0.5 
  iShape.Width = iShape.Width * 0.5 
Next iShape 
End sub

Второй вариант для объектов класса Shape или InlineShape:

Sub changeImages2()
Dim pic As Object
On Error Resume Next
For Each pic In ActiveDocument.Content.InlineShapes 
  If pic.Type = wdInlineShapePicture Then 
    pic.Height = pic.Height / 2 
    pic.Width = pic.Width / 2 
  End If 
Next 
For Each pic In ActiveDocument.Content.ShapeRange 
  If pic.Type = msoPicture Then 
    pic.Height = pic.Height / 2 
      If pic.LockAspectRatio = msoFalse Then 
        pic.Width = pic.Width / 2 
      End If 
  End If 
Next
End sub

twitter.com facebook.com vkontakte.ru odnoklassniki.ru mail.ru ya.ru rutvit.ru myspace.com technorati.com digg.com friendfeed.com pikabu.ru blogger.com liveinternet.ru livejournal.ru memori.ru google.com bobrdobr.ru mister-wong.ru yahoo.com yandex.ru del.icio.us

Еще записи по вопросам использования Microsoft Word:

Комментариев: 22

  1. Препарат
    10.11.2007 в 17:55 | #1

    Очень полезный макрос, спасибо за то, что не забываете о нас smile

  2. Алекс
    12.11.2007 в 01:20 | #2

    ScannerDoctor

    Пакет форматирования в MS Word отсканированных книг.

    Разработано на платформе MS Office Word 2003 SP2.

    Опробовано на документах полученных ABBYY FineReader 7-8.

    Автор: Александр, alex-mail@tut.by, Брест, 2005-2007.

    Скачать можно по адресу: http://alex-mail.at.tut.by/.

  3. Alex
    13.11.2007 в 17:08 | #3

    Надо найти поподробнее

  4. 28.01.2010 в 22:30 | #4

    Подскажите, будьте добры, что нужно изменить в этом макросе, чтобы он уменьшал размер рисунков не в процентах от исходного значения, а точно - в см?

    Т.е. нужно, допустим, чтобы все рисунки были по высоте 12 см. А ширина чтобы изменилась автоматически пропорционально.

  5. 29.01.2010 в 14:31 | #5

    Могу предложить вариант для изменения выделенного графического объекта (не всех, а конкретного выделенного объекта).

    Может кто предложить макрос для прохода по всем (!) графическим объектам?

    Sub changeSizeImage()
    'Изменение размера для выделенного графического объекта
    Dim hSp As Single
    Dim h As Single
    h = 12
    On Error Resume Next
    With Selection
      Select Case .Type
        Case Word.WdSelectionType.wdSelectionInlineShape
          hSp = PointsToCentimeters(.InlineShapes(1).Height)
          If hSp > h Then .InlineShapes(1).Height = CentimetersToPoints(h)
        Case Word.WdSelectionType.wdSelectionShape
          hSp = PointsToCentimeters(.ShapeRange.Height)
          If hSp > h Then .ShapeRange.Height = CentimetersToPoints(h)
        Case Else
          MsgBox "Не графический объект"
      End Select
    End With
    End Sub

  6. 29.01.2010 в 14:36 | #6

    Для всех картинок (InlineShape):

    Sub changeImages()
    Dim iShape As InlineShape
    Dim h As Single
    h = 12
    For Each iShape In ActiveDocument.InlineShapes
    If PointsToCentimeters(iShape.Height) > h Then iShape.Height = CentimetersToPoints(h)
    Next iShape
    End Sub

  7. 29.01.2010 в 14:40 | #7

    Для всех рисунков (Shape), типа автофигур:

    Sub changeImages2()
    Dim Sh As Shape
    Dim h As Single
    h = 12
    For Each Sh In ActiveDocument.Shapes
    If PointsToCentimeters(Sh.Height) > h Then Sh.Height = CentimetersToPoints(h)
    Next Sh
    End Sub

  8. 29.01.2010 в 15:43 | #8

    Антон, спасибо.

    Только не могу понять одну вещь. Макрос правильно работает на новых вставляемых в документ рисунках, но не работает на уже вставленых и изменённых/отформатированных ранее. Вообще ничего не происходит. Сверил все настройки рисунков, вроде бы всё совпадает (на новых и старых).

  9. 29.01.2010 в 15:51 | #9

    А также первый макрос (changeSizeImage) нельзя использовать если одновременно выделить два и более рисунка. Часто нужно изменить не все рисунки в документе, а выделить несколько штук и изменить их размер.

    Обратил внимание также, что это и вручную сделать нельзя - если выделить два и более рисунка, то в поля Высота/Ширина ничего нельзя ввести. Т.е. получается нельзя ничего сделать?

  10. 29.01.2010 в 16:02 | #10

    Вы просили:

    Т.е. нужно, допустим, чтобы все рисунки были по высоте 12 см.

    Я предложил три варианта: первый работает только с выделенным одним объектом. Второй и третий вариант макроса работают с графическими объектами (всеми, имеющимися в документе).

    Разумеется, для отдельных случаев использования нужно думать и менять.

  11. 29.01.2010 в 16:05 | #11

    Макрос правильно работает на новых вставляемых в документ рисунках, но не работает на уже вставленых и изменённых/отформатированных ранее.

    Так, а размеры старых каковы?

  12. 29.01.2010 в 16:15 | #12

    если выделить два и более рисунка

    Как вам это удается? Или они у вас идут друг за другом, то есть не разделены текстом? Но даже если и так, это два разных объекта.

  13. 30.01.2010 в 13:56 | #13

    "Так, а размеры старых каковы?"

    Размеры любые могут быть. Отличные от 12 см.

    "Как вам это удается? Или они у вас идут друг за другом, то есть не разделены текстом? Но даже если и так, это два разных объекта."

    Да, действительно, выделить одновременно можно только 2 идущих подряд рисунка. Тогда вопрос отпадает.

    P.S. как вставлять цитату здесь? smile

  14. 30.01.2010 в 17:28 | #14

    как вставлять цитату здесь?

    Используйте теги blockquote.

    Часто нужно изменить не все рисунки в документе, а выделить несколько штук и изменить их размер.

    Я вот подумал, а если указывать номера нужных рисунков, чтобы именно их макрос и обрабатывал? У вас же наверное идут подрисуночные подписи? Там определены номера. Хотя можно и автоматически подсчитывать...

    Впрочем, мне кажется, что все-таки удобнее последовательно выбирать нужный рисунок и применять к каждому макрос из комментария №5.

  15. 30.01.2010 в 17:47 | #15

    Я вот подумал, а если указывать номера нужных рисунков, чтобы именно их макрос и обрабатывал? У вас же наверное идут подрисуночные подписи? Там определены номера.

    Да, подписи с номерами есть, но в разных разделах своя нумерация, и плюс она может идти даже не подряд. Так что смотря какие номера указывать. Ну в любом случае с указыванием номера будет не очень удобно. Так что пожалуй соглашусь, что при невозможности одноврменного выделения нескольких рисунков удобнее всего выделять по одному и применять к каждому макрос.

    Спасибо.

  16. Вождь
    30.01.2010 в 21:16 | #16

    vawer: … при невозможности одновременного выделения нескольких рисунков удобнее всего выделять по одному и применять к каждому макрос…

    Поправка: макросы Word работают только с одним, последовательным, последним из выделенных блоков. Т.е. невозможно выделить несколько блоков с рисунками, а в одном выделено блоке рисунков может быть сколько угодно.

    Для масштабирования лучше использовать функции Shape.ScaleHeight и Shape.ScaleWidth.

  17. Витязь
    15.05.2010 в 17:38 | #17

    Вот вариант макроса, позволяющий измерять масштаб всех рисунков в выделенной области:

    Sub SetNewSizeImages()
    '
    ' SetNewSizeImages Макрос
    ' Макрос создан 15.05.2010 Excellence
    '
    ' Изменяет размер всех выделенных рисунков
    Dim iShape As InlineShape
    Dim iScale As Single
    iScale = InputBox("Укажите масштаб", "Изменение всех рисунков", "50")
    For Each iShape In Selection.InlineShapes
      iShape.ScaleHeight = iScale
      iShape.ScaleWidth = iScale
    Next iShape
    End Sub

  18. Роман
    14.06.2010 в 23:18 | #18

    А реально ли заставить макрос обрабатывать "горизонтальные" изображение по одному параметру, а "вертикальные" по другому?

  19. 15.06.2010 в 09:51 | #19

    Роман, это реально. Достаточно проанализировать соотношение сторон (Width и Height). Если Вас интересует что-то более конкретное, то приходите на форум, там и обсудим.

  20. ЮК
    10.12.2010 в 19:16 | #20

    Вопрос: как сделать все картинки не более 8-9см? по горизонтали?

  21. Михаил
    30.11.2011 в 19:05 | #21

    Благодарю вас, дамы и господа, вы сэкономили мне год жизни!

  22. Максим
    07.05.2018 в 14:24 | #22

    Коллеги, добрый день! подскажите пожалуйста, можно ли как-то в Макросе прописать так, чтобы он осуществлял изменения над изображением, которое находится на данном листе, просто у меня получается, что при удалении старого и вставлении нового изображения, наименование рисунка меняется с "Picture 1" на "Picture 2" и так далее, и макрос уже соответственно выдает ошибку.

    Заранее спасибо! если непонятно объяснил, готов дополнить и скинуть код который получается..

Оставьте комментарий!

(обязательно)

^ Наверх