将实体属性分配给变量

时间:2018-02-27 17:26:10

标签: vba

我是VBA或面向对象编程编程的新手。我试图让这段代码在Rockwell Automation的VBA编译器中工作。

我有时会得到Error 424: 'Object required',经过调试后我会在最后提到XL.Quit。有时我会遇到与使用ActiveEntity相关的错误。我不知道我是否错误地将Excel文件用于工作,或者是否已经对访问Arena的实体属性做了些什么。

你能发现错误吗?或者您是否有关于如何自己找到它的建议?

Public Sub ModelLogic_RunBeginSimulation()
    Dim m As Model
    Set m = ThisDocument.Model
    Dim s As SIMAN
    Set s = m.SIMAN
    Dim FileToOpen As String
    Dim ArenaDir As String
    Set XL = GetObject("", "Excel.Application")
    ArenaDir = Mid(m.FullName, 1, Len(m.FullName) - Len(m.Name))
    FileToOpen = ArenaDir & "data.xlsx"
    XL.Workbooks.Open FileToOpen
End Sub

Public Sub VBA_Block_1_Fire()
Dim RNEG_deltaw As Double, Z_deltaw As Double, RPOS_deltaw As Double
Dim R_SI As Double, Z_SI As Double, S_SI As Double
Dim SI As Double, NumContenedor As Integer, Wo As Double, W_1 As Double, deltaW As Double

NumContenedor = s.EntityAttribute(s.ActiveEntity,s.SymbolNumber("NumContenedor"))
SI = XL.Workbooks(1).Worksheets(1).Cells(NumContenedor, 3).value
s.EntityAttribute(s.ActiveEntity, s.SymbolNumber("deltaW")) = SI
End Sub

Public Sub ModelLogic_RunEnd()
    XL.Quit
End Sub

2 个答案:

答案 0 :(得分:1)

XL对象被声明为过程级别,因此不存在于另一个过程的范围内。

如果您希望变量或对象对所有过程可见,请在模块的开头声明它,或许如下:

Public XL as Object

话虽如此,你也没有在其他程序中声明XL。将此行添加到此模块的最顶层(以及每个模块):

Option Explicit

这将迫使您正确声明和处理变量,对象,属性等,并帮助防止此类问题。

还有一件事:我敢打赌你至少运行过几次代码,对吗?

立即保存您的工作,然后重新启动。请相信我。

更多信息:

答案 1 :(得分:0)

假设在模块级别声明XL,我认为错误与此行有关:

Set XL = GetObject("", "Excel.Application")

这需要Excel运行。在ModelLogic_RunEnd()被触发时会出现,尝试调用Excel的.Quit()方法,但XL无效。

尝试将其更改为CreateObject()并查看是否有帮助:

Set XL = CreateObject("Excel.Application")