在线观看亚洲精品专区-在线观看亚洲免费-在线观看亚洲免费视频-在线观看亚洲欧美-欧美freexxx-欧美free嫩交video

VIP標識 上網做生意,首選VIP會員| 設為首頁| 加入桌面| | 手機版| RSS訂閱
食品伙伴網服務號
 

Word文檔頁數隨意變

放大字體  縮小字體 發布日期:2006-06-14
遇到麻煩了吧?老總要你寫一份10頁的報告,但你卻洋洋灑灑寫了12頁。怎么辦呢?重寫當然不可能,刪掉幾段文字?也來不及了,因為再過5分鐘會議就要開始。如果Word能夠自動把文檔縮減到10頁,那該多好啊!

  也許你要用Word寫一本24頁的宣傳冊,但最后數來數去只有21頁。當然,你不能讓最后3頁全部空白,而是應該適當調整文字,使它剛好有24頁。

  這些問題你經常會遇到。本文的目標就是設計一個插件,實現Word自動擴展和收縮文檔,使文檔符合指定的打印頁數。以前人們常用的WordPerfect軟件有這個功能,但Word卻從來沒有完全實現這個功能。之所以說“沒有完全實現”,是因為Word也有一個簡單的“減少一頁”功能,可以在打印預覽工具條上找到,如圖一所示,但Word的這個功能無法與WordPerfect的相比。

Word文檔頁數隨意變
圖一:打印預覽工具欄

  點擊“減少一頁”按鈕,Word會嘗試減小文檔中每種字體的大小。它的主要作用是避免將少量內容單獨放入一頁。按照微軟的建議,這個操作最好只用于最后一頁包含少量內容的短文檔。如果第一次操作沒有達到預期的目標,你可以重復執行“減少一頁”命令,但最后可能得到一個字體小得難以接受的文檔。

  相比之下,WordPerfect的這個功能靈活得多。首先,它既可以收縮文檔,也可以擴展文檔,只要目標頁數和當前頁數的差異不超過50%即可。第二,你可以選擇通過哪些途徑使文檔符合指定的頁數要求,除了改變字體之外,你還可以調整行距以及頁的上、下、左、右邊距。WordPerfect會根據用戶指定的選項分析當前文檔,自動修改文檔格式,使文檔符合指定的頁數要求。

Word文檔頁數隨意變
圖二:自動調整文檔頁數

  本文的目標是模仿WordPerfect,在Word中實現文檔頁數自動調整功能。調整頁數的界面如圖二所示,用戶可以選擇調整哪些項目、調整的范圍,然后點擊“確定”按鈕開始自動調整。當然,實現這種功能需要用到Word宏,也就是要用VBA編程。不過本文的代碼并不是特別復雜,只要了解一些基礎知識,就很容易理解本文的代碼。本文的插件適用于Word 2000和XP,文章中凡是涉及菜單名字、對話框的地方,都以Word XP為標準。

一、調整文檔占用空間的基本手段

  Word提供了七個改變字體大小和調整行距的內建命令,所有這些命令都可以用等價的VBA代碼表示。在圖三中,我把這些命令和“減少一頁”集中到了一個自定義的工具欄上。

Word文檔頁數隨意變
圖三:調整文檔占用空間的內建命令

  如果你也想得到這個工具欄,可按如下步驟設置:選擇菜單“工具->自定義”,選擇“工具欄”選項卡,新建一個工具欄,將它命名為“擴展與縮減文檔頁數”,然后選擇“自定義”對話框的“命令”頁,在“類別”列表中選擇“所有命令”,接著從“命令”列表把各個命令拖到新建的工具欄上就可以了。

