MasteringVFP/13/7

出自VFP Wiki

(修訂版本間差異)
跳轉到: 導航, 搜尋

在2006年8月31日 (四) 08:24所做的修訂版本

目錄

進階實例應用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語法不知道的,用下列步驟取得:

  1. Excel錄製巨集
  2. 編輯巨集
  3. 將語法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內容也跟著改變。使用者可以改變報表,就不需要凡事都要找程式師,字體加個底線也要找程式師改程式,加總公式改變也要找程式師,報表標題改變也要找程式師..... 唬爛了一堆,希望你能聽懂,也要舉一反三。