撰寫日期:1996/07/10 MS Office 自動化巨集 網頁化日期:1999/02/03

  本報告的目的:

1. 自動化的目的促進工作效率,減少人工成本。

(1) 論文、報告及作業的圖形大量繪製或重新繪製。

(2) 論文、報告及作業的相似表格大量繪製或重新繪製。

(3) 重複性的動作。

2. 應用軟體特殊性影響程式架構的位置。

(1) 利用 Excel 現成函數或功能時,如反矩陣、統計函數、線性規劃等。

(2) 利用 MicroStation 功能時,如圖元截取、圖元修改編製等。

3. 可利用資源充沛。

(1) 可利用 ODBC 連結存取任一資料庫,不須修改程式碼。

(2) 操作介面製作容易。

(3) 可利用 Windows 所提供之所有資源。

(4) 可透過 OLE DDE 等利用 Windows 下相關應用軟體資源。

4. 與 Visual BASIC 相容。

(1) 除各應用軟體所提供之特殊物件外,程式碼及觀念皆相容。

(2) 若透過 OLE 引入應用軟體時,則特殊物件亦同時引入 VB

 

2.1 巨集

  巨集 (marco) 的意思就是以簡單的按鍵取代一連串的按鍵動作。後來在組合語言、程式編譯設定檔 (Make File) 及程式啟始設定檔大量使用 marco 的名詞,使巨集有了新的含義,巨集代表一連串的指定動作。在 MS Office 中定義廣義的巨集含義,巨集是一連串的事件、動作的組合。這種廣義的定義來說,巨集已和程式無異了。

  提供巨集的各 Windows 應用軟體中,目前以 Word 5.x 以後版本、 Excel 5.x 以後版本、 Access 7.0 MicroStation 95 有相同的標準及操作:

1. 以 BASIC 為基本語法,並與 Visual BASIC for App. 相容。

2. 可完全不用瞭解巨集語法,僅以「錄製巨集」、「執行巨集」即可使用。

3. 有完整的編緝、除錯、輔助說明及操作環境。

4. 均具有完整的對話盒編緝器,可建立私有的操作環境。

 

2.2 建立巨集

  建立巨集可以從最簡單的「錄製巨集」開始。例如說我們有多個文件,其中有多個須要替換的詞句,如「規畫」改成「規劃」、「計劃」改成「計畫」等,雖然應用軟體皆提供了替換的工具箱,但若要替換的檔案或詞句一多,工作量則以倍份增加。這時可考慮採用「巨集」,怎麼作呢?

1. 由選單中選出「錄製巨集」,並決定巨集名。

2. 正常操作單一檔案的各個替換工作。

3. 單一檔案的各個替換工作完畢後,選擇「停止錄製巨集」。

4. 開啟其它工作檔並選擇原巨集後執行。

  從第二個工作檔以後,所有的替換動作皆僅須一執行巨集的功能即可取代。但並不一定所有的動作街皆可由「錄製巨集」完成,例如判斷或迴圈等,這種情形就須進入編緝巨集來完成。例如前例改為所有同目錄或指定文件希望一次完成,則巨集就必須迴圈化來處理。但若做該巨集僅使用少次,則須考慮時間及工作量是否有確切減少,以免增加工作時間及工作量。

  以 Word 來說,所有錄製之巨集皆存放於 Normal.dot 下,建議利用組合管理的功能將自己需要保存的巨集另存它檔,一方面便於管理分類,一方面若有巨集病毒入侵也可以比較容易發現。最好是將對 Normal.dot 檔的存取確認盒設定打開,這樣也容易過濾巨集病毒。

 

2.3 遙控應用軟體

  Windows 提供四種方法控制其它應用軟體或傳遞資料:

1. 動態資料交換 (DDE)

2. 物件插入 (OLE)

3. 剪貼簿 (Clpboard)

4. 應用程式控制 (App. Control)

  本報告僅介紹方法 4 ,方法 1 及方法 2 坊間皆有超過 1,000 頁的專書介紹,在本報告中不多作說明,方法 1 約需專章討論,在本報告中亦不多加說明。

  應用程式控制常用之主要函數分述如下:

1. AppActivate 陳述式:啟動應用程式視窗。

語法:AppActivate title [,wait]

2. Shell 函數:執行一個可執行的程式。

語法:Shell(pathname[,windowstyle])

3. SendKeys 陳述式:將一或多個按鍵傳送到作用中的視窗上,如同在鍵盤上做輸入一樣。