1.1 調整字體

 首先來看第一個命令“減少一頁”。在Word宏中,該命令對應的VBA指令是ActiveDocument.FitToPages。需要注意的是,調用該指令的代碼必須有健全的錯誤處理機制,因為如果 Word 無法將文檔的頁數減少一頁,則該方法會導致出錯。Word的幫助只提到了編號為5538的錯誤“Word無法按一頁縮小文檔,因為此文檔只有一頁”。但在實際應用中,出現另一個編號為5539的錯誤可能性更大。5539錯誤的意思是“經過數次嘗試,Word無法按一頁來縮小文檔”。據測試,只要文檔的字體被縮小到6磅,Word會提示這個錯誤,也許Word認為這是可以保證文檔清晰可讀的最小字體,所以不再繼續縮小字體。

  “縮小字體”和“增大字體”兩個命令分別對應Selection.Font.Shrink和Selection.Font.Grow,這兩個方法可用來調整選中區域的字體大小。Shrink方法把字體縮小一級,如果用戶選中的內容字體大小不一,則每種字體大小分別被縮減一級。Grow方法的作用恰好相反。“一級”這個概念的含義必須說明一下。如果文字的當前大小是20,則比它大一級不是21,而是22;比20小一級的不是19,而是18。也就是說,Word對文字大小級別的解釋與“格式”工具欄上列表框的值對應,如圖四所示。


圖四:Word的字體分級

  仔細觀察圖四的列表,每一級之間的距離沒有任何規律,有的距離大,有的距離小。微軟沒有解釋這么安排的理由,但可以猜想,如果一段文字既有標題也有正文,用Shrink和Grow方法調整大小時,這種分級安排有利于維持某種平衡。

  用FitToPages和Shrink方法縮減文檔頁數時,應注意兩者的工作方式有所不同。Shrink按照預定義的級別縮減字體大小,字體可以小到1磅。FitToPages不同,它按照0.5磅的精度精確調整字體大小,但不允許正文字體小于6磅。

  VBA沒有提供直接與圖三“將字體縮小1磅”、“將字體增大1磅”對應的命令。如果用記錄宏的辦法獲取這兩個按鈕對應的代碼,可得到如下結果:

 

     

  • 將字體縮小1磅:Selection.Font.Size = Selection.Font.Size - 1
  • 將字體增加1磅:Selection.Font.Size = Selection.Font.Size + 1

  如果選中一段包含多種字體大小的文字,然后點擊“將字體縮小1磅”按鈕,Word會自動根據原有的字體大小,分別將它們減小1磅。但是,如果將這個操作記錄成宏,然后再重新執行這個宏,Word會提示錯誤“運行時錯誤4120,參數無效”。有興趣的讀者,可在VB調試器中分析代碼的運行過程。對于“將字體增加1磅”按鈕,情況也完全一樣。可見,對于這兩個命令,VBA不支持包含多種字體大小的情形!

  怎么辦呢?我們知道,點擊“將字體縮小/增加1磅”按鈕不會因為存在多種字體大小而出現問題。因此,只要我們模擬按鈕點擊動作,就可以繞過Selection和Font對象。

  每一個Office的CommandBar按鈕都有一個數值型的ID屬性,“將字體縮小1磅”按鈕的ID是310,“將字體增加1磅”按鈕的ID是311。只要有了按鈕的ID,就可以用CommandBars屬性的FindControl方法創建按鈕對象,然后利用Execute方法執行與CommandBar關聯的操作。也就是說,用下面的代碼可以執行“將字體縮小1磅”和“將字體增加1磅”命令:

 

     

  • CommandBars.FindControl(ID:=310).Execute
  • CommandBars.FindControl(ID:=311).Execute

1.2 調整行距

  下面來看看如何模擬WordPerfect第二類調整文檔空間的方法,即調整行距。Word有三個內建的命令來調整行距(各個行之間的垂直距離),如圖三最下方的三個按鈕所示,它們對應的VBA代碼是:Selection.ParagraphFormat.Space1,Selection.ParagraphFormat.Space15,Selection.ParagraphFormat.Space2。

  Space1方法為指定段落設置單倍行距,準確的間距將取決于各行內字符最大的字號。Space15方法為指定段落設置1.5倍行距,即各段內字符的最大字號加上6磅;Space2方法設置2倍行距,即各段內字符最大的字號加上12磅。

  但是,利用這些方法來調整行間距不是最好的辦法,因為對于需要精確的場合,它們實在顯得太粗糙了。使用“格式->段落”菜單可以更精確地控制行距,如圖五所示:

Word文檔頁數隨意變
圖五:指定行距的六種規則

  “段落”對話框允許按照六種不同的規則指定行距。如果指定了后面三種規則之一,還必須指定“設置值”。與此對應,在Word VBA中,行距是由兩個屬性控制的:LineSpacingRule和LineSpacing。Paragraph、ParagraphFormat、Paragraphs集合對象都提供了這些屬性。行距的規則通過LineSpacingRule屬性值設定,可以指定的常量值包括:wdLineSpaceSingle、wdLineSpace1pt5、wdLineSpaceDouble、wdLineSpaceAtLeast、wdLineSpaceExactly和wdLineSpaceMultiple。如果把規則設置成后面三個常量值之一,同時還必須設定LineSpacing屬性。LineSpacing屬性用來返回或設置指定段落或范圍的行距,單位是磅。要在文檔中擴展或收縮文字,最好把LineSpacingRule屬性設置成wdLineSpaceMultiple。這樣,我們可以讓行距總是和段落中最大字體的大小有關。例如下面的代碼將當前文檔所有段落的行距增加百分之三:


With ActiveDocument.Paragraphs
.LineSpacingRule = wdLineSpaceMultiple
.LineSpacing = LinesToPoints(1.03)
End With
  這里用到了LinesToPoints方法。這個方法用來把度量單位從行轉換為磅(1行=12磅),返回值是Single類型。按照這種方法,行距值可以調整到相當精確的程度。但應當注意的是,Word會以二十分之一磅為單位調整最終的行距。例如在上面的例子中,最終的行距不是12.36磅(1.03 X 12),而是12.35磅。
  為了便于閱讀,最好不要將行距縮小到90-92%(約11磅)以下。如果小于這個值,行的高度可能不夠,某些文字的頂端或末端可能被切割。但是,如果要擴展一個文檔,這種辦法是非常理想的,不僅效果顯著,而且永遠不會影響文檔的可讀性。
1.3 頁邊距
  WordPerfect允許修改頁四邊的空白距離,下面來看看如何在Word中作類似的調整。不過首先需要注意的是,無限制減小頁邊距不一定安全,因為可能與打印機支持的邊距范圍產生沖突。另外,如果文檔包含頁眉、裝訂線等,調整整個文檔的邊距之后可能會出現意外的結果。
  在Word VBA中,與四種邊距對應的TopMargin、BottomMargin、LeftMargin和RightMargin屬性屬于PageSetup對象,屬性的類型是Single,可用來設置或返回頁邊與文字邊緣的距離,單位是磅。如果你不習慣用磅作為計量單位,可以借助轉換函數使用自己熟悉的單位,例如英寸。例如,下面的例子中,InchesToPoints函數把1.5英寸轉轉成108磅(1英寸等于72磅):
With ActiveDocument.PageSetup  .LeftMargin = InchesToPoints(1.5)   .RightMargin = InchesToPoints(1.5) End With
  PageSetup對象屬于Section對象。也就是說,如果一個文檔包含多個節(Section),就可以提取出多個PageSetup對象,每一個PageSetup對象可能有不同的邊距。所以,如果文檔包含多個節且各個節的左邊距不同,下面的代碼不能得到正確結果,它將返回wdUndefined值(9999999):
Debug.Print ActiveDocument.PageSetup.LeftMargin
  如果要調整整個文檔的邊距,就必須分別處理各個節的邊距,如下面的例子所示。這段代碼首先獲取各個節的當前左、右邊距,然后把它們縮小20%:
Dim ObjSection As SectionFor Each ObjSection In ActiveDocument.Sections   With ObjSection.PageSetup    .LeftMargin = .LeftMargin * 0.8    .RightMargin = .RightMargin * 0.8   End WithNext

