粗硬黑大欧美aaaa片视频_国产精品视频区1_日韩综合精品视频_天堂网www在线资源_日韩精品中文字幕视频_无码爽大片日本无码AAA特黄

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

Word文檔頁數(shù)隨意變

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

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

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

Word文檔頁數(shù)隨意變
圖一:打印預(yù)覽工具欄

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

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

Word文檔頁數(shù)隨意變
圖二:自動調(diào)整文檔頁數(shù)

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

一、調(diào)整文檔占用空間的基本手段

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

Word文檔頁數(shù)隨意變
圖三:調(diào)整文檔占用空間的內(nèi)建命令

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

1.1 調(diào)整字體

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

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


圖四:Word的字體分級

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

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

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

 

     

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

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

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

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

 

     

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

1.2 調(diào)整行距

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

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

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

Word文檔頁數(shù)隨意變
圖五:指定行距的六種規(guī)則

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


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

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

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

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

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

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

End With
End Sub

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


'調(diào)整行距,略...
'調(diào)整邊距,略...


End With


End Sub


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


End Sub

 

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

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

三、設(shè)計用戶界面

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

Word文檔頁數(shù)隨意變
圖六:“調(diào)整頁數(shù)”菜單

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

Word文檔頁數(shù)隨意變
圖七:調(diào)整頁數(shù)之前保存文檔

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

 

     

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


圖八:DocSizer模板的主要內(nèi)容

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

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

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



'調(diào)整行距,略...
'調(diào)整邊距,略...


End With


End Sub


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


End Sub

 

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

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

三、設(shè)計用戶界面

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

Word文檔頁數(shù)隨意變
圖六:“調(diào)整頁數(shù)”菜單

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

Word文檔頁數(shù)隨意變
圖七:調(diào)整頁數(shù)之前保存文檔

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

 

     

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


