Funzione evaluate in vba



  • Funzione evaluate in vba
    di Paolopaolo (utente non iscritto) data: 13/05/2009

    Ciao a tutti, chiedo un vostro aiuto, il mio problema è il seguente:
    devo calcolare una formula con evaluate dove comprende il fattoriale di un numero, esempio:
    b = "factorial(1^(3/factorial(4)))/71*3"
    a = evaluate(b)
    c = errr
    il valore di c deve essere 1 quando viene calcolato un fattoriale di un numero non intero, esempio "factorial(1/.2)" = 5! = 120 (errr = 0)
    esempio "factorial(2/ 3)" = 0.6 ! (errr = 1)

    spero di essere stato chiaro, grazie
     
    Public Function Factt(a As Variant) As Double
    Dim g As Long, h As Double
    If Int(Evaluate(a))=Evaluate(a) then 
     h = 1: For g = 1 To a: h = h * g: Next g
     Factt = h:Errr=0
    Else
     Errr=1
    End Function
    
    Sub Prova()
    On Error Resume Next
     Dim a As Variant, b As Variant, c As Byte
     b = "Factt(4.1) 1": a = Evaluate(b): c = Errr
    End Sub



  • di Paolo (utente non iscritto) data: 14/05/2009

    Chi mi aiuta a risolvere questo problema?
    aiutatemi perfavore....



  • di Albatros (utente non iscritto) data: 14/05/2009

    Secondo il mio parere il codice tuo non funziona perche la funzione passa solo un parametro ,mentre il valore errr che tu ti aspetti dovrebbe passare non lo passa .ho modificato il tuo codice e mi sembra che funzioni .
    provalo e fammi sapere
    ciao
    albatros
     
    Public Function Factt(a As Variant) As Double
    Dim g As Long, h As Double
    If Int(Evaluate(a)) Then
     h = 1: For g = 1 To a: h = h * g: Next g
     Factt = h
     End If
    End Function
    
    Sub Prova()
    On Error Resume Next
     Dim a As Variant, b As Variant, c As Byte
     b = Factt(1 / 0.2):
     If Int(b) Then
     errr = 0
     Else
     errr = 1
     End If
    End Sub



  • di Paolo (utente non iscritto) data: 14/05/2009

    Grazie mille, l'ho modificato in questo modo e funziona: grazie a presto

     
    Public Function Factt(a As Variant) As Double
    
    Dim g As Long, h As Double
    If Int(Evaluate(a)) And Errr = 0 Then
     Errr = 0: h = 1
     For g = 1 To a: h = h * g: Next g
     Factt = h
    Else
     Errr = 1
    End If
    End Function
    
    Sub Prova()
    On Error Resume Next
     Dim a As Variant, b As Variant, c As Byte
     b = Factt(Factt(1.2) / 0.25)
     c = Errr
    End Sub
    


  • Pensavo di aver risolo il problema, invece no...
    di Paolo (utente non iscritto) data: 14/05/2009

    Chiedo scusa, mi sono illuso solo per poco, mi sono reso conto che non funziona, in che senso... ti spiego....

    a = "factt(3.2)/2^3.2*factt(3)"

    se racchiudo la formula tra virgolette "" non funziona, come posso fare?. ho la necessità che il programma entri nella funzione factt.



  • di Paolo (utente non iscritto) data: 14/05/2009

    La variabile "a" e la risultante di altre variabili concatenate, quindi è necessariamente racchiusa tra virgolette, ecco perchè sotto utilizzo la funzione "evaluate".
    come posso far accettare da evaluate una stringa di testo, con all'interno una funzione creata da me in questo caso factt?
     
    Public Errr as Byte
    
    Public Function Factt(a As Variant) As Double
    Dim g As Long, h As Double
    If Int(Evaluate(a)) And Errr = 0 Then
     Errr = 0: h = 1
     For g = 1 To a: h = h * g: Next g: Factt = h
    Else
     Errr = 1
    End If
    End Function
    
    Sub Prova()
     Dim a As Variant, b As Variant, c As Byte
     a = "Factt(Factt(1.2) / 0.25)"
     b = Evaluate(a)
     c = Errr
    End Sub


  • Chi mi aiuta?
    di Paolo (utente non iscritto) data: 15/05/2009

    Chi mi risolve quetso problema, nessuno mi risponde?



  • di Albatros (utente non iscritto) data: 15/05/2009

    Scusa, potresti specificare la priorità delle operazioni nella formula
    a = "factt(3.2)/2^3.2*factt(3)" da come è scritta sembra che la priorità è data alla potenza , poi alla divisione ...poi
    fai sapere
    ciao
    albatros


  • Errore 2029
    di Paolo (utente non iscritto) data: 15/05/2009

    La formula scritta era a titolo esemplificativo:
    la variabile "d" e la risultante di altre stringhe concatenate tra loro, questo è solo un esempio. la mia necessità è quella di dover calcolare con la funzione "evaluate" la stringa della variabile "d" che a sua volta contiene all'interno una nuova funzione, in questo caso "funz". ho semplificato il più possibile la funzione e il codice, per poter individuare l'errore, ma non funziona. forse è una "pecca" del vb e del vba.
    comunque grazie per l'interessameno...

     
    Public Errr As Byte
    
    Public Function Funz(a As String) As Double
     Funz = a + a
     If a > 700 Then Errr = 1 Else Errr = 0
     End Function
    
    Sub Prova()
     Dim d As String, e As Double, f As Byte
     d = "Funz((3^Funz(2+1))+2)+23"
     e = Application.Evaluate(d):f = Errr
    End Sub