二、實現自動調整功能
  前面分析了在VBA中調整文檔占用空間的各種途徑。利用這些技術可以編寫出下面的DocSizer類,實現調整文檔頁數的核心功能。
  DocSizer類主要提供了10個屬性和一個Execute方法。10個屬性的含義如表一所示。
表一 屬性 說明 AdjustItems 可選,Long。指定可以通過哪些項目來調整文檔占用的空間。允許使用下列枚舉常量的任意組合:adjFontSize(1),adjLineSpacing(2),adjMarginLeft(4),adjMarginRight(8),adjMarginTop(16),andadjMarginBottom(32)。如果忽略,則默認是adjAll常量(63),即前面6個選項的組合。 NumTargetPages 必需,Long,可讀寫。指定目標頁數,與現有頁數的差距不能超過50%。 
MinLeftMargin
MinRightMargin
MinTopMargin
MinBottomMargin
可選,Single。用來指定必須保留的最小邊距,可用來防止邊距縮小得太多以至于超出打印機允許的范圍。如果忽略,默認保留的最小邊距是文檔第一節邊距的70%。 MinFontSize 可選,Single。指定“正文”樣式的字體最小可以調整到多少。如果忽略,則默認最小允許的字體是6磅。 MinLineSpacing 可選,Single。指定“正文”樣式中的行距最小可以調整到多少。如果忽略,則默認11磅(相當于一行的92%)。如果行距小于11磅,字符可能被切割。 NumCurrentPages 只讀,Long。返回文檔初始的頁數。執行Execute方法之后,返回值將是調整后的頁數。 UndoAfterFailure 可選,Boolean。如果設置成True,一旦調整之后未能達到預定的頁數要求,則撤銷所有對文檔格式的修改,恢復文檔的原始狀態。默認值是True,如果要保留調整后的結果(即使頁數不能達到預定的要求),則應當顯式地把該屬性設置成False。 
  Execute方法啟動調整文檔頁數的操作,如果能夠達到預期的頁數要求,返回True;否則返回False。另外,Execute方法還可能返回錯誤,利用Err.Description可獲得錯誤的描述信息。下面是DocSizer的主要代碼:
'公用變量,可讀寫的屬性Public NumTargetPages As Long '目標頁數Public UndoAfterFailure As Boolean '調整失敗后恢復'可調整的項目'包括:字體,行距,左、右、上、下邊距Public Enum adjItems  adjFontSize = 1  adjLineSpacing = 2  adjMarginLeft = 4  adjMarginRight = 8  adjMarginTop = 16  adjMarginBottom = 32End Enum'全部項目都可以調整Const ADJ_ALL = adjFontSize Or adjLineSpacing Or adjMarginLeft Or _  adjMarginRight Or adjMarginTop Or adjMarginBottom'錯誤信息'錯誤信息常量聲明,略...Const ERR_MSG_OPERATION_SUCCESSFUL = "操作成功!該文檔現在包含預定的頁數。"Const ERR_MSG_SHRINK_FAILED = "錯誤!無法把該文檔縮減到預定的頁數。"Const ERR_MSG_STRETCH_FAILED = "錯誤!無法把該文檔擴展到預定的頁數。"Const ERR_MSG_TARGETPAGES_OVERFLOW = "錯誤!目標頁數與現有頁數的差距不能超過50%。"Const ERR_MSG_TARGETPAGES_SAME_AS_CURRENT_PAGES = "錯誤!目標頁數與現有頁數完全一樣。"Const ERR_MSG_NO_TARGETPAGES = "錯誤!沒有指定目標頁數。"'默認允許的最小字體Const MIN_FONTSIZE As Single = 6'默認允許的最小行距Const MIN_LINESPACING As Single = 11'允許將頁邊距縮小到多少(百分比)Const MIN_MARGINS_PERCENTAGE As Single = 0.7Const DEF_MARGIN_ADJUSTMENT As Long = 12'聲明其他對象型變量,略...'======類的屬性和方法======='類初始化Private Sub Class_Initialize()If Documents.Count Then  '用于撤銷已執行的格式修改操作  Set objUndoList = CommandBars.FindControl(ID:=128)End If'默認修改失敗后恢復UndoAfterFailure = TrueEnd SubPrivate Sub Class_Terminate()Set objUndoList = NothingEnd SubProperty Get CurPageCount() As Long'獲得文檔的當前頁數If Documents.Count Then  CurPageCount = ActiveDocument.ComputeStatistics(wdStatisticPages)End IfEnd PropertyPrivate Property Get sDefaultLineSpacing()'返回"正文"樣式的行距,磅With ActiveDocument.Styles(wdStyleNormal).ParagraphFormat  '行距規則?  Select Case .LineSpacingRule  Case wdLineSpaceMultiple    sDefaultLineSpacing = .LineSpacing  Case wdLineSpaceSingle, wdLineSpace1pt5, wdLineSpaceDouble  ' 0, 1,或 2    sDefaultLineSpacing = (.LineSpacingRule + 1) * 12  Case Else '忽略wdLineSpaceExactly和wdLineSpaceAtLeast    sDefaultLineSpacing = 12  End SelectEnd WithEnd Property

