Ztanusha пишет:У меня вопрос: можно ли как то установить автоматическую подгонку страниц в документе WORD? Т.е. например в договор вписывается перечень услуг, их может быть много или мало, но требование такое , что бы договор не превышал двух страниц ...т.е шрифт или межстрочный интервал должны изменяться автоматически.
Изменение размера шрифта поможет вам меньше, чем изменение межстрочного интервала (размер шрифта вы сможете установить вручную). Предлагаю такой подход: разметить документ закладками на тех группах абзацев, которые допускают изменение межстрочного интервала. Такие закладки должны иметь общий префикс имени (допустим, "Resize"). Тогда макрос обходит все такие закладки и в абзацах этих диапазонов изменяет межстрочный интервал. Макросы, которые представлены ниже:
IncreaseSpacingInResizableRanges - увеличить межстрочный интервал в целевых закладках
DecreaseSpacingInResizableRanges - уменьшить межстрочный интервал в целевых закладках
AdjustDocToSize - подогнать документ к целевому размеру (этот размер указан в константе target_doc_size (ее надо назначать осмысленно, т.к. могут быть ситуации, когда целевого размера документа в страницах можно не достичь ввиду наличия разрывов страниц в документе), разрывов страниц в документе следует избегать при пользовании этими макросами.
Первые два макроса можно использовать как самостоятельно (назначив им горячие клавиши), так и в составе третьего макроса.
Sub IncreaseSpacingInResizableRanges()
Dim bmk As Bookmark
Dim para As Paragraph
Dim cur_line_spacing As Variant
Dim bmk_para_linespacing As Variant
Const undefined_para_linespacing As Variant = 9999999
Const para_def_line_spacing As Variant = 10
Const para_linespacing_resizefactor As Variant = 1.2
Const ResizeBmkPrefix As String = "Resize"
For Each bmk In ActiveDocument.Bookmarks
If InStr(bmk.name, ResizeBmkPrefix) = 1 Then 'this is resizable range
bmk_para_linespacing = bmk.Range.ParagraphFormat.LineSpacing
On Error Resume Next
If bmk_para_linespacing = undefined_para_linespacing Then
bmk.Range.ParagraphFormat.LineSpacing = para_def_line_spacing
bmk.Range.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
End If
For Each para In bmk.Range.Paragraphs
cur_line_spacing = para.Range.ParagraphFormat.LineSpacing
para.Range.ParagraphFormat.LineSpacing = _
cur_line_spacing * para_linespacing_resizefactor
para.Range.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
Next
On Error GoTo 0
End If
Next
End Sub
Sub DecreaseSpacingInResizableRanges()
Dim bmk As Bookmark
Dim para As Paragraph
Dim cur_line_spacing As Variant
Dim bmk_para_linespacing As Variant
Const undefined_para_linespacing As Variant = 9999999
Const para_def_line_spacing As Variant = 10
Const para_linespacing_resizefactor As Variant = 1.2
Const ResizeBmkPrefix As String = "Resize"
For Each bmk In ActiveDocument.Bookmarks
If InStr(bmk.name, ResizeBmkPrefix) = 1 Then 'this is resizable range
bmk_para_linespacing = bmk.Range.ParagraphFormat.LineSpacing
On Error Resume Next
If bmk_para_linespacing = undefined_para_linespacing Then
bmk.Range.ParagraphFormat.LineSpacing = para_def_line_spacing
bmk.Range.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
End If
For Each para In bmk.Range.Paragraphs
cur_line_spacing = para.Range.ParagraphFormat.LineSpacing
para.Range.ParagraphFormat.LineSpacing = _
cur_line_spacing / para_linespacing_resizefactor
para.Range.ParagraphFormat.LineSpacingRule = wdLineSpaceExactly
Next
On Error GoTo 0
End If
Next
End Sub
Sub AdjustDocToSize()
Dim init_doc_size As Long
Dim bmk_cnt As Long
Dim bmk As Bookmark
Const target_doc_size As Long = 2
bmk_cnt = 0
For Each bmk In ActiveDocument.Bookmarks
If InStr(bmk.name, ResizeBmkPrefix) = 1 Then 'this is resizable range
bmk_cnt = bmk_cnt + 1
End If
Next
If bmk_cnt = 0 Then
MsgBox "No resizeable bookmarked range is found in the document"
Else
init_doc_size = Selection.Information(wdNumberOfPagesInDocument)
If init_doc_size <> target_doc_size Then
If init_doc_size > target_doc_size Then 'need to decrease linespacing
While (Selection.Information(wdNumberOfPagesInDocument) > target_doc_size)
DecreaseSpacingInResizableRanges
Wend
Else
While (Selection.Information(wdNumberOfPagesInDocument) < target_doc_size)
IncreaseSpacingInResizableRanges
Wend
End If
End If
End If
End Sub