如何通过Excel VBA Automation在HYSYS中指定列的内部?

时间:2019-01-07 09:36:28

标签: excel vba automation aspen

我已经在Aspen HYSYS V9中构建了一个模拟模板,并希望使用VBA Automation将Excel内部的列内部数据(例如内部类型,托盘/填充类型和末级数据)传输到HYSYS。 我没有在对象浏览器中找到内部构件,因此我尝试使用后门变量访问内部构件。 为了找出这个绰号,我录制了一个脚本,在其中打开了列的“内部”页面,并将类型从托盘式更改为包装式,然后又更改为托盘式。 该脚本显示以下内容:

Message "FlowSht.1/UnitOpObject.400(Regenerator)" "view"
Message "FlowSht.1/UnitOpObject.400(Regenerator)/FlowSht.600" "MakeMeActiveColumnOp"
SpecWhileSolving Specify "FlowSht.1/UnitOpObject.400(Regenerator)" ":Enum.590.0"  0.000000000000e+000 
SpecWhileSolving Specify "FlowSht.1/UnitOpObject.400(Regenerator)" ":Enum.590.0"  0.000000000000e+000
SpecWhileSolving Message "FlowSht.1/UnitOpObject.400(Regenerator)/FlowSht.600" "MakeMeActiveColumnOp"
Specify "FlowSht.1/UnitOpObject.400(Regenerator)" ":PageNumber.0"  1.000000000000e+001
SpecWhileSolving Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Index.709"  0.000000000000e+000
Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Index.709"  0.000000000000e+000
SpecWhileSolving Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Selection.711.0"  1.000000000000e+000
Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Index.709"  0.000000000000e+000
Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Index.709"  0.000000000000e+000
SpecWhileSolving Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Selection.711.0"  0.000000000000e+000
Specify "Utility.300(Internals-1@Main Tower@COL4)" ":Index.709"  0.000000000000e+000

然后我编写了以下vba代码:

Dim hyfs As Flowsheet
Dim hyfsBD As BackDoor
Dim hyBDVar As RealVariable

Set hyfs = hycase.Flowsheet
Set hyfsBD = hyfs

Set hyBDVar = hyfsBD.BackDoorVariable("Utility.300(Internals-1@Main Tower@COL1)" & ":Selection.711.0").Variable

hyBDVar.SetValue 1, ""

但是hyBDVar的返回值为-32767,我收到一条错误消息:“对象“ InternalRealVariable”的方法“ Set Value”失败。”

1 个答案:

答案 0 :(得分:0)

所以我自己找到了一种解决方案,但这提出了另一个问题。 可以通过访问列的子流程来指定列的内部。我使用与上述相同的方法找出了绰号,脚本显示了以下内容:

Message "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)" "CloseViewX"
Message "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)" "view"
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)" ":Enum.591.1"  0.000000000000e+000
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)" ":Enum.591.1"  0.000000000000e+000
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)/TrayStageData.550" ":Selection.201"  0.000000000000e+000
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)/TrayStageData.550" ":Selection.201"  1.000000000000e+000
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)/TrayStageData.550" ":Selection.201"  3.000000000000e+000
Specify "FlowSht.1/UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)/TrayStageData.550" ":Selection.201"  2.000000000000e+000

值0、1、3和2代表内部色谱柱类型筛,阀,气泡帽和填充柱。

以下代码适用于该规范:

Dim hyfs As Flowsheet
Dim hyfsBD As BackDoor
Dim hyBDVar As RealVariable

Set hyfs = hycase.Flowsheet
Set hyfsBD = hyfs

Set hyBDVar = hyfsBD.BackDoorVariable("UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower)/TrayStageData.550:Selection.201").Variable

hyBDVar.SetValue 1, ""

在这种情况下,该列被指定为阀列。

选择填充柱类型时,可以使用以下后门变量选择填充材料:

hyBDVar = hyfsBD.BackDoorVariable("UnitOpObject.400(Absorber)/FlowSht.600/UnitOpObject.400(Main Tower):ExtraData.523.0).Variable

可以通过记录脚本并在子流程表中更改规格来找到内部规格的其他绰号。

剩下的问题是如何访问水力图,如何制定这些图的规范以及为什么问题中提到的后门变量对此不起作用。但我会为此发布一个新问题。