Private Property Get DefaultFontRange() As Range
'找到一個按照"正文"樣式格式化的Range。
'縮小字體時,查看該Range就可以知道字體縮小
'到了什么程度
If Documents.Count Then
With Selection
Set objOriginalSel = .Range
With .Find
.ClearFormatting
.Font.Size = ActiveDocument.Styles(wdStyleNormal).Font.Size
.Text = vbNullString
.Forward = True
.Wrap = wdFindContinue
.Format = True
If .Execute Then
Set DefaultFontRange = Selection.Range
Else
Set DefaultFontRange = Nothing
End If
End With
objOriginalSel.Select
End With
End If
End Property

Private Property Get nCurUndoItems()
'返回‘常用’工具欄‘撤消’列表的項目數
If IsObject(objUndoList) Then
With objUndoList
If .Enabled Then nCurUndoItems = .ListCount
End With
End If
End Property

Function Execute() As Boolean
'根據設定的參數,將文檔頁數調整到預定的數量
On Error Resume Next
nInitialPages = CurPageCount '初始頁數
'‘撤消’列表的當前項數
nInitialUndoItems = nCurUndoItems
'默認允許以所有手段調整文字占用的空間
If nAdjustItems = 0 Then nAdjustItems = ADJ_ALL
'是否允許調整邊距
bAdjustAnyMargin = CBool(nAdjustItems And adjMarginLeft) Or _
CBool(nAdjustItems And adjMarginRight) Or _
CBool(nAdjustItems And adjMarginTop) Or _
CBool(nAdjustItems And adjMarginBottom)

'根據目標頁數的不同,執行不同的操作(縮減頁數或擴展頁數)
Select Case NumTargetPages
Case 0
'沒有指定目標頁數
Err.Raise ERR_NO_TARGETPAGES, , ERR_MSG_NO_TARGETPAGES
Case Is > nInitialPages * 1.5, Is < (nInitialPages + 1) \ 2
'目標頁數與現有頁數的差距不能超過50%
Err.Raise ERR_TARGETPAGES_OVERFLOW, , ERR_MSG_TARGETPAGES_OVERFLOW
Case Is < nInitialPages
'縮減頁數
ShrinkToFit
Execute = (CurPageCount = NumTargetPages)
If Execute = True Then
'縮減頁數成功
Err.Raise ERR_OPERATION_SUCCESSFUL, , ERR_MSG_OPERATION_SUCCESSFUL
Else
'縮減頁數失敗
Err.Raise ERR_SHRINK_FAILED, , ERR_MSG_SHRINK_FAILED
'是否恢復到調整頁數之前的原始文檔?
If UndoAfterFailure Then UndoAll
End If
Case Is > nInitialPages
'擴展頁數
StretchToFit
Execute = (CurPageCount = NumTargetPages)
If Execute = True Then
'擴展頁數成功
Err.Raise ERR_OPERATION_SUCCESSFUL, , ERR_MSG_OPERATION_SUCCESSFUL
Else
'擴展頁數失敗
Err.Raise ERR_STRETCH_FAILED, , ERR_MSG_STRETCH_FAILED
'是否恢復到調整頁數之前的原始文檔?
If UndoAfterFailure Then UndoAll
End If
Case Else
End Select

