当前位置:编程学习 > VB >>

调用dll做到对excel文件vba进行处理

原帖连接:http://www.officefans.net/cdb/viewthread.php?tid=230741&highlight=
因为csdn不能上传附件,因此原帖中附有了附件。

因为需要做excel的vba通过加载dll文件进行封装。学习了http://www.officefans.net/cdb/viewthread.php?tid=101939这个帖子的内容后,自己尝试做了一下
我的需求是在一个特定的excel(例如d:\sample.xls)打开后自动调用dll打开dll中封装的窗体,然后点击窗体上的按钮后msgbox sheets("sheet1").cells(1,1).value,非常简单,但是遇到一个问题


在vb中需要建立打开excel对象,用以下类似语句
   Dim ExcelApp As New Excel.Application
   Dim ExcelWorkBook As Excel.Workbook
   Dim ExcelWorksheet As Excel.Worksheet
   Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\sample.xls")  '打开工作簿


但是问题在于这样的话相当于新建一个excel进程,再打开这个d:\sample.xls文件进行后续处理。但是我的需求是不要新建excel进程,也不需要再次打开d:\sample.xls这个问题件,而是直接就在当前的excel文件,即d:\sample.xls这个文件中进行操作。这样的话,不太清楚应该怎么样写代码,从而把当前的excel文件装载入dll中的ExcelApp对象中去,从而进行后续处理。


 test.zip (20.98 KB) 附件说明:report.dll是改程序编译出来的,然后打开sample.xls就调用了该dll文件,从而打开了form窗体,然后点击窗体上按钮,启动dll中封装的程序。
有一点要注意:sample中的引用report.dll文件,因为每个人放置的绝对路径不同,因此可能需要自己重新引用一次即可。


特此求助大虾!多谢!! dll vba excel --------------------编程问答-------------------- Dim ExcelApp As New Excel.Application
Dim ExcelWorkBook As Excel.Workbook
Dim ExcelWorksheet As Excel.Worksheet
If ExcelApp.Workbooks.Count > 0 Then
  Set ExcelWorkBook = ExcelApp.ActiveWorkbook  '如果当前有工作本,就对当前工作本进行操作
Else
  Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\sample.xls") '如果当前无工作本,就打开工作本
End If --------------------编程问答-------------------- 你那样打开,不是会造成一种“死循环”么?
(幸好Excel会询问是否重新打开,要不然真成死循环了。)

你可以试下这样:
'Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\sample.xls")  '打开工作簿
 Set ExcelWorkBook = ExcelApp.ThisWorkbook


要传附件,你可以先把附件上传到这个地方:
http://access911.net/csdn
然后把你的附件所在的链接地址贴出来。
象你在主贴中说的那个“原贴连接”,别人未必就能下载(必须要有那个论坛的帐号,登录后才能下载)。
--------------------编程问答-------------------- 请问vba中吧excel中一个sheet中的2000条数据,向oracle批量insert数据有什么好的方式么? 循环太慢了感觉。大家有什么好的办法么?谢谢。。 --------------------编程问答-------------------- 打开VB,创建一个外接程序工程:
设计器代码:

Public WithEvents XlApp As Excel.Application

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
    Set XlApp = Application
End Sub

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    Set XlApp = Nothing
End Sub

Private Sub XlApp_WorkbookOpen(ByVal Wb As Excel.Workbook)
    If LCase(Wb.FullName) = "d:\sample.xls" Then
        Set My_Wb = Wb
        frmAddIn.Show 0
    End If
End Sub

窗体添加一个按钮,命名: Command1 .
窗体代码:

Private Sub Command1_Click()
    MsgBox My_Wb.sheets("sheet1").cells(1, 1).Value
End Sub

模块代码:


Public My_Wb As Excel.Workbook



如下图示:


--------------------编程问答--------------------
引用 4 楼 crazy0qwer 的回复:
打开VB,创建一个外接程序工程:
设计器代码:

Public WithEvents XlApp As Excel.Application

