Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 44
Word

Обратиться к картинке внутри Shape

16.10.2025, 16:57. Показов 937. Ответов 5
Метки vba, word (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Пишу макрос обработки картинок в Word - нужно массово менять яркость/контрастность перед их печатью. С обычными вставленными в текст картинками проблем нет - циклами прохожусь через "For Each shp In ActiveDocument.Shapes" и "For Each Ishp In ActiveDocument.InlineShapes". Но у меня так же присутствуют картинки, вставленные в фигуры (Shape) типа "прямоугольник" и я никак не могу к ним обратиться кодом. В приведённых выше циклах они не встречаются, пробовал искать внутри прямоугольника через его "GroupItems" и "CanvasItems", но таких свойств у них не оказалось.
Может кто помочь ? Пример файла с картинкой приложил, там в "ThisDocument" есть набросок начала кода.
Вложения
Тип файла: rar test.rar (121.1 Кб, 8 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
16.10.2025, 16:57
Ответы с готовыми решениями:

Вставка Shape средствами VBA в определенное место страницы Word или изменение позиции Anchor у Shape
Здравствуйте! Прошу помощи, весь мозг себе сломал! Я не знаком с объектными структурами в Word,...

Как обратиться к worksheet shape в составе группы?
Добрый день! Подскажите как можно обратиться к фигуре листа Excel, которая находится в группе...

Как выравнить Picturebox по картинке внутри с прозрачным фоном ? Т.е без фона
Как выравнить размеры Picturebox по картинке внутри ней без фона ? Вырезал фон из picture1 и...

5
54 / 42 / 14
Регистрация: 01.10.2015
Сообщений: 188
16.10.2025, 20:38
Привет, Ariomex! В Вашем образце фигура-родитель - это Shape, а фигура-ребенок - это InlineShape. Настройки PictureFormat применяются только к InlineShape. а Вы ищете Shape. Чтобы не усложнять код (а в образце это можно), ищите просто InlineShape и делайте с ними всё, что хотите. Измените мой код под себя (я предпочитаю Selection, можете изменить на ActiveDocument):
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
Sub Format_Child_Pics()
Dim inLineShp As inlineShape
    If Selection.range.InlineShapes.Count > 0 Then
        For Each inLineShp In Selection.range.InlineShapes
            With inLineShp.PictureFormat
               .Brightness = 0.1
               .Contrast = 0.9
           End With
           inLineShp.Fill.ForeColor.RGB = RGB(0, 255, 0)
       Next inLineShp
    End If
End Sub
0
54 / 42 / 14
Регистрация: 01.10.2015
Сообщений: 188
16.10.2025, 20:58
Код находит InlineShape внутри Shape. Результат:
Вложения
Тип файла: docx test.docx (116.2 Кб, 3 просмотров)
0
0 / 0 / 0
Регистрация: 17.07.2016
Сообщений: 44
17.10.2025, 08:15  [ТС]
Привет, vivka! Спасибо за код! Он работает, но только с выделением. Если сменить Selection на ActiveDocument, то "ActiveDocument.range.InlineShapes.Count " будет равно нулю. Можно конечно пробегать циклом по всем Shape, проверяя на тип "msoShapeRectangle", потом делать shp.Select и уже затем Ваш код, но я боюсь это будет очень долго в большом документе... К тому же я не нашёл способа программно сбросить выделение.
0
54 / 42 / 14
Регистрация: 01.10.2015
Сообщений: 188
17.10.2025, 09:23
Привет, Ariomex! Я выложил версию кода, в которой случайно удалил нужные строки, когда подчищал свои комментарии. Вот код, который работает без выделения во всём документе:
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
Sub InlineShapes_Inside_Shapes()
'Форматирует Inline Shapes внутри Shapes во всём документе.
 
Dim Shp As Shape
Dim inLineShp As inlineShape
    
    Application.ScreenUpdating = False
    For Each Shp In ActiveDocument.Shapes
        Shp.Select
 '       Shp.Fill.ForeColor = vbRed 'окрашиваем красным (можно удалить)
 '       Shp.Fill.ForeColor = vbWhite 'убираем окрас (можно удалить)
        If Selection.range.InlineShapes.Count > 0 Then
            For Each inLineShp In Selection.range.InlineShapes
                With inLineShp.PictureFormat
                   .Brightness = 0.1
                   .Contrast = 0.9
               End With
 '              inLineShp.Fill.ForeColor = vbGreen 'окрашиваем зелёным (можно удалить)
 '              inLineShp.Fill.ForeColor = vbWhite 'убираем окрас (можно удалить)
           Next inLineShp
        End If
    Next Shp
    Application.ScreenUpdating = True
End Sub
1
256 / 41 / 17
Регистрация: 02.12.2024
Сообщений: 75
17.10.2025, 13:24
Лучший ответ Сообщение было отмечено Ariomex как решение

Решение

Вариант без Select:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub InlineShapes_Inside_Shapes_2()
    Dim Shp As Shape
    Dim inLineShp As InlineShape
  
    Application.ScreenUpdating = False
    On Error Resume Next
 
    For Each Shp In ActiveDocument.Shapes      
        If Shp.TextFrame.TextRange.InlineShapes.Count > 0 Then
            For Each inLineShp In Shp.TextFrame.TextRange.InlineShapes
                With inLineShp.PictureFormat
                   .Brightness = 0.1
                   .Contrast = 0.9
               End With
           Next inLineShp
        End If       
    Next Shp
    
    If Err.Number <> 0 Then Err.Clear
    On Error GoTo 0
    Application.ScreenUpdating = True
End Sub
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
17.10.2025, 13:24
Помогаю со студенческими работами здесь

Внутри With / End With обратиться к объекту а не его компонентам
Существует ли способ внутри With objectExpression End With обратиться к самому...

Изменение цвета Shape
Как изменить цвет у Shape1(1)?? Пробовал так: Shape1(1).BackColor = RGB(0, 0, 0), но нечего не...

Работа с графикой (Shape)
Вот условие: Используя элементы управления типа Shape и собственную палитру цветов, дать...

Замена текста в объекте Shape.TextFrame.TextRange.Text
Здравствуйте! Помогите с заменой текста в объекте надпись Shape.TextFrame.TextRange.Text ...

Вставка изображений в Word, ShapeLine конвертация в Shape, транспонирование
Здравствуйте. Недавно на работе столкнулся с одной проблемой, а именно со вставкой в готовый...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru