摘要:[VB6] 調用Excel函數及副程式
如果很瞭解excel函數功能的話,在vb底下也能呼叫函數,就小弟所知,excel有些含數是vb所沒有的,例如max,min這兩個函數是在求最大值及最小值,若是用vb寫這兩種功能可能要花掉不少時間,(網路上有一堆排序法,直接拿來copy也很快 哈哈)。
以下內容出於為http://blog.blueshop.com.tw/HammerChou/archive/2006/01/10/16062.aspx
用心學習吧~
=================================================================================================================
如何不使用數學運算 而直接使用 Excel 的 LCM 函數來取 [最小公倍數]
Dim xls As Object ' 建立物件
Set xls = CreateObject("Excel.Application") ' 建立 Excel Application 物建實體 ( 個體化 )
' 用 Excel 工作簿(集合物件) 開啟 atpvbaen.xla 增益集 ' xls.LibraryPath 為 Excel 函式庫資料夾路徑 - 註 1
' 呼叫 RunAutoMacros 方法來執行巨集 (Macro) - 註 2
' 1 為 xlAutoOpen - 註 3
xls.Workbooks.Open(xls.LibraryPath & "\Analysis\atpvbaen.xla").RunAutoMacros 1
' 使用 atpvbaen.xla 增益集中 LCM 函數來求取 6 , 12 , 144 的最小公倍數
MsgBox xls.Run("atpvbaen.xla!LCM", 6, 12, 144) ' 方法1
' GetMacroRegId 取得巨集登錄(註冊)ID
' 透過 GetMacroRegId 來取得 LCM 函數來計算 6 , 12 , 144 的最小公倍數
MsgBox xls.Run("GetMacroRegId(""lcm"")", 6, 12, 144) ' 方法2
xls.Quit ' 離開 ; 關閉 Excel
Set xls = Nothing ' 釋放 Excel 應用程式物件
By the way , 同理 .. 若語言本身無某些特定數學函數 , 則可運用此一方法來呼叫 Excel 函數使用
註 1 :
Excel 常用預設路徑
' 傳回取代啟動資料夾的名稱
Application.AltStartupPath
' 傳回目前工作簿的路徑 (檔案未存檔時傳回空字串)
ActiveWorkbook.Path
' 現用目前工作簿的路徑及檔案名稱(檔案未存檔時只傳回暫存檔名)
ActiveWorkbook.FullName
' 傳回儲存範本所在的網路路徑,如果指定的網路路徑不存在,本屬性將傳回一空字串
Application.NetworkTemplatesPath
' 傳回儲存範本所在的區域路徑
Application.TemplatesPath
' 傳回Excel程式完整路徑
Application.Path
' 傳回或者設定 Microsoft Excel 開啟檔案時使用的預設路徑
Application.DefaultFilePath
' 傳回啟動資料夾的完整路徑
Application.StartupPath
' 傳回程式庫資料夾的路徑
Application.LibraryPath
' 傳回使用者電腦上 COM 增益集安裝位置的路徑 (2000以上)
Application.UserLibraryPath
' 傳回路徑分隔符號
Application.PathSeparator
註 2 :
Excel 內有兩個自動巨集 , 一個是 Auto_Open , 一個是 Auto_Close
作用 :
當 Excel 開啟內含巨集的工作簿時 , 會自動執行 Auto_Open , 當關閉時會執行 Auto_Close
但若透過程式呼叫建立 Excel 應用程式物件時 ( OLE Automation ; ActiveX )
則並不會執行 Auto_Open , Auto_Close , 因此需透過 RunAutoMacros 方法來設定執行(動作)
註 3 :
RunAutoMacros 方法
Workbooks.RunAutoMacros(引數)
常數說明
xlAutoOpen : 1 - 自動開啟巨集
xlAutoClose : 2 - 自動關閉巨集
xlAutoActivate : 3 - 巨集作用
xlAutoDeactivate : 4 - 使巨集無效
=================================================================================================================
小弟根據本篇文章得到結果,若excel的函數可調用,那調用excel的巨集一樣可行,附件內容為小弟完成的範例,調用DBTEMPLET(共有813*86)資料來做實驗,原因是vb讀excel大資料的時候真的很慢,所以才想要用excel vba當副程式計算,再將計算完成的資料再回傳至vb主程式,這樣算出來的結果大約是4多秒,差強人意,但速度上已經比用vb直接讀excel快上很多(一分多鐘)
因為沒有寫回傳結果的程式,就用中斷的方式去檢查資料是否回傳。
若有謬誤,煩請告知,新手發帖請多包涵
Microsoft MVP Award 2010~2017 C# 第四季
Microsoft MVP Award 2018~2022 .NET