返回列表 上一主題 發帖

[分享] 關於VB6(or VSTO)製作Excel DLL相關技巧

[分享] 關於VB6(or VSTO)製作Excel DLL相關技巧

本帖最後由 HUNGCHILIN 於 2012-2-25 00:02 編輯

最近突然覺得無聊了起來,提不起勁。可能是到了又要尋找方向突破的時候
目前應該有兩個方向去試鍊與應用
1.2010版功能應用
2.VB(or VSTO)製作Excel DLL相關技巧

本文在於試鍊與記錄VB(or VSTO)製作Excel DLL相關技巧
以下先介紹VB6製作ActiveX DLL或增益功能...等舊方法,再介紹VSTO方法
Hung-Chi Lin/林宏吉
HUNGCHILIN/林宏吉的OFFICE專欄

本帖最後由 HUNGCHILIN 於 2012-2-25 02:32 編輯

關於 安裝 dll


使用vbs檔安裝dll(假設安裝 ULCase.dll)
  1.在txt檔內輸入
     RegSvr32.exe ULCase.dll
  2.改檔名為.BAT,即完成安裝檔

使用vbs檔卸載dll(假設卸載 ULCase.dll)
  1.在txt檔內輸入
     RegSvr32.exe ULCase.dll / U
  2.改檔名為.BAT,即完成安裝檔

安裝卸載BAT.rar (189 Bytes)
Hung-Chi Lin/林宏吉
HUNGCHILIN/林宏吉的OFFICE專欄

TOP

本帖最後由 HUNGCHILIN 於 2012-2-28 23:24 編輯

關於 如何製作第一個DLL檔