Private Sub AddinInstance_OnConnection(ByVal Application As Object, ByVal ConnectMode As AddInDesignerObjects.ext_ConnectMode, ByVal AddInInst As Object, custom() As Variant)
    Set XlApp = Application
End Sub

Private Sub AddinInstance_OnDisconnection(ByVal RemoveMode As AddInDesignerObjects.ext_DisconnectMode, custom() As Variant)
    Set XlApp = Nothing
End Sub

Private Sub XlApp_WorkbookOpen(ByVal Wb As Excel.Workbook)
    If LCase(Wb.FullName) = "d:\sample.xls" Then
        Set My_Wb = Wb
        frmAddIn.Show 0
    End If
End Sub

窗体添加一个按钮,命名: Command1 .
窗体代码:

Private Sub Command1_Click()
    MsgBox My_Wb.sheets("sheet1").cells(1, 1).Value
End Sub

模块代码:


Public My_Wb As Excel.Workbook



如下图示:


你好,不好意思现在才来看当时这篇帖子,中间很长时间在忙其他东西。
很感谢你的详尽回复,我按照你说的测试,在生成MyAddIn.dll过程中,在模块的Public My_Wb As Excel.Workbook这句上报错:“编译错误:用户定义类型未定义” 

不知道是什么问题呢?不胜感谢! --------------------编程问答--------------------
引用 2 楼 Chen8013 的回复:
你那样打开,不是会造成一种“死循环”么?
(幸好Excel会询问是否重新打开,要不然真成死循环了。)

你可以试下这样:
'Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\sample.xls")  '打开工作簿
 Set ExcelWorkBook = ExcelApp.ThisWorkbook


要传附件,你可以先把附件上传到这个地方:
http://access911.net/csdn
然后把你的附件所在的链接地址贴出来。
象你在主贴中说的那个“原贴连接”,别人未必就能下载(必须要有那个论坛的帐号,登录后才能下载)。


十分感谢你的提醒,这个上传链接十分有用!
我按照你说的,但是在Set ExcelWorkBook = ExcelApp.ThisWorkbook这句上报错说错误1004,对象thisworkbook的方法_Application失败。

谢谢! --------------------编程问答--------------------
引用 5 楼 swjia8315 的回复:
你好,不好意思现在才来看当时这篇帖子,中间很长时间在忙其他东西。
很感谢你的详尽回复,我按照你说的测试,在生成MyAddIn.dll过程中,在模块的Public My_Wb As Excel.Workbook这句上报错:“编译错误:用户定义类型未定义” 

不知道是什么问题呢?不胜感谢!

你在工程中引用“Microsoft Office XX.0 Object Library”再编译试下。
--------------------编程问答-------------------- 你用的是ActiveX DLL吧!

如果是这样,你在那个DLL的源代码中,增加一个接口函数,用来接收工作簿对象的引用。
这个函数的参数,就是一个工作簿对象。接收这个参数,把引用保存到一个模块级的私有变量中。
(或者就把这个变量定义为公有的,创建对象后,直接把引用赋值给它)
然后你的DLL中,其它地方就能通过这个对象引用来操作工作簿了。
比如,你的那个窗口中要读取sheets("sheet1").cells(1,1).value

记得要在 Class_Terminate() 中,释放其引用:
Set XXXX = Nothing

--------------------编程问答--------------------
引用 7 楼 Chen8013 的回复:
Quote: 引用 5 楼 swjia8315 的回复:

你好,不好意思现在才来看当时这篇帖子,中间很长时间在忙其他东西。
很感谢你的详尽回复,我按照你说的测试,在生成MyAddIn.dll过程中,在模块的Public My_Wb As Excel.Workbook这句上报错:“编译错误:用户定义类型未定义” 

不知道是什么问题呢?不胜感谢!

你在工程中引用“Microsoft Office XX.0 Object Library”再编译试下。


哦,这个我已经引用过了。 --------------------编程问答--------------------
引用 2 楼 Chen8013 的回复:
你那样打开,不是会造成一种“死循环”么?
(幸好Excel会询问是否重新打开,要不然真成死循环了。)

你可以试下这样:
'Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\sample.xls")  '打开工作簿
 Set ExcelWorkBook = ExcelApp.ThisWorkbook


