【问题标题】:Learning VBA - BODMAS Generator学习 VBA - BODMAS 生成器
【发布时间】:2016-07-27 15:14:53
【问题描述】:

我正在使用在线教程自学 VBA。使用我目前所学的知识,我制作了一个简单的BODMAS 问题生成器。但是我不知道如何计算生成的问题的答案。这是我所做的:

Dim Indicator As String, Equation As String, IndicatorNum As Integer, RandNum As Integer, Answer As Integer

Type EqnStatements
   Statement1 As Integer
   Statement2 As Integer
   Statement3 As Integer
End Type

Type Indicators
   Indicator1 As String
   Indicator2 As String
End Type

Private Sub IndicatorGenerator()
    IndicatorNum = Int(Rnd * 4)
    Select Case IndicatorNum
    Case Is = 0
        Indicator = "+"
    Case Is = 1
        Indicator = "-"
    Case Is = 2
        Indicator = "*"
    Case Is = 3
        Indicator = "/"
End Select
End Sub

Private Sub StatementGenerator()
RandNum = Int(Rnd * 10 + 1)
End Sub

Sub EquationGenerate()
Dim Eqn As EqnStatements, Ind As Indicators

    StatementGenerator
        Eqn.Statement1 = RandNum
    StatementGenerator
        Eqn.Statement2 = RandNum
    StatementGenerator
        Eqn.Statement3 = RandNum

    IndicatorGenerator
        Ind.Indicator1 = Indicator
    IndicatorGenerator
        Ind.Indicator2 = Indicator

    Equation = Eqn.Statement1 & " " & Ind.Indicator1 & " " & Eqn.Statement2 & " " & Ind.Indicator2 & " " & Eqn.Statement3

    Cells(2, 3) = Equation
    End Sub


Sub AnswerShow()

  Answer = Eqn.Statement1 & Ind.Indicator1 & Eqn.Statement2 & Ind.Indicator2 & Eqn.Statement3
  Cells(3, 3) = Answer

End Sub

第一个主 Sub 工作正常,并产生输出。当我运行第二个主子 (AnswerShow) 时,出现错误:“需要对象”。我不知道如何让它使用存储在变量中的值来计算方程。

【问题讨论】:

标签: vba


【解决方案1】:

您遇到“需要对象”错误的原因是您尝试在AnswerShow 过程中使用变量Eqn,但该变量不存在。

您在EquationGenerate 过程中为对象变量Eqn 的属性赋值,但是一旦该过程完成运行,该对象就会从内存中丢失。

您必须将Eqn 对象变量传递到AnswerShow 过程才能访问属性。

我还建议使用函数来生成数字,而不是使用公共变量的过程。请参阅下面的代码。

Private Function Indicator() As String

    Dim indicator_num As Integer

    indicator_num = Int(Rnd * 4)
    Select Case indicator_num
        Case 0
            Indicator = "+"
        Case 1
            Indicator = "-"
        Case 2
            Indicator = "*"
        Case 3
            Indicator = "/"
    End Select

End Function

Private Function RandNum() As Integer

    RandNum = Int(Rnd * 10 + 1)

End Function

Sub EquationGenerate()

    Dim Eqn As EqnStatements, Ind As Indicators

    Eqn.Statement1 = RandNum
    Eqn.Statement2 = RandNum
    Eqn.Statement3 = RandNum

    Ind.Indicator1 = Indicator
    Ind.Indicator2 = Indicator

    Equation = Eqn.Statement1 & " " & Ind.Indicator1 & " " & Eqn.Statement2 & " " & Ind.Indicator2 & " " & Eqn.Statement3

    Cells(2, 3) = Equation

    AnswerShow Eqn, Ind

End Sub


Sub AnswerShow(ByRef Eqn As EqnStatements, ByRef Ind As Indicators)

    Answer = Eqn.Statement1 & Ind.Indicator1 & Eqn.Statement2 & Ind.Indicator2 & Eqn.Statement3
    Cells(3, 3) = Answer

End Sub

【讨论】:

    【解决方案2】:

    您将字符“*”、“/”、“+”和“-”存储在称为“指示器”的内存位置中。但是,这并不能使它们发挥指标的作用。

    理论上,您需要编写解释每个字符的代码,然后命令进行适当的计算:

    `If Ind = "*" then Ans = x * y
    

    在您的情况下,需要进行相当多的额外编码才能使序列正确。

    碰巧 VBA 有一个评估函数 (https://msdn.microsoft.com/en-us/library/office/ff193019.aspx),它将评估一个字符串公式。所以你可以把你的 AnswerShow 行改为

    Answer = Evaluate(Eqn.Statement1 & Ind.Indicator1 & Eqn.Statement2 & Ind.Indicator2 & Eqn.Statement3)
    

    【讨论】:

    • 我的代表不够高,无法公开将您的答案标记为有用,所以我会发表评论。除了 luke_t 的回答之外,“评估”功能是使代码正常工作的最后一部分。非常感谢