語法:SendKeys string[,wait]

  由上面常用之主要函數可知,凡是要啟動其它軟體且所有步驟皆可以鍵盤處理之情形時,可以利用自動化來操作個軟體,與 DOS 的批次檔頗有異曲同工之妙。

 

2.4 範例

  為特殊目的而修改程式碼的狀況在此不多加敘述,本範例簡單介紹如何利用 Excel 強大的繪圖功能,將其繪圖的成果自動送進 Word 成為報告或論文。透過 Excel 來處理繪圖的原因是 Excel 有強大的文字轉取精靈,一般格式化的文字檔可輕易的轉入 Excel ,不論計算、繪圖、表格皆適宜,透過 Excel 處理可節省發展資料讀取程式的時間。以繪圖來說,繪圖範例做好後,調整資料內容或資料區間即可複製送入 Word ,若有範例外的功能要調整,亦可利用「錄製巨集」取得修改簡例,範例可由錄製巨集進行修改,亦可重新打入。在 Word 部份來說, Word Excel 圖要貼成 Graph5 的格式,因此這部份由貼上到完成利用「錄製巨集」的功能,簡單的錄製成一巨集 "PasteGraph5" 以方便處理。

 

Sub 自動繪圖送入word()
 
'  讀入所有欲處理之資料檔名
 
DataSSEDefineName$ = "D:\STAFF\Netflow\Neural\annpc\paper\autodraw.in"
Open DataSSEDefineName$ For Input As 1
TotalFileInN = 0
Do
 Line Input #1, TempC$
 If TempC$ <> "" Then
  TotalFileInN = TotalFileInN + 1
 End If
Loop Until EOF(1)
Close 1
 
ReDim FileSSEInC$(1 To TotalFileInN)
Open DataSSEDefineName$ For Input As 1
For i = 1 To TotalFileInN
 Line Input #1, FileSSEInC$(i)
Next i
Close 1
 
'  依序處理所有讀入之資料檔
 
For i = 1 To TotalFileInN
 
'  Select 如同滑鼠點選一下!相當於在畫面下方 Sheet1 按一下滑鼠左鍵
 
 Sheets("Sheet1").Select
 
'  利用 Excel 開啟一般 ASC II
 
 Workbooks.OpenText Filename:=FileSSEInC$(i), StartRow:=1, DataType: = xlFixedWidth
 Columns("B:C").Select
 Selection.Copy
 Windows("autodraw.xls").Activate
 Columns("A:B").Select
 ActiveSheet.Paste
 For j = Len(FileSSEInC$(i)) To 1 Step -1
  If Mid(FileSSEInC$(i), j, 1) = "\" Then
   CloseWindowName$ = Mid(FileSSEInC$(i), j + 1)
   Exit For
  End If
 Next j
 Windows(CloseWindowName$).Activate
 Range("a1").Select
 Selection.Copy
 ActiveWindow.Close
 
 Sheets("Sheet1").Select
 Columns("A").Select
 Selection.Copy
 Sheets("Sheet2").Select
 Columns("A").Select
 ActiveSheet.Paste
 Sheets("Sheet1").Select
 Columns("C").Select
 Selection.Copy
 Sheets("Sheet2").Select
 Columns("B").Select
 Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone
 
 Range("a1") = "觀測流量"
 Range("b1") = "推算流量"
 MaximumLine = 0
 Do
  MaximumLine = MaximumLine + 1
  TempRange$ = "a" + Format(MaximumLine, "#")
  If Range(TempRange$) = "" Then
   MaximumLine = MaximumLine - 1
   Exit Do
  End If
 Loop
 summy = DoEvents()
 ActiveSheet.DrawingObjects("Chart 1").Select
 TempRange$ = "a1:b" + Format(MaximumLine, "#")
 ActiveChart.ChartWizard Source:=Range(TempRange$)
 summy = DoEvents()
 ActiveSheet.DrawingObjects("Chart 1").Select
 Selection.Copy
 
'  切換或啟動 Word
 
 Application.ActivateMicrosoftApp xlMicrosoftWord
 summy = DoEvents()
 SendKeys "{ENTER}", True
 SendKeys "^{END}", True
 SendKeys "{ENTER}", True
 SendKeys FileSSEInC$(i), True
 SendKeys "{ENTER}", True
 SendKeys "%t", True
 SendKeys "m", True
 SendKeys "PasteGraph5", True
 SendKeys "%r", True
 SendKeys "{ENTER}", True
 For TimeSleep = 1 To 50
  summy = DoEvents()
 Next TimeSleep
 AppActivate "Microsoft Excel" ' 回到 Excel
 
Next i
 
End Sub