◆ 何詠明 (djkhym@netease.com)
VFP(Visual Foxpro)是一種關系型數據庫管理系統,由于其強大的數據處理能力及良好的兼容性,使其成為數據庫應用程序開發人員強有力的工具而廣為使用; 而Excel則是一個優秀的電子表格處理軟件,在兼容性、操作界面、公式運算、圖表等方面有著獨到的優勢,成為廣大辦公應用人員必備的首選軟件。上述兩種軟件在各自的應用領域均得到了廣泛的應用,同時上述兩種軟件還具有良好的交互編程能力,為兩者相輔相成、取長補短奠定了良好的基礎。
本文將結合實例介紹VFP與Excel交互編程的方法,在VFP中除了使用OLE技術外,還可使用DDE技術與外部服務器進行數據交換,本文主要講解VFP中使用OLE技術與Excel交換數據,Excel中借助內置的VBA使用VFP提供的Application對象來調用VFP中的一些功能。其功能可簡述如下:VFP數據表“學生成績.DBF”中含“學號、姓名、語文、數學”等字段,示例程序將從Excel工作簿“VFP交互.XLS”的工作表“查詢”中用“條件”區域(一般為一個矩形區中的數據,該區域名稱指定為“條件”,數據形如“語文>60”、“數學<90”等)中的數據作為查詢的條件,用“連接條件”區域(一般為一個單元格,其值為“or”或者“and”)來獲取組合“條件”的邏輯連接,并將該連接信息的內容以工作表的形式顯示出來,然后調用VFP中針對給定表的SQL查詢來找出給定條件的記錄并顯示到Excel中。下列程序均在VFP 6.0與Excel 2000中調試通過。
Excel驅動VFP
Excel內置的VBA語言(Visual Basic For Application)為Excel功能的擴展提供了便利的手段,用戶可使用該語言直接驅動VFP完成數據檢索等功能。程序首先生成一個VFP對象,然后用VFP的DoCmd方法執行VFP搜索命令串,其搜索結果再借助于VFP的DataToClip方法拷貝至剪切板,最后VBA將其粘貼至工作表的正確位置,為了每次運行時能將結果插入到工作表中,依次對操作的工作表以“搜索結果”、“搜索結果1”等進行編號。
Sub exceluseFox ()
Dim oFox As Object ’聲明oFox為一個對象
Dim SCommand As String
’SQL對應的命令串變量
Dim cell As Variant
Dim choice As String
Dim join As String
Dim first As Boolean
Dim found As Boolean ’搜索結果標志,若表單中有搜索結果,則為真
Set oFox = CreateObject(“VisualFoxPro
.Application”)
’啟動VFP,生成VFP對象
Sheets(“查詢”).Select
’選擇對應的工作表“查詢”
join = Range(“連接條件”)
’在單一表格中的一個元素,其值為and或者or
choice = “” ’置連接串初值為空
first = True ’一般情況下連接串后需要加上邏輯連接符and 或 or,首次例外
For Each cell In Range(“條件”) ’產生連接條件,形成where語句的連接邏輯串
If first Then
choice = choice + cell ’形成第一次出現的where子句后的字符串
first = False
’修改首次進入標志,以后的連接均需要加上邏輯連接符
Else
choice = choice + “ ” + join + “ ” + cell
’join的值是and或者是or
End If
Next cell
Sheets.Add ’ 產生新的工作表單
’找一個不重復的工作表名
found = False
’工作表名中前四個漢字有沒有“搜索結果”的標志變量
n = 1
For Each cell In Worksheets
If InStr(1, cell.Name, “搜索結果”) <> 0 Then
found = True ’找到對應的工作表
If n < Val(Mid(cell.Name + Space(2), 5, 2)) Then
n = Val(Mid(cell.Name + Space(2), 5, 2))
’形成形如搜索結果1、搜索結果2等的表單名
End If
End If
Next cell
If Not found Then
ActiveSheet.Name = “搜索結果”
Else
n = n + 1 ’值增1
ActiveSheet.Name = “搜索結果”& n
’形成工作表名
End If
SCommand =“SELECT * FROM d:\vfp\學生成績表WHERE”+choice +“ INTO CURSOR TEMP” ’形成VFP查詢命令串
oFox.DoCmd Scommand ’執行VFP命令串
oFox.DataToClip “temp”, , 3
’將搜索結果以文本方式拷貝至剪切板
Range(“a1: a1”).Select
’指向拷貝目標區域左上角單元
ActiveSheet.Paste ’粘貼搜索結果
End Sub
上述Excel中的區域名稱(如“條件”和“連接條件”名稱)的設定方法是,在Excel中選擇菜單“插入->名稱->定義”來完成對給定區域名稱的設定,這個名稱可以在VBA中訪問,如前述中的“條件”和“連接條件”。
VFP使用Excel
OLE(Object Linking and Embedding)對象鏈接與嵌入,是Windows應用程序間相互傳遞和共享數據的一種有效方法。VFP借助于OLE不僅可共享其他應用程序的數據,而且還能以對象方式直接控制其他應用程序的運行,從而進一步擴展VFP的功能。VFP支持直接在程序中創建、使用和控制OLE對象,實現OLE自動化。作為OLE客戶,VFP與作為OLE服務器的Excel具有良好的編程接口,下述程序段用OLE方式實現所要求的功能。程序首先生成一個Excel的OLE對象OleApp以便對其進行操作,然后利用OLE功能從Excel表單中獲取欲查詢的條件,并控制Excel生成新的唯一的工作表,通過找尋當前操作的所有工作表達到名稱的唯一,VFP的查詢結果仍然使用剪切板的方式傳遞至Excel工作表中。
local condition,where1,first,scommand,cell,newsheet,found1,n
OleApp=CreateObject(“Excel.Application”)
&& 打開Excel,產生OLE對象
OleApp.Application.Caption=“VFP交互編程”
&& 指定標題欄名稱
OleApp.Application.Visible=.T.
&& 置Excel可見
OleApp.Application.WorkBooks.Open(“d:\vfp\VFP交互.xls”)
&& 打開Excel工作簿,用戶也可以修改連接條件或者查詢條件
where1=“”
&&保存SQL中where子句的變量
first=.t.
&&置首次進入“查詢”工作表中“條件”區域標志
found1=.f.
n=1
DO WHILE .T.
WITH OleApp.Application
nAnswer = MessageBox(“開始搜索?”, 32+4, “搜索指定數據”)
&&顯示搜索信息
IF (.NOT. (nAnswer=6))
&& 如按下“Yes”按鈕,則開始搜索,反之退出
EXIT
ENDIF
.Sheets(“查詢”).Select
&& 選取示例中的對應工作表
condition=.range(“連接條件”).value
&&得到“連接條件”區域中的邏輯連接符
for each cell in .range(“條件”).value
&&將表單區域內所有單元的數據拼接以形成where的連接邏輯串
If first Then
Where1 = Where1 + cell
&&首次進入時where子句中串前不需要邏輯連接符
first = .f. &&置非首次進入標志
Else
Where1=Where1 +“ ”+condition +“ ”+ cell
&&這里condition的值取and或者or
EndIf
next for
.Sheets.Add && 新建一工作表單
&&下面的for …each子句是用于找尋有否對應的工作表,若有則在搜索結果1、搜索結果2……搜索結果n中得到最大的n值以便產生下一個比n大1的新工作表“搜索結果&(n+1)”
for each newsheet in .worksheets
if “搜索結果”$ newsheet.name
n=max(val(subset(newsheet.name+space(2),9,2)),n) &&得到最大的n值
found1=.t. &&置找到工作表中前四個漢字是“搜索結果”的工作表
endif
next for
if not found1
.ActiveSheet.Name =“搜索結果1”
&& 指定工作表單的名稱
else
.activesheet.name=“搜索結果”+str(n+1,2)
&&得到唯一的工作表
endif
SCommand = “SELECT * FROM d:\vfp\學生成績表 WHERE ”+ALLTrim(where1) +
“INTO CURSOR TEMP”
&& 形成VFP查詢命令串
&Scommand && 執行VFP命令串
_VFP.DataToClip(“TEMP”, , 3)
&& 將搜索結果以文本方式拷貝至剪切板
.Range(“a1: a1”).Select
&& 指向拷貝目標區域左上角單元
.ActiveSheet.Paste
&& 粘貼搜索結果
ENDWITH
ENDDO
OleApp.Quit
&& 關閉Excel,保存更新后的工作簿文件
結束語
VFP與Excel的交互能力是很強的,用戶可以使用VFP處理數據庫的一些運算,如插入、排序、合并、選擇等,將結果交由Excel中進行一些后期的處理,甚至可以將一些抽取數據的條件直接加入到Excel的條件區域中,由VFP來讀取條件區域進行數據的篩選?傊,只要能充分利用好各自的優點,理解交互的接口方法,就一定能夠編寫出較適用的程序,滿足實際工作的需要。
|