2013-02-27 80 views
0

假设我有调用自定义的库文件(.dll); Library.dllVBA7编译错误Excel中的Windows 7

中的库,有一个叫做类; 类

我生成一个名为TestObject的对象:

Dim testObject As New Library.Class 

有一个功能叫做testFunction:

Function testFunction(var1 As Double, var2 As Double, var3 As Double, var4 As Double, _ 
var5 As Double, var6 As Integer, var7 As Double, var8 As Double, var9 As Double) 
    Call testSetup(var1, var2, var3, var4, var6, var7, var8, var9) 
    testFunction = testObject.Field(var5) 
End Function 

这个函数调用testSetup:

Sub testSetup(var1 As Double, var2 As Double, var3 As Double, var4 As Double, _ 
var5 As Double, var6 As Integer, var7 As Double, var8 As Double, var9 As Double) 
    testObject.Lat1 = var1 
    testObject.Lon1 = var2 
    testObject.Lat2 = var3 
    testObject.Lon2 = var4 
    testObject.mth = var6 
    testObject.GMT = var7 
    testObject.ssn = var8 
    testObject.icf = var9 
End Sub 

我的问题是在跑步时,如果我在该位置放置一个断点

testObject.Lat1 = var1 

在运行和步进到下一行,如果我悬停在对象

testObject.Lat1 

我看到错误

对象变量或带块变量未设置

没有崩溃,没有明确的错误消息导致失败。

任何人有任何想法?

我不知道,如果误差在库或代码中?

而且它是从Excel中键入到单元格 = testFunction运行(VAR1,VAR2,VAR3 ....)

编辑:在评论更多信息

+0

什么是testObject的范围? – 2013-02-27 18:55:24

+0

你是什么意思的范围? Thx – user2111939 2013-02-27 20:01:27

+0

请将testObject声明为模拟级别或公共级别。 – 2013-02-28 08:34:26

回答

0

OK,解决方案已被发现。这不是由于代码错误,

Dim testObject As New Library.Class 

工作正常。

一样其次

Set testObject = New Library.Class 

是,在VB中,我注册库dll文件通过

Tools > References 

我认为这将是不够的问题

Dim testObject As Library.Class 

我没有管理员权限。

我错了。

我需要以管理员身份登录和注册thern使用

regsvr32 ".dll path" 

现在我看到在电子表格中感觉输出的DLL。

2

在VBA中,你可以启动通过两种方法对象:

  1. Dim o as New Object
  2. Dim o as Object: Set o = New Object

不同的是,在一个版本的对象发起第一次是在代码访问! (注意:这与VB.NET不同)。在第二种情况下,它被明确地开始当你运行Set o = New Object

因此,当你在该行testObject.Lat1 = var1设置断点,TestObject的实际上是尚未分配,因此,调试器不能访问任何东西!只有在执行完这行后才能看到结果。

如果这困扰你,你只需要添加

Set testObject = new Library.Class 
+0

如果我将断点放置在“调用testSetup”位置,那么当我进入Sub并进入'testObject.lat1 = var1'时,我会看到同样的情况。这是否适合您的解决方案? – user2111939 2013-02-27 20:06:18

+0

此外,我在Excel 2010中使用VBA7,如果这改变了什么 – user2111939 2013-02-27 20:08:33

+0

是的 - 只有在第一次访问testObject之后(这是testSetup中的某处,它将在调试器中可见)(除非使用'Set。 .. = New ...'如上所述)。这也适用于VBA7! – 2013-02-27 20:10:55