2016-07-27 35 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的回答外,'評估'功能是使代碼起作用的最後一部分。非常感激 –