2016-07-27 71 views
0

我在教自己的VBA使用在线教程。使用我迄今为止学到的知识,我做了一个简单的BODMAS问题生成器。但是我无法弄清楚如何计算生成的问题的答案。以下是我所做的:学习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)时,出现错误:“需要对象”。我不确定如何使用存储在变量中的值来计算公式。

+0

看一看这个,找出你如何使用一个新的定义它的另一个'Sub'对象。 http://stackoverflow.com/questions/22980061/excel-vba-object-sub-call-with-2-object-parameters-gives-compile-error-expected –

+0

现在你只能在'EquationGenerate()中定义它们' 。为了学习如何全局定义对象,看看这个:http://stackoverflow.com/questions/21380724/best-practice-for-creating-a-public-object-in-excel-vba –

回答

0

您面对'需要对象'错误的原因是您正在尝试使用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 
0

您在称为`Indicator'的内存位置存储字符'*','/','+'和' - '。但是这并不能使它们发挥指标的作用。

理论上你就需要编写代码的解释每个这些字符,然后吩咐适当的计算:

`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) 
+0

我的代表是'高到足以公开将您的答案标记为有用,所以我会发表评论。除了luke_t的回答外,'评估'功能是使代码起作用的最后一部分。非常感激 –