Вы можете сделать это с помощью следующего кода VBA. Он считает фигуры в документе, проверяет их ширину по доступному пространству на странице и изменяет размеры при необходимости.
Обратите внимание, что Word имеет две разные коллекции для Shapes
и InlineShapes
, следовательно, два разных цикла For
. Кроме того, он использует серию операторов If/ElseIf
для определения ширины страницы на основе стандартных форматов бумаги. В настоящее время единственными вариантами являются размер букв в книжной или альбомной ориентации , но вы можете добавить больше ElseIfs
для бумаги любого размера, который вам необходим.
Sub ResizePic()
' ResizePic Macro
' Resizes an image
Shapes = ActiveDocument.Shapes.Count
InLines = ActiveDocument.InlineShapes.Count
'Sets the variables to loop through all shapes in the document, one for shapes and one for inline shapes.
RightMar = ActiveDocument.PageSetup.RightMargin
LeftMar = ActiveDocument.PageSetup.LeftMargin
PaperType = ActiveDocument.PageSetup.PaperSize
PageLayout = ActiveDocument.PageSetup.Orientation
'Sets up variables for margin sizes, paper type, and page layout.
' This is used to find the usable width of the document, which is the max width for the picture.
If PaperType = wdPaperLetter And PageLayout = wdPortrait Then
WidthAvail = InchesToPoints(8.5) - (LeftMar + RightMar)
ElseIf PaperType = wdPaperLetter And PageLayout = wdLandscape Then
WidthAvail = InchesToPoints(11) - (LeftMar + RightMar)
End If
'Identifies the usable width of the document, based on margins and paper size.
For ShapeLoop = 1 To Shapes
MsgBox Prompt:="Shape " & ShapeLoop & " width: " & ActiveDocument.Shapes(ShapeLoop).Width
If ActiveDocument.Shapes(ShapeLoop).Width > WidthAvail Then
ActiveDocument.Shapes(ShapeLoop).Width = WidthAvail
End If
Next ShapeLoop
'Loops through all shapes in the document. Checks to see if they're too wide, and if they are, resizes them.
For InLineLoop = 1 To InLines
MsgBox Prompt:="Inline " & InLineLoop & " width: " & ActiveDocument.InlineShapes(InLineLoop).Width
If ActiveDocument.InlineShapes(InLineLoop).Width > WidthAvail Then
ActiveDocument.InlineShapes(InLineLoop).Width = WidthAvail
End If
Next InLineLoop
'Loops through all shapes in the document. Checks to see if they're too wide, and if they are, resizes them.
End Sub