MasteringVFP/13/7
出自VFP Wiki
目錄 |
進階實例應用1-在VFP中操作Excel進行列印
出處與作者
出處:我要把DBF的資料印出,搞不定??,本篇已經作者:盧明貴同意,將程式轉貼於此。
在螢幕上預覽,再列印
lo_excel = createobject('Excel.Application') lo_excel.workbooks.add with lo_excel.application && 此為指向 lo_Excel.Application 這一層,如此可使下一列 lo_Excel.Application.Visible = .T. 變成比較簡短 .displayalerts=.f. && 關閉警告,如存檔詢問是否覆蓋舊檔 .screenupdating=.f. && 關閉即是運算,加快處裡速度 *.Run("Macro1") && 執行巨集 .cells.select && 選取整個Excel工作表 .activewindow.zoom=75 && 顯示比例 75% .selection.font.name = '細明體' && 設定字型 .selection.font.size = 12 && 設定字體大小 .selection.columns.autofit && 最適欄寬 .Rows("2:2").Select .Selection.RowHeight = 20 &&設定列高 .Columns("A:A").Select .Selection.ColumnWidth = 100 &&設定欄寬 .cells(2,1).value='這是測試程式的第一列資料,妳可以把欄寬設定跟印表機一樣寬,也許是80行吧,' &&儲存格填入值 .cells(3,1).value='這是測試程式的第二列資料,資料就隨便妳放啦,高興怎麼印就怎麼印' &&儲存格填入值 .cells(4,1).value="'12345678901234567890123456789012345678901234567890123456789012345678901234567890" &&儲存格填入值 .cells(5,1).value="商品編號 品名 數量 單價 小計 備註" &&儲存格填入值 .cells(6,1).value="10001 Foxpro 9.0 英文版 1 25000 25000 金額亂打的" &&儲存格填入值 .cells(7,1).value="10002 Excel 2003 中文版 1 4000 4000 也是亂打的" &&儲存格填入值 .cells(8,1).value=" 合計: 29000" &&儲存格填入值 .cells(1,1).select && 選定A1儲存格 .selection.end(-4161).select && 選定第一列最後一行儲存格 .range(.selection, .cells(.activecell.row, 1)).select && 從目前選定的儲存格往左連續選取至第一個儲存格 with .selection *.Interior.Pattern = 2 .horizontalalignment = -4108 && 儲存格置中顯示 .borders(1).linestyle = 1 && 每個(各個)儲存格 Left 框線為實線 .borders(2).linestyle = 1 && 每個(各個)儲存格 Top 框線為實線 .borders(3).linestyle = 1 && 每個(各個)儲存格 Bottom 框線為實線 .borders(4).linestyle = 1 && 每個(各個)儲存格 Right 框線為實線 .borders(7).weight = -4138 && 選取區塊的最 Left 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(8).weight = -4138 && 選取區塊的最 Top 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(9).weight = -4138 && 選取區塊的最 Bottom 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(10).weight = -4138 && 選取區塊的最 Right 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 *.Borders(11).Weight = 2 && 選取區塊的內部垂直線的寬度為 xlThin 或 2 *.Borders(12).Weight = 2 && 選取區塊的內部水平線的寬度為 xlThin 或 2 *.Interior.ColorIndex = 35 && 填滿儲存格顏色為淺綠色 .interior.colorindex = 5 && 填滿儲存格顏色為寶藍色 .font.colorindex = 2 && 變更儲存格字體顏色為白色 endwith .range("A2").select && 點選 A2 儲存格 .activewindow.freezepanes=.t. && 凍結窗格 *lo_Excel.ActiveSheet.HPageBreaks.Add(.Cells(5, 1)) && 插入分頁 *.Columns("F:F").Select && 選取整個欄 F:F *With .Selection * .HorizontalAlignment = -4108 && 儲存格置中 *EndWith *.ActiveCell.SpecialCells(11).Select && 直接選取最後一欄最後一列儲存格 ,在Excel內操作為 Ctrl+End with .activesheet.pagesetup .printtitlerows = "$1:$1" && 版面設定之工作表列印標題列 .centerfooter = "第 &P 頁,共 &N 頁" && 版面設定之頁尾 .printgridlines = .t. && 版面設定之列印選取列印格線 endwith .screenupdating=.t. && 打開即時運算,將最後結果運算出來 .visible = .t. && 檢視Excel *.activeworkbook.save && 儲存檔案 *if ll_quit=.t. *&& 呼叫程式傳值確定要關閉Excel檔案 * .activeworkbook.close() * .quit() *endif endwith
不預覽,直接列印
lo_excel = createobject('Excel.Application') lo_excel.workbooks.add with lo_excel.application && 此為指向 lo_Excel.Application 這一層,如此可使下一列 lo_Excel.Application.Visible = .T. 變成比較簡短 .displayalerts=.f. && 關閉警告,如存檔詢問是否覆蓋舊檔 .screenupdating=.f. && 關閉即是運算,加快處裡速度 *.Run("Macro1") && 執行巨集 .cells.select && 選取整個Excel工作表 .activewindow.zoom=75 && 顯示比例 75% .selection.font.name = '細明體' && 設定字型 .selection.font.size = 12 && 設定字體大小 .selection.columns.autofit && 最適欄寬 .Rows("2:2").Select .Selection.RowHeight = 20 &&設定列高 .Columns("A:A").Select .Selection.ColumnWidth = 100 &&設定欄寬 .cells(2,1).value='這是測試程式的第一列資料,妳可以把欄寬設定跟印表機一樣寬,也許是80行吧,' &&儲存格填入值 .cells(3,1).value='這是測試程式的第二列資料,資料就隨便妳放啦,高興怎麼印就怎麼印' &&儲存格填入值 .cells(4,1).value="'12345678901234567890123456789012345678901234567890123456789012345678901234567890" &&儲存格填入值 .cells(5,1).value="商品編號 品名 數量 單價 小計 備註" &&儲存格填入值 .cells(6,1).value="10001 Foxpro 9.0 英文版 1 25000 25000 金額亂打的" &&儲存格填入值 .cells(7,1).value="10002 Excel 2003 中文版 1 4000 4000 也是亂打的" &&儲存格填入值 .cells(8,1).value=" 合計: 29000" &&儲存格填入值 .cells(1,1).select && 選定A1儲存格 .selection.end(-4161).select && 選定第一列最後一行儲存格 .range(.selection, .cells(.activecell.row, 1)).select && 從目前選定的儲存格往左連續選取至第一個儲存格 with .selection *.Interior.Pattern = 2 .horizontalalignment = -4108 && 儲存格置中顯示 .borders(1).linestyle = 1 && 每個(各個)儲存格 Left 框線為實線 .borders(2).linestyle = 1 && 每個(各個)儲存格 Top 框線為實線 .borders(3).linestyle = 1 && 每個(各個)儲存格 Bottom 框線為實線 .borders(4).linestyle = 1 && 每個(各個)儲存格 Right 框線為實線 .borders(7).weight = -4138 && 選取區塊的最 Left 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(8).weight = -4138 && 選取區塊的最 Top 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(9).weight = -4138 && 選取區塊的最 Bottom 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 .borders(10).weight = -4138 && 選取區塊的最 Right 框線的寬度為 xlMedium 或 -4138,預設值為 xlThin 或 2 *.Borders(11).Weight = 2 && 選取區塊的內部垂直線的寬度為 xlThin 或 2 *.Borders(12).Weight = 2 && 選取區塊的內部水平線的寬度為 xlThin 或 2 *.Interior.ColorIndex = 35 && 填滿儲存格顏色為淺綠色 .interior.colorindex = 5 && 填滿儲存格顏色為寶藍色 .font.colorindex = 2 && 變更儲存格字體顏色為白色 endwith .range("A2").select && 點選 A2 儲存格 .activewindow.freezepanes=.t. && 凍結窗格 *lo_Excel.ActiveSheet.HPageBreaks.Add(.Cells(5, 1)) && 插入分頁 *.Columns("F:F").Select && 選取整個欄 F:F *With .Selection * .HorizontalAlignment = -4108 && 儲存格置中 *EndWith *.ActiveCell.SpecialCells(11).Select && 直接選取最後一欄最後一列儲存格 ,在Excel內操作為 Ctrl+End with .activesheet.pagesetup .printtitlerows = "$1:$1" && 版面設定之工作表列印標題列 .centerfooter = "第 &P 頁,共 &N 頁" && 版面設定之頁尾 .printgridlines = .t. && 版面設定之列印選取列印格線 endwith .screenupdating=.t. && 打開即時運算,將最後結果運算出來 *.visible = .t. && 檢視Excel .ActiveWindow.SelectedSheets.PrintOut(1,.t.) &&直接印到印表機 *.activeworkbook.save && 儲存檔案 *if ll_quit=.t. *&& 呼叫程式傳值確定要關閉Excel檔案 .activeworkbook.close() .quit() *endif endwith
加上保護,不讓使用者修改
.ActiveSheet.Protect(.t.,.t.,.t.) &&保護工作表
寫入欄位名稱
關鍵是使用 fields() 函數
for jj=1 to fcount() .cells(1,jj).value=fields(jj) &&寫入欄位名稱 endfor
選取欄位與格式化
.Columns("I:I").Select .Selection.NumberFormatLocal = "0.00_ " &&設定儲存格格式,數值,小數點2位
改變欄寬
.Columns("A:A").Select .Selection.ColumnWidth = 100
.range("A1").select && 點選 A1 儲存格 .Selection.ColumnWidth = 100
.cells(2,2).select && 點選 B2 儲存格 .Selection.ColumnWidth = 100
改變列高
.Rows("2:2").Select .Selection.RowHeight = 20
小秘訣
有任何Excel的VBA語法不知道的,用下列步驟取得:
- Excel錄製巨集
- 編輯巨集
- 將語法copy過來用
注意事項:以上面的保護來說,錄製出來的程式碼是:
.ActiveSheet.Protect DrawingObjects:=True, Contents:=True, Scenarios:=True
使用時,要將他改成:
.ActiveSheet.Protect(.t.,.t.,.t.)
有三個值都是True,把他包在括弧內用逗點分開。
再舉一個例子,以靠左對齊為例:Excel上方不是有一個"靠左對齊"按鈕?
前面貼出的程式有一下內容:
.Columns("F:F").Select && 選取整個欄 F:F With .Selection .HorizontalAlignment = -4108 && 儲存格置中 EndWith
首先去錄製巨集,得到結果如下:
.HorizontalAlignment = xlLeft &&靠左對齊 .HorizontalAlignment = xlCenter &&置中 .HorizontalAlignment = xlRight &&靠右對齊
用Excel VBA編輯,打開即時運算視窗,輸入 ?xlLeft,取得變數值如下:
- xlLeft=-4131
- xlCenter=-4108
- xlRight=-4152
在VFP中使用時,就必須將它改成以下:
.HorizontalAlignment = -4131 && xlLeft 靠左對齊 .HorizontalAlignment = -4108 && xlCenter 置中 .HorizontalAlignment = -4152 && xlRight 靠右對齊
作者的話
更彈性:變顏色,字型,加外框,加底色,隱藏.......更重要的是,可以讓使用者改變報表的外觀,使用者也可以改變公式,也可以和Word合併列印,也可以自行合併多個工作表或多個Excel檔案,也可以貼上連結到PowerPoint做簡報,Excel內容改變,PowerPoint內容也跟著改變。使用者可以改變報表,就不需要凡事都要找程式師,字體加個底線也要找程式師改程式,加總公式改變也要找程式師,報表標題改變也要找程式師..... 唬爛了一堆,希望你能聽懂,也要舉一反三。