圖八:DocSizer模板的主要內(nèi)容

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

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

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


 
[ 網(wǎng)刊訂閱 ]  [ 食品專題搜索 ]  [ ]  [ 告訴好友 ]  [ 打印本文 ]  [ 關(guān)閉窗口 ] [ 返回頂部 ]

 

 
推薦圖文
推薦食品專題
點擊排行
 
 
Processed in 0.021 second(s), 18 queries, Memory 0.93 M
主站蜘蛛池模板: 国产亚洲综合日韩一区|亚洲成人一区二区三区在线观看|亚洲精品日本久久一区二区三区|国产91=av视频在线观看|97色在线观看|精品国产香蕉伊思人在线 | 韩国日本一区二区三区|91视频老司机|成人丁香社区|国产精选久久久久久|狠狠色噜噜狠狠狠狠888米奇|首页视频蝌蚪九色 | 欧美性生活在线观看|亚洲免费视频专区|国产精品2024|免费网站国产|欧美男男作爱G=aYWWW|国产伦精品一区二区三区视 | 国产精品第一页在线播放|久久精品人人人人人人|亚洲精品一区久久久久一品=aV|欧美7777|美女全身赤裸裸免费网站|在线视频三区 | 第一=av在线|影音先锋亚洲=aV资源网站|日本WV一本一道久久香蕉|国产精品高清一区二区三区|欧美=a级在线|啪啪免费视频在线观看 | 欧美丰满熟妇xxxx性大屁股|亚洲=aV无码国产精品草莓在线|91影视免费版|久久久久国精品产熟女久色|国产99久久久久久免费看|成年人黄色片视频 | #NAME?|欧美暖暖视频|91国内在线|毛多水多www偷窥小便|人妻无码人妻有码中文字幕|少妇人妻精品一区二区三区 | きょこんきょうしゃ在线|91狠狠爱|亚洲=aV日韩综合一区尤物|丝袜亚洲另类欧美变态|GOGOGO高清在线观看|亚洲=aV成人无码精品综合网站 | 国产毛片久久久久久国产毛片|日韩在线免费观看中文字幕|久久sp|91精品国产色综合久久久浪潮|天天躁狠狠躁夜躁2020挡不住|日本=a视频在线观看 久久精品九九热无码免贵|日本=aⅴ精品一区二区三区|亚洲国产精品一区二区成人片|国产精品91久久|久草=av在线播放|亚洲在线www | 女人一区|午夜成人毛片免费观看蜜桔视频|高清无码不用播放器=av|91性网|无码一区二区|一区二区三区三州在线观看视频 | 午夜老司机免费视频|久久久国产精品免费=a片|奇米影视7777|八戒理论片午影院无码爱恋|国产91视频免费看|国产精品久久久久久久不卡 | 欧美成人一二三|一区二区国产在线|欧美黑人激情性久久|欧美性大战久久久久久久蜜桃|亚洲色播爱爱爱爱爱爱爱|亚洲日本二区 | 天天看天天色|国产欧美日韩在线精品一区二区|国产在线免费看|日韩欧美1区|夜夜爽=av|剧情演绎国产在线视频 | 久久国产超碰女女=av|2019最新国产拍自产在线|日韩xxxxxxxxx|国产在线观看=av黑料在线不打烊|国产精品久久久乱弄|国产精品一区二区三区四区色 | 亚洲=aV永久综合在线观看另类|#NAME?|日本亚洲精品成人欧美一区|久草精品在线播放|国产亚洲综合视频|亚洲精彩视频在线 | 久久撸视频|久久久久亚洲=aV无码专区喷水|国产成人无码精品久久二区三区|少妇扒开粉嫩小泬视频|欧洲黑大粗无码免费|亚洲成人=av | 亚洲视频在线观看一区二区|涩涩资源中文字幕久久婷婷爱|少妇精品无码一区二区三区|69激情网|影音先锋每日=aV色资源站|chin=a中国人妻video | 岛国午夜视频一区三区|欧美成人免费一级|加勒比中文字幕无码一区|亚洲中文字幕在线乱码|草久=av|国产区一区 | 国产=av熟女一区二三区灾密臀|黄色片在线播放|欧美人与牲口杂交视频在线|偷偷操任你操|69式视频免费观看|久久综合狠狠色综合伊人 | 99精品久久久久久久免费看蜜月|伊人久久大香线蕉无码不卡|免费观看的黄色片|99久热re在线精品996热视频|在线=a免费观看|337P日本大胆欧美裸体艺术 | 久草在线|粉嫩=av一区二区在线播放免费|丁香五月天综合缴情网|激情五月俺也去狠狠爱|天天做夜夜爱|欧美专区亚洲 | 欧美高清福利|免费亚洲黄色|黄片毛片免费|亚洲欧美日韩在线资源观看|国产精品久久久久久久久久久久午|日本三级播放 | 亚洲国产一区在线观看|免费=a级伦费影视在线观看|日本在线不卡一区二区三区|91在线免费视频观看|俄罗斯=a级毛片|丁香五月开心婷婷综合中文 | 韩国日本一区二区三区|91视频老司机|成人丁香社区|国产精选久久久久久|狠狠色噜噜狠狠狠狠888米奇|首页视频蝌蚪九色 | 国外精品视频在线观看免费|永夜星河免费观看|成人精品=av一区二区三区|老湿机香蕉久久久久久|日本=a级无毛|热久久一区 | 日韩=av在线中文|三年片在线观看大全中国|日韩视频在线观看中文字幕|91在线看免费|免费人成在线观看视频无码|一个人看的视频www在线观看 | 成人字幕网zmw|日本一区高清视频|#NAME?|麻豆播放|麻豆传媒作品|国产高清在线观看一区 | 国产一级=a特黄大片做受在线|亚洲精品屋V一区二区|亚洲午夜|亚洲综合爱爱|日本美女日b视频|日本国产=a | 广东少妇大战黑人34厘米视频|日韩午夜在线|国产=aⅴ激情无码久久久无码|精品人妻无码一区二区三区色欲|日本阿v天堂|亚洲视频在线播放 | 韩国久久=av|V一区无码内射国产|超级碰碰色偷偷免费视频|国产成人自拍网站|日韩1区2区3区|欧美亚洲日本精品 | 亚洲永久精品国语字幕|yellow中文字91幕国产在线|综合在线国产|少妇被粗大猛进去69影院|久操视频在线看|夜夜性日日交xxx性视频 | #NAME?|青青草在线视频免费观看|久草免费福利|日日噜噜夜夜狠狠爱视频免费樱桃|国产精品一级=a级理论片在线观看|亚洲狠狠色综合蜜桃 | 成人国产午夜在线观看|久久综合九色综合97欧美|99视频免费观看|久久久久久久国产精品毛片|久久99精品国产99久久|天堂成人国产精品一区 | 国产一级片一区|欧美在线观看中文字幕|波波成人网|亚洲第一色区|人妻免费一区二区三区最新|久久www色情成人免费 | 干亚洲美女|亚洲视频精选|91国自视频|亚洲一级影片|韩国三级在线中文字幕无码|xxx黄色片 | 欧美人与动人物牲交|国产精品一区hongkongdoll|97国产爽爽爽久久久|久久69国产一区二区蜜臀|成人免费在线视频网址|久久久久国产精品一区二区 | 艳魔大战4春荡女淫|97超碰免费观看|台湾佬成人网|亚洲性爱视频|无码精品一区二区三区免费视频|国产污视频在线播放 | 91=av爱爱|黄频视频大全免费的国产|日本亚洲一区二区|c=aoporn超碰地址进入|黄色在线免费观看视频|精品国产乱码久久久久久芒果 | 色妹子影院|国产福利在线永久视频|国产精品日韩精品|天堂在线99香蕉在线视频|日本欧美一区二区免费不卡|少妇人妻在线无码天堂视频网 | 视频麻豆|91嫩草在线免费观看|久久国产午夜|黑人与日本少妇J=aP=aNESE|免费大片黄在线观看|91色一区二区三区 | 欧美激情乱人伦|操综合网|在线中文字幕=av|熟女高潮视频|www.夜色321.com|国产一级淫片免费放大片 |