If IsObjectValid(objOriginalSel) Then objOriginalSel.Select
'刷新屏幕
Application.ScreenRefresh
End Function

Private Sub StretchToFit()
'擴展文檔頁數
With ActiveDocument
'如果允許調整字體...
If CBool(nAdjustItems And adjFontSize) Then
Do Until bFontDone
'增大字體
.Range.Font.Grow
'分析頁數
nCurPages = CurPageCount
'當前頁數是否等于目標頁數?
If nCurPages = NumTargetPages Then
' 已經達到目標頁數
Exit Sub
ElseIf nCurPages > NumTargetPages Then
'頁數太多了。必須撤消最后一次修改操作
.Undo 1
bFontDone = True
Else
'文檔頁數仍舊太少,繼續擴展文檔
End If
Loop
End If
'調整行距,略...
'調整邊距,略...

End With
End Sub

Private Sub ShrinkToFit()
'縮減文檔頁數
With ActiveDocument
'如果允許調整字體...
If CBool(nAdjustItems And adjFontSize) Then
Dim sCurFontSize As Single
'確定最小字體
If sMinFontSize = 0 Then sMinFontSize = MIN_FONTSIZE
Dim rNormalFont As Range
Set rNormalFont = DefaultFontRange
Do Until bFontDone
' FitToPages執行失敗會出現5538和5539錯誤
On Error Resume Next
.FitToPages
Select Case Err
Case 5538, 5539
' FitToPages失敗,結束循環
Err.Clear
bFontDone = True
Case 0 'FitToPages執行成功
'文檔是否包含用‘正文’樣式格式化的文字?
If IsObjectValid(rNormalFont) Then
'它當前的字體大小是多少?
sCurFontSize = rNormalFont.Font.Size
'如果字體已經達到允許的最小極限,則結束循環
If sCurFontSize < sMinFontSize Then
.Undo 1
bFontDone = True
End If
Else
'文檔不包含‘正文’樣式大小的文字。字體可能被調整到6
'磅(FitToPages的下限)
End If
Case Else '其他不能確定的異常
Err.Clear
bFontDone = True
End Select
'分析頁數
nCurPages = CurPageCount
'當前頁數是否等于目標頁數?
If nCurPages = NumTargetPages Then
'已經達到目標頁數
Exit Sub
ElseIf nCurPages < NumTargetPages Then
'頁數太少了。如果不允許調整行距,撤消最后的操作
If Not CBool(nAdjustItems And adjLineSpacing) Then
.Undo 1
End If
bFontDone = True
Else
'頁數仍舊太多,繼續縮減頁數
End If
Loop
End If


'調整行距,略...
'調整邊距,略...


End With


End Sub


Private Sub UndoAll()
'撤消所有調整頁數的操作,略...


End Sub

 

  可以看到,擴展頁數的過程(StretchToFit)比較簡單,縮減頁數的過程(ShrinkToFit)稍微復雜一點。代碼的主要思路是:每次調整字體大小、行距或邊距之后,檢查一下CurPageCount屬性,看看是否已經達到目標頁數。如果已經達到,調整過程結束,Execute方法返回True;如果調整之后頁數變得太多(或太少),例如縮小字體之后頁數小于目標頁數,則撤消最后一次操作,嘗試另一種調整頁數的辦法。當所有調整頁數的辦法都已經試遍,而頁數仍未能達到要求,則Execute返回False。

  建議至少用字體和行距兩種辦法調整文檔的頁數,這樣可以大大增加調整成功的可能性。當然,不能排除未能達到目標頁數的情形出現,導致這種情形的主要原因可能是文檔包含太多手工插入的分頁符、大型圖片,或者是因為目標頁數和現有頁數的差距太大。