a.我們使用英文大小寫轉換.XLA 增益集 來作改編
大小寫轉換.rar (20.97 KB)
excel原始程式碼
  1. Option Explicit
  2. Sub 首字大寫轉換()
  3. On Error GoTo 1
  4. Dim RANGECOUNT
  5. Dim RANGECOUNTA
  6. Application.ScreenUpdating = False
  7. For Each RANGECOUNT In Selection
  8. RANGECOUNTA = RANGECOUNTA + 1
  9. If Range(Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  10. Range(Selection.Address).Cells(RANGECOUNTA) = WorksheetFunction.Proper(Range(Selection.Address).Cells(RANGECOUNTA))
  11. 2 Next
  12. 1 End Sub
  13. Sub 大寫轉換()
  14. On Error GoTo 1
  15. Dim RANGECOUNT
  16. Dim RANGECOUNTA
  17. Application.ScreenUpdating = False
  18. For Each RANGECOUNT In Selection
  19. RANGECOUNTA = RANGECOUNTA + 1
  20. If Range(Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  21. Range(Selection.Address).Cells(RANGECOUNTA) = UCase(Range(Selection.Address).Cells(RANGECOUNTA))
  22. 2 Next
  23. 1 End Sub
  24. Sub 小寫轉換()
  25. On Error GoTo 1
  26. Dim RANGECOUNT
  27. Dim RANGECOUNTA
  28. Application.ScreenUpdating = False
  29. For Each RANGECOUNT In Selection
  30. RANGECOUNTA = RANGECOUNTA + 1
  31. If Range(Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  32. Range(Selection.Address).Cells(RANGECOUNTA) = LCase(Range(Selection.Address).Cells(RANGECOUNTA))
  33. 2 Next
  34. 1 End Sub
複製代碼
----------------------------------------------------------------------------------------------------------------------------
b.使用VB6製作dll
  1.先COPY 英文大小寫轉換.XLA 增益集 內模組內的程式
  2.開啟vb6
2012-02-25 01-51-05.jpg
2012-2-25 01:52


  3.刪除預設的表單&新增一個class
     更改class名稱為ULCASECLASS (記住等一下要用)
     並把英文大小寫轉換.XLA 增益集 內模組內的程式貼進class
2012-02-25 01-54-11.jpg
2012-2-25 01:57

2012-02-25 01-56-20.jpg
2012-2-25 01:57


更改class內的程式碼為
  1. Option Explicit
  2. Sub ULCase()
  3. On Error GoTo 1
  4. Dim EXL As Object
  5. Set EXL = GetObject(, "Excel.Application")
  6. With EXL
  7. Dim RANGECOUNT
  8. Dim RANGECOUNTA
  9. .ScreenUpdating = False
  10. For Each RANGECOUNT In .Selection
  11. RANGECOUNTA = RANGECOUNTA + 1
  12. If .Range(.Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  13. .Range(.Selection.Address).Cells(RANGECOUNTA) = .WorksheetFunction.Proper(.Range(.Selection.Address).Cells(RANGECOUNTA))
  14. 2 Next
  15. End With
  16. Set EXL = Nothing
  17. 1 End Sub
  18. Sub UCaseA()
  19. On Error GoTo 1
  20. Dim EXL As Object
  21. Set EXL = GetObject(, "Excel.Application")
  22. With EXL
  23. Dim RANGECOUNT
  24. Dim RANGECOUNTA
  25. .ScreenUpdating = False
  26. For Each RANGECOUNT In .Selection
  27. RANGECOUNTA = RANGECOUNTA + 1
  28. If .Range(.Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  29. .Range(.Selection.Address).Cells(RANGECOUNTA) = UCase(.Range(.Selection.Address).Cells(RANGECOUNTA))
  30. 2 Next
  31. End With
  32. Set EXL = Nothing
  33. 1 End Sub
  34. Sub LCaseA()
  35. On Error GoTo 1
  36. Dim EXL As Object
  37. Set EXL = GetObject(, "Excel.Application")
  38. With EXL
  39. Dim RANGECOUNT
  40. Dim RANGECOUNTA
  41. .ScreenUpdating = False
  42. For Each RANGECOUNT In .Selection
  43. RANGECOUNTA = RANGECOUNTA + 1
  44. If .Range(.Selection.Address).Cells(RANGECOUNTA) = "" Then GoTo 2
  45. .Range(.Selection.Address).Cells(RANGECOUNTA) = LCase(.Range(.Selection.Address).Cells(RANGECOUNTA))
  46. 2 Next
  47. End With
  48. Set EXL = Nothing
  49. 1 End Sub
複製代碼
4.點設計師中的Connect如圖,進入後更改應用程式為excel與應用程式版本假設為9.0,設定載入行為為None
2012-02-25 02-05-00.jpg
2012-2-25 02:11


5.點設計師中的Connect按右鍵選檢視程式碼刪除裡面所有程式
2012-02-25 02-15-47.jpg
2012-2-25 02:17


6.到專案設定屬性如下圖(請記得屬性描述)
2012-02-25 02-18-07.jpg
2012-2-25 02:20


7.儲存專案如附檔,裡面有一些暫存檔可以不用理會
ULCasea.rar (10.09 KB)

8.製成DLL檔 如圖 (如果程式有問題VB會偵錯)
2012-02-25 02-24-44.jpg
2012-2-25 02:26

成品: ULCase.rar (5.43 KB)

9.安裝DLL檔,請下載第二帖 到DLL同資料夾 並按"安裝BAT檔"

10.Excel vba如何使用DLL內的程式
需要在Excel模組內輸入下列程式
  1. Public Sub aa()
  2. Dim XLSULCASE As New ULCASECLASS
  3. XLSULCASE.ULCase
  4. End Sub

  5. Public Sub bb()
  6. Dim XLSULCASE As New ULCASECLASS
  7. XLSULCASE.UCaseA
  8. End Sub

  9. Public Sub cc()
  10. Dim XLSULCASE As New ULCASECLASS
  11. XLSULCASE.LCaseA
  12. End Sub
複製代碼
附檔: 大小寫轉換使用DLL.rar (4.91 KB)
使用上述10個小步驟即可完成製作與使用DLL程式
Hung-Chi Lin/林宏吉
HUNGCHILIN/林宏吉的OFFICE專欄

TOP

你好,先謝謝大大分享

我是VB6新手,嘗試照著大大的步驟做封裝,但去到以下步驟就不懂了︰

以下是我開啟VB6後的情況,找不到「設計師」(如大大的圖),請問怎樣做才看到「設計師」一項呢?謝謝賜教!

我的圖片

1.jpg
2012-4-9 06:37


大大的圖片︰

TOP

看到b 2步驟
有選 activex dll
Hung-Chi Lin/林宏吉
HUNGCHILIN/林宏吉的OFFICE專欄

TOP

[版主管理留言]
  • HUNGCHILIN(2012-4-10 00:30): 這個畫面是VISTA+VB6的畫面 我之前電腦壞了現在用 WIN7 還沒測過 晚一點再測看看...微軟可能想要我們換軟體了吧 之前看VB6與VSTO製作就有些差異 看來還是要盡速捨棄VB6加速往VSTO為要

看到b 2步驟
有選 activex dll
HUNGCHILIN 發表於 2012-4-9 22:16



    已選了 Activex Dll,選了後只出現我上一貼附圖效果。

另外,我的電腦是用WINDOW 7,網上睇資料,好像說VB6用在WINDOW7上會出問題,是否真的這樣?

謝謝

TOP

參與 6# sklo


    在專案名稱 Project1 按右鍵,選擇加入 ADDIN CLASS 即可以有 設計師 AddInDessigner1;把它的名稱改為 Connect;只是表格中的 "應用程式(A)" 只能有 Default 值 "Visual Basic"; "應用程式版本" 也是 Default 值 "Visual Basic 6.0" ;所以玩不下去。
有請大師指點迷津。

TOP

使用 VB6.0 或 2008製作 .dll 可以被 x86 EXCEL2010使用; 但是  x64 EXCEL 2010 卻不能用 ,錯誤429!! 不知為什麼。 裡面沒有明顯的 Declare 及 Long 的東東, 2008應是 x64版本。
爬文中發現有人主張用 2008做 Automation 來驅動 EXCEL;這個本末易位不是想要的東東

TOP

真的不枉我来注册这个坛子。
Learning Office!

TOP

回復 5# HUNGCHILIN

有請 大師
    在不同的電腦使用VB6.0 做 Dll,發現 AddInDesigner 的視窗內: 應用程式(A),應用程式版本(V)  可以做選擇
而之前在另一電腦卻不能 !!! 是註冊表的問題還是 ???

謝謝先

TOP

        靜思自在 : 心中常存善解、包容、感思、知足、惜福。
返回列表 上一主題