要传附件,你可以先把附件上传到这个地方:
http://access911.net/csdn
然后把你的附件所在的链接地址贴出来。
象你在主贴中说的那个“原贴连接”,别人未必就能下载(必须要有那个论坛的帐号,登录后才能下载)。


你好,附件已经上传到http://access911.net/csdn/FileDescription.asp?mdb=2013-10-21&id=32了,谢谢 --------------------编程问答--------------------
引用 7 楼 Chen8013 的回复:
Quote: 引用 5 楼 swjia8315 的回复:

你好,不好意思现在才来看当时这篇帖子,中间很长时间在忙其他东西。
很感谢你的详尽回复,我按照你说的测试,在生成MyAddIn.dll过程中,在模块的Public My_Wb As Excel.Workbook这句上报错:“编译错误:用户定义类型未定义” 

不知道是什么问题呢?不胜感谢!

你在工程中引用“Microsoft Office XX.0 Object Library”再编译试下。


哦我删掉后重新设定一下,果然这个地方就没编译错误了
现在是在设计器的“Dim mcbMenuCommandBar         As Office.CommandBarControl”
这句话报错说“用户定义类型未定义”,不知道什么原因。 --------------------编程问答-------------------- Class1 的代码:
Private objWorkBook  As Excel.WorkBook

Sub Form_open() '
   w_main.Show 0
End Sub

Public Property Get WorkBook() As Excel.WorkBook
   Set WorkBook = objWorkBook
End Property

Public Property Let WorkBook(ByVal vNewValue As Excel.WorkBook)
   Set objWorkBook = vNewValue
   Set w_main.ExcelWorkBook = vNewValue    '在这儿把对象引用传递到窗体中去
End Property

Private Sub Class_Initialize()
   Set objWorkBook = Nothing
End Sub

w_main 的代码:
' 增加这个
Public ExcelWorkBook As Excel.WorkBook


Sub Command1_Click()


Dim ExcelApp As New Excel.Application
Dim ExcelWorkBook As Excel.WorkBook
Dim ExcelWorksheet As Excel.Worksheet
Set ExcelWorkBook = ExcelApp.Workbooks.Open("C:\Documents and Settings\shi23410\Desktop\test\sample.xls")  '打开工作簿
Set ExcelWorkBook = ExcelApp.ThisWorkbook

'ExcelWorkBook.Sheets("sheet1").Cells(1, 1).Value = "abc"
MsgBox ExcelWorkBook.Sheets("sheet1").Cells(1, 1).Value

End Sub


Private Sub Command2_Click()
   'Dim ExcelApp As New Excel.Application
   Dim ExcelWorksheet As Excel.Worksheet
   ' 这几个我注释掉的,可以不用了。
' Command1_Click() 我没改你的,其它地方要用,可以参考这儿。
' “Excel.Application”对象,你在这个窗体中,不用再去创建了。
' 如果要用,用这个引用就行:   ExcelWorkBook.Application
   'Set ExcelApp = CreateObject("Excel.Application")
   'Set ExcelWorkBook = ExcelApp.Workbooks.Open("d:\temp.xls")
   'Set ExcelWorkBook = ExcelApp.ThisWorkbook
   Set ObjWorkSheet = ExcelWorkBook.Sheets("sheet1")
   ExcelWorkBook.Sheets("sheet1").Cells(1, 1).Value = "abc"
   MsgBox ExcelWorkBook.Sheets("sheet1").Cells(1, 1).Value
End Sub

Private Sub Form_Unload(Cancel As Integer)
   Set ExcelWorkBook = Nothing
End Sub


Excel 工作簿的代码:
Private Sub Workbook_Open()

  Shell "Regsvr32 /s " & VBA.Chr(34) & ThisWorkbook.Path & "\report.dll" & VBA.Chr(34), vbHide
  
  Dim kk As New Class1
  kk.Workbook = ThisWorkbook    '注意这句!先把对象引用传递过去!
  Call kk.Form_open
  
End Sub
补充:VB ,  VBA
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,