三、設計用戶界面

  前面介紹了調整文檔頁數的核心思路和代碼。下面來看看制作用戶界面的過程。用戶界面主要包括兩部分:菜單和對話框。圖六是加入到“文件->打印預覽”前面的“調整頁數”菜單。

Word文檔頁數隨意變
圖六:“調整頁數”菜單

  “調整頁數”菜單包括三個選項。第一個選項允許指定目標頁數,然后根據默認的參數執行調整操作。第二個選項等同于Word的“減少一頁”功能,但原來這個功能只能在打印預覽狀態下使用。第三個選項顯示出圖二的對話框,用戶自定義調整頁數的參數,然后點擊“確定”按鈕開始調整頁數。如果用戶試圖調整文檔頁數時,文檔沒有保存,會出現圖七的提示。

Word文檔頁數隨意變
圖七:調整頁數之前保存文檔

  設置菜單的代碼和其他代碼一起保存在一個插件模板DocSizer.dot之中。DocSizer.dot的主要內容如圖八所示。其中:

 

     

  • frmDocSizer窗體:包含圖二的對話框。
  • Interface模塊:包括生成圖六菜單、根據默認參數調整文檔頁數、顯示圖二對話框的代碼。
  • Context類模塊:處理上下文信息。
  • DocSizer類模塊:實現調整文檔頁數的核心功能。


圖八:DocSizer模板的主要內容

  DocSizer.dot必須放入Word的自動啟動目錄。對于Windows 2000/XP和Office 2000/XP,啟動目錄通常是\Documents and Settings\<用戶名字>\Application Data\Microsoft\Word\STARTUP。Word會自動加載該目錄下的模板,這樣我們就可以在Word啟動時加入“調整頁數”菜單。

  因篇幅關系,這里不再介紹Context類模塊和Interface模塊的代碼,但你可以參見本文的附件DocSizer.dot,代碼中包含了詳細的注釋。將DocSizer.dot安裝到Word的啟動目錄下,啟動Word就可以看到“文件->打印預覽”前面增加了一個“調整頁數”菜單。啟動目錄的具體位置,可查看Word菜單“工具->選項”再選擇“文件位置”。如果你要查看DocSizer.dot的完整代碼,先按正常方式打開它,然后選擇菜單“工具->宏->宏”,再選擇“編輯”即可。

  作為一種通用軟件,Word無法照顧到每一個用戶的特殊要求和使用習慣。但是,Word提供了VBA編程支持和完善的對象模型。正如本文例子所顯示的,利用這些技術,我們可以隨心所欲地定制Word,提高工作效率。



'調整行距,略...
'調整邊距,略...


End With


End Sub


Private Sub UndoAll()
'撤消所有調整頁數的操作,略...


End Sub

 

  可以看到,擴展頁數的過程(StretchToFit)比較簡單,縮減頁數的過程(ShrinkToFit)稍微復雜一點。代碼的主要思路是:每次調整字體大小、行距或邊距之后,檢查一下CurPageCount屬性,看看是否已經達到目標頁數。如果已經達到,調整過程結束,Execute方法返回True;如果調整之后頁數變得太多(或太少),例如縮小字體之后頁數小于目標頁數,則撤消最后一次操作,嘗試另一種調整頁數的辦法。當所有調整頁數的辦法都已經試遍,而頁數仍未能達到要求,則Execute返回False。

  建議至少用字體和行距兩種辦法調整文檔的頁數,這樣可以大大增加調整成功的可能性。當然,不能排除未能達到目標頁數的情形出現,導致這種情形的主要原因可能是文檔包含太多手工插入的分頁符、大型圖片,或者是因為目標頁數和現有頁數的差距太大。

三、設計用戶界面

  前面介紹了調整文檔頁數的核心思路和代碼。下面來看看制作用戶界面的過程。用戶界面主要包括兩部分:菜單和對話框。圖六是加入到“文件->打印預覽”前面的“調整頁數”菜單。

