请教Dll的做法

luojie1 2004-05-06 07:47:52
一个Microsoft Excel工作表:AAA.XLS
宏中有:UserForm1、UserForm2窗体、模块1等

现在我想用VB将AAA.XLS中的代码做成DLL:
1、我将thisworkbook中的代码复制到VB的类模块Class1中,在生成工程1。DLL时,因为代码中有UserForm2.show,所以出现了UserForm2变量未定义的错误。要怎么解决呀?
...全文
252 15 点赞 打赏 收藏 举报
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
junglerover 2004-05-14
不是吧,哥们你能不能稍微举一反三一点呢?

1。在你的类模块头上,加上
Option Explicit

有助于你理解,使用变量前,必须有它的来源的概念;

2。你的方法里,WorkSheets/Cells/Rows/Selection这些对象是从哪里来?原来在EXCEL里面,他们都是全局的默认对象,那么现在你从哪里才能获得这些呢?再想一下!希望你能自己琢磨明白,真正理解对象的概念。
  • 打赏
  • 举报
回复
luojie1 2004-05-13
AAA.XLS的模块1的代码:
Sub 隐藏空行()
dim obj as Object
set obj=createobject("MyDll.MyObj")
set obj.application=application '把APPLICATION对象传进DLL里
call obj.HideRows '把原来直接写在宏里的代码写到这个方法里面
End Sub

我在MYDLL的类MYOBJ里的代码:
public application as object '定义的APPLICATION对象
public sub HideRows()
' 原来宏里隐藏空行的代码:
Dim i As Integer
Dim r As Integer
Worksheets("汇总表").Select
i = 3
Do Until Cells(i, 2) = "合计"
i = i + 1
If Cells(i, 4) = 0 Then
Rows(i).Select
Selection.EntireRow.Hidden = True
End If
If Cells(i, 2) = "合计" Then
Rows(i).Select
Selection.EntireRow.Hidden = False
End If
Loop
end sub

在执行时出现了错误,提示是:运行时错误1004,方法作用于对象失败。
是哪里做错了?
现在有谁在呀,帮我看看呀。
  • 打赏
  • 举报
回复
luojie1 2004-05-08
我试过了,还是出现一样的错误提示呀。
public sub HideRows()

' 原来宏里隐藏空行的代码
end sub
  • 打赏
  • 举报
回复
junglerover 2004-05-08
DLL里默认方法是私有的,必须改一下

MYDLL的类MYOBJ里,必须改为
public sub HideRows()

' 原来宏里隐藏空行的代码
end sub

  • 打赏
  • 举报
回复
luojie1 2004-05-08
To junglerover(灌木丛):
关于这里:
Sub 隐藏空行()
dim obj as Object
set obj=createobject("MyDll.MyObj")

set obj.application=application '把APPLICATION对象传进DLL里
call obj.HideRows '把原来直接写在宏里的代码写到这个方法里面
End Sub

我在MYDLL的类MYOBJ里这样做:
public application as object '定义的APPLICATION对象
sub HideRows()

' 原来宏里隐藏空行的代码

end sub

在执行时出现了错误,提示是:运行时错误1004,方法作用于对象失败。
我按调试,程序运行到这一行:
Call obj.HideRows '把原来直接写在宏里的代码写到这个方法里面
是什么原因呀?还请不烦指教,多谢!


  • 打赏
  • 举报
回复
luojie1 2004-05-07
To junglerover(灌木丛):
用了你的方法,userform2显示出来了。
我是第一次做DLL。有许多地方都不懂。
希望junglerover(灌木丛)以后多教教我。
多谢!


  • 打赏
  • 举报
回复
luojie1 2004-05-07
请问以下语句在AAA.XLS里是可以执行的,做成DLL又不成了,是什么原因?
'1、
Private Sub CommandButton2_Click()
Unload Me
Application.Quit
ActiveWorkbook.Close savechanges:=False
End Sub
'2、
Application.CommandBars("定额").Visible = True
  • 打赏
  • 举报
回复
junglerover 2004-05-07
???道理还是一样的啊

OFFICE似乎并没有提供在点击自定义按钮时,直接执行一段代码的功能,所以你仍然需要定义这几个宏,来做个接口。

AAA.XLS中模块1的代码:

Sub 查询定额()
dim obj as Object
set obj=createobject("MyDll.MyObj")

