【问题标题】:VBA Function Evaluating Internal Properties FirstVBA 函数首先评估内部属性
【发布时间】:2019-08-10 05:59:23
【问题描述】:

我来自 C# 背景,我正在尝试将一些 C# 代码移植到 VBA 以在 excel 文件中使用。

我有一个函数,它接受一个类型(许多属性)并且应该对它做一些工作。这是代码的sn-p:

Public Function CalculateThrust(ByVal PumpParams As PumpParameters) As AxialThrustValues
    Dim statVars As StaticVariables
    Set statVars = New StaticVariables
    statVars.Init (PumpParams)

    'empty return obj provision
    Dim ret As AxialThrustValues
    Set ret = New AxialThrustValues

    If PumpParams.NumberOfStages > 3 Then
        ret.AxialThrust = -1 * statVars.FAES

我的问题是,当我调试时,它会直接跳到最后一个变量“FAES”并说:

“编译错误:找不到方法或数据成员”

也许我在 VBA 语言中遗漏了一些东西,但我的过程是函数应该这样评估:

  1. 以“PumpParams”参数输入
  2. 使用“PumpParams”实例化 statVars 对象
  3. 能够访问 statVars.FAES,因为对象已被实例化...

非常感谢任何能帮助我克服这个障碍的想法,谢谢。

StaticVariables 类的片段:

Private InputParameters As PumpParameters

    Public Sub Init(InputParameters As PumpParameters)
    InputParameters = PumpParameters
    setPropsInitial
    setConditionals
    End Sub

    Public GAM, VISCOS, OMEGA, U2S, U2N, FMS, FMN, CAES, CAHS, CAEN, CAHN, P1S, PST, FAES, FAHS, FAEN, FAHN, FATB, FAIB, PCB, FACB, FAHDCB, FAHSCB, PHDE, PHSE As Double

    Private Sub setPropsInitial()
        FAES = CalcForcesAtImpEye(InputParameters.SuctionImpDia, InputParameters.SuctionStageEyeRingDia, P1S, GAM, U2S, CAES, FMS)...

调试器图片:

【问题讨论】:

  • 我不确定 它直接跳转到最后一个变量“FAES” 是什么意思。它是否特别突出了ret.AxialThrust = -1 * statVars.FAES 行?您确定它不在必须remove the parenthesesstatVars.Init (PumpParams) 行上吗?你有Option Explicit 吗?如果将光标放在StaticVariables 并按 Shift+F2,它会带你去哪里?
  • 是的,它会突出显示 FAES 并显示错误。我添加了“选项显式”(以前没有),但是出现了相同的错误消息。 Shift+F2 将我带到“Dim statVars...”行
  • 在静态变量之上添加 Oprion Explicit。那些公共变量需要在类的顶部(在第一个方法之前)而不是在一个方法中?
  • 是的,当然。模块级变量必须在任何方法之前声明。将Public GAM, VISCOS, OMEGA, ... 行移动到Sub Init 或模块中的任何其他子之前。 (缺少的引用将在其前面用大写 MISSING: 表示;即使有一个,它也可能会破坏在完全不相关的程序集中对现有成员的查找,因此您需要始终检查这一点。)
  • 请注意您的Public GAM, VISCOS, OMEGA, ...。除了最后一个之外,所有这些都声明为Variant

标签: excel vba


【解决方案1】:

同时出现两个错误会使我们的生活变得艰难。

首先你在错误的地方声明了类的公共变量(C# 风格?),然后你使用了一个不被智能感知显示的类成员(这意味着没有成员,除了它是后期绑定的)。

下次你应该使用对象浏览器F2来查看类成员。

看看RubberduckVBA 会发现什么,我立刻打赌并阅读https://rubberduckvba.wordpress.com/2019/07/08/about-class-modules/ 和那里的其他帖子,看看如何在 VBA 中编写代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-20
    • 2017-04-06
    • 1970-01-01
    相关资源
    最近更新 更多