Word文檔頁數隨意變
圖六:“調整頁數”菜單

  “調整頁數”菜單包括三個選項。第一個選項允許指定目標頁數,然后根據默認的參數執行調整操作。第二個選項等同于Word的“減少一頁”功能,但原來這個功能只能在打印預覽狀態下使用。第三個選項顯示出圖二的對話框,用戶自定義調整頁數的參數,然后點擊“確定”按鈕開始調整頁數。如果用戶試圖調整文檔頁數時,文檔沒有保存,會出現圖七的提示。

Word文檔頁數隨意變
圖七:調整頁數之前保存文檔

  設置菜單的代碼和其他代碼一起保存在一個插件模板DocSizer.dot之中。DocSizer.dot的主要內容如圖八所示。其中:

 

     

  • frmDocSizer窗體:包含圖二的對話框。
  • Interface模塊:包括生成圖六菜單、根據默認參數調整文檔頁數、顯示圖二對話框的代碼。
  • Context類模塊:處理上下文信息。
  • DocSizer類模塊:實現調整文檔頁數的核心功能。


圖八:DocSizer模板的主要內容

  DocSizer.dot必須放入Word的自動啟動目錄。對于Windows 2000/XP和Office 2000/XP,啟動目錄通常是\Documents and Settings\<用戶名字>\Application Data\Microsoft\Word\STARTUP。Word會自動加載該目錄下的模板,這樣我們就可以在Word啟動時加入“調整頁數”菜單。

  因篇幅關系,這里不再介紹Context類模塊和Interface模塊的代碼,但你可以參見本文的附件DocSizer.dot,代碼中包含了詳細的注釋。將DocSizer.dot安裝到Word的啟動目錄下,啟動Word就可以看到“文件->打印預覽”前面增加了一個“調整頁數”菜單。啟動目錄的具體位置,可查看Word菜單“工具->選項”再選擇“文件位置”。如果你要查看DocSizer.dot的完整代碼,先按正常方式打開它,然后選擇菜單“工具->宏->宏”,再選擇“編輯”即可。

  作為一種通用軟件,Word無法照顧到每一個用戶的特殊要求和使用習慣。但是,Word提供了VBA編程支持和完善的對象模型。正如本文例子所顯示的,利用這些技術,我們可以隨心所欲地定制Word,提高工作效率。


 
[ 網刊訂閱 ]  [ 食品專題搜索 ]  [ ]  [ 告訴好友 ]  [ 打印本文 ]  [ 關閉窗口 ] [ 返回頂部 ]

 

 
推薦圖文
推薦食品專題
點擊排行
 
 
Processed in 0.021 second(s), 18 queries, Memory 0.92 M
主站蜘蛛池模板: 成人窝窝午夜看片| 天天亚洲| 欧美久久天天综合香蕉伊| 奇米影视四色首页手机在线| 在线免费观看你懂的| 日韩电影天堂网| aaaaaaaaa在线观看| 国产三片高清在线观看| 欧美日韩一卡2卡三卡4卡新区| 日本在线视频精品| www.av网站| 中文字幕第13亚洲另类| 久久国产精品久久久久久| 久久精品视频9| 深夜视频在线观看免费| 亚洲一区二区中文字幕| 日韩欧免费一区二区三区| 播五月综合| 激情综合丝袜美女一区二区| 婷婷爱爱| 综合激情在线| 91av免费观看| 三级视频网站在线观看| 亚洲成a人片在线看| 一区二区三区精品视频| 三级视频网| 天天操夜夜摸| 久久99热精品这里久久精品| 欧美黄色片免费看| 欧美在线bdsm调教一区| 高清不卡一区二区三区| 黄色香蕉网| 波多野吉衣一区二区三区在线观看| 伊人狠狠丁香婷婷综合色| 国产成年网站v片在线观看| 欧美激情αv一区二区三区| 色多多视频在线播放| 天堂va欧美ⅴa亚洲va一国产| 99久久久久国产精品免费| 国产一级毛片外aaaa| 好黄好猛好爽好痛的视频|