set obj.application=application '把APPLICATION对象传进DLL里
call obj.ShowForm1
End Sub

Sub 隐藏空行()
dim obj as Object
set obj=createobject("MyDll.MyObj")

set obj.application=application '把APPLICATION对象传进DLL里
call obj.HideRows '把原来直接写在宏里的代码写到这个方法里面
End Sub

等等等等。而自定义按钮对宏的指定关系,则不必改变。

这样,原来写了实际代码的宏就被虚化了,变成了一个接口。那么你就可以实现,在不更改宏代码的情况下,变更实际执行的操作内容的功能。
  • 打赏
  • 举报
回复
dongge2000 2004-05-07
一楼满厉害的啊!
  • 打赏
  • 举报
回复
luojie1 2004-05-07
多谢 junglerover(灌木丛)的热心帮助!以上问题都解决了。
再请教:
我将AAA.XLS中模块1的代码复制到VB的Class2中,集中生成一个DLL。
----------------------------
AAA.XLS中模块1的代码:

Sub 查询定额()
UserForm1.Show
End Sub

Sub 隐藏空行()
'……
End Sub

Sub 显示全部()
'……
End Sub

Function 公式(Action As String, Key As String, Src As String) As String
Dim Count As Integer, KeyPos As Integer, KeyLen As Integer, SrcAsc As Integer, test As String, offset As Integer, TmpSrcAsc, SrcPos
KeyLen = Len(Key)
'……
End Function
------------------------------

因为我是在AAA.XLS的工具栏里做三个图标,然后指定宏来分别引用:查询定额、隐藏空行、显示全部。做成DLL后,我一样要在AAA.XLS的工具栏里做三个图标分别引用到查询定额、隐藏空行、显示全部,要怎么做呀?
  • 打赏
  • 举报
回复
junglerover 2004-05-07
哥们,你的逻辑真的有点问题哎。

DLL里,当然不像在VBA环境里面,能够直接获得APPLICATION, ACTIVEWORKBOOK等对象。你得把它们传进DLL里才能用啊。

应该改成这样:
AAA.XLS里:
Private Sub Workbook_Open()
dim obj as Object
set obj=createobject("MyDll.MyObj")

set obj.application=application '把APPLICATION对象传进DLL里
call obj.ShowForm2
End Sub

MYDLL的类MYOBJ里:
public application as object '定义的APPLICATION对象

Public sub ShowForm2()
'把APPLICATION和ACTIVEWORKBOOK对象传进FORM里
set userform2.application=application
set userform2.activeworkbook=application.activeworkbook

userform2.show 0
end sub

MYDLL的USERFORM2里:
public application as object
public activeworkbook as object

Private Sub CommandButton2_Click()
Unload Me
Application.Quit
ActiveWorkbook.Close savechanges:=False
End Sub


这样就可以了。
  • 打赏
  • 举报
回复
junglerover 2004-05-06
???你这个事件处理程序是在EXCEL里面才有效的,未必你在DLL里面也还是一样的写法?
它的事件怎么能触发到DLL里呢?

应该改成这样:
AAA.XLS里:
Private Sub Workbook_Open()
dim obj as Object
set obj=createobject("MyDll.MyObj")

call obj.ShowForm2
End Sub

MYDLL的类MYOBJ里:
Public sub ShowForm2()
userform2.show 0
end sub

这样就可以了。
  • 打赏
  • 举报
回复
luojie1 2004-05-06
刚才试了一下,在打开AAA.XLS时,以下的代码可以通过,UserForm2显示出来。
Private Sub Workbook_Open()
UserForm2.Show
End Sub
但是做成DLL后,为什么UserForm2不出来呀?
  • 打赏
  • 举报
回复
luojie1 2004-05-06
多谢 junglerover(灌木丛) ,我先试试。
  • 打赏
  • 举报
回复
junglerover 2004-05-06
你只能照着原来XLS宏里的USERFORM2,再做一个功能一样的VBFORM,添加到你的DLL里了。

要想不改任何代码而实现原来同样的功能,是不可能的。
  • 打赏
  • 举报
回复
相关推荐
发帖
VBA
加入

2112

社区成员

VBA(Visual Basic for Applications)是Visual Basic的一种宏语言,是在其桌面应用程序中执行通用的自动化(OLE)任务的编程语言。
申请成为版主
帖子事件
创建了帖子
2004-05-06 07:47
社区公告
暂无公告