Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Visualizzazione dei risultati da 1 a 4 su 4

Risultato diverso tra sub e risultato cella

  1. #1
    schwarz89it non è in linea Novello
    Buongiorno a tutti, ho scritto una function che di seguito vi riporterò, come sempre per controllare che faccia i passaggi in modo corretto sono solito scrivere una sub. Tuttavia quando uso la funzione direttamente sul foglio i risultati sono differenti (e sbagliati).

    Sub prova()
    
    Dim ved As Variant
    
    
    ved = Aeff(Range("J19"), Range("L19"), Range("N19"), Range("R19"), 15, Range("AP23"), Range("AD23"), Range("F1"), Range("T19"), Range("V19"), 4, Range("AM23"), Range("U19"))
    
    End Sub
    
    La function in questione invece è:

    Function Aeff(n As Double, Asl_eff As Double, t As Double, b_int_piast As Double, tw_irrig As Double, _
    ksigma As Double, PSI As Double, acciaio As Variant, Jirr As Double, yg As Double, ind As Integer, _
    sigmaCRP As Double, Jyy As Double) As Variant
    
    Dim Ris() As Variant
    ReDim Ris(6) As Variant
    
    If ksigma = 4 Then
    
    ' calcoli che non interferiscono con il mio problema e che ometto per comodità
    
    Ris(0) = somma + Airr
    Ris(1) = rholoc
    Ris(2) = betaAc
    Ris(3) = Jsl1_eff
    Ris(4) = ygtot
    Ris(5) = J1
    Ris(6) = J2
    Aeff = Ris(ind)
    
    Else
    
    n = 3
    Airr = n * Asl_eff
    lung = (b_int_piast) / (n + 1)
    
    bc = Abs(b_int_piast / (1 - PSI))
    bsl1 = bc - lung
    sigmaSL = sigmaCRP * (bsl1 / bc)
    
    m = (sigmaSL - sigmaCRP) / lung
    q = sigmaCRP
    
    PSI1 = sigmaSL / sigmaCRP
    b1inf = (3 - PSI1) / (5 - PSI1) * lung
    
    PSI2 = (2 * lung * m + q) / sigmaSL
    b2sup = 2 / (5 - PSI2) * lung
    b2inf = (3 - PSI2) / (5 - PSI2) * lung
    
    b3sup = 0.4 * bc
    b3 = bc - 2 * lung
                lamb_p = (lung / t) / (28.4 * esp_di_fy(acciaio) * Sqr(ksigma))
    
                    If lamb_p <= 0.748 Then
                        rholoc = 1
                    ElseIf ((lamb_p - 0.188) / lamb_p ^ 2) < 1 Then
                        rholoc = ((lamb_p - 0.188) / lamb_p ^ 2)
                    Else
                        rholoc = 1
                    End If
        If rholoc = 1 Then
            rim = lung
        Else
            rim = b3sup + rholoc * lung
                If rim > lung Then
                    rim = lung
                End If
        End If
        
    betaAc = (Airr + t * (b1inf + b2sup + b2inf + rim + lung)) / (Airr + t * lung * (n + 1))
    bt = b_int_piast - bc
    
    J1 = (t * bt ^ 3) / 12 + (t * rim ^ 3) / 12 + (t * b2inf ^ 3) / 12 + (t * b2sup ^ 3) / 12 + (t * b1inf ^ 3) / 12 + 3 * Jyy
    J2 = (t * b1inf) * (b1inf / 2 + lung + b3) ^ 2 + (t * b2sup) * (b2sup / 2 + (lung - b2sup) + b3) ^ 2 + (t * b2inf) * (b2inf / 2 + b3) ^ 2
    J2 = J2 + Asl_eff * (bt - lung) ^ 2 + Asl_eff * (b3) ^ 2 + Asl_eff * (b3 + lung) ^ 2
    Select Case rholoc
        Case 1
            J3 = (t * rim) * (rim / 2) ^ 2
        Case Else
            If b3sup + rholoc * lung > lung Then
                J3 = (t * rim) * (rim / 2) ^ 2
            Else
                J3 = (t * b3sup) * (b3 - b3sup / 2) ^ 2 + (t * (rholoc * lung - (bt - lung))) * ((rholoc * lung - (bt - lung)) / 2) ^ 2
            End If
    End Select
        
    Jsl1_eff = J1 + J2 + J3
    
    Ris(0) = Airr + t * (b1inf + b2sup + b2inf + rim + lung)
    Ris(1) = rholoc
    Ris(2) = betaAc
    Ris(3) = Jsl1_eff
    Ris(4) = bt
    Ris(5) = J1
    Ris(6) = J2
    Aeff = Ris(ind)
    End If
    
    End Function
    
    Il risultato di Ris(4) è quello che dà problemi , tuttavia non capisco perché si generi questa differenza. Spero di aver esposto il problema in modo chiaro.
    Ringrazio fin da ora chiunque risponderà.

  2. #2
    L'avatar di Zer0Kelvin
    Zer0Kelvin non è in linea Scolaretto
    Ciao.
    Penso che senza "vedere" cosa effettivamente contengono le celle coinvolte nei calcoli, sia difficile dare una risposta.
    Potresti allegare un file Excel di esempio con qualche caso in cui la funzione non restituisce il valore corretto ed il corrispondente valore atteso; poi, in generale:
    - in una UDF i parametri sarebbe meglio fossero di tipo Range o Variant
    - dovresti dichiarare tutte le variabili che utilizzi.
    ℹ️ Leggi di più su Zer0Kelvin ...

  3. #3
    schwarz89it non è in linea Novello
    In primo luogo ti ringrazio per avermi risposto prontamente, ora mi scuso per averti fatto perdere tempo; mentre preparavo un foglio Excel da allegare come richiesto, mi sono accorto che l'errore era nei valori che venivano selezionati nella sub, guardando alcuni range hanno indice di riga impostato su 23 invece del corretto 19.
    Evidentemente ero troppo stanco per accorgermene l'altro giorno.

    Chiedo pertanto che il thread venga chiuso.

  4. #4
    I thread non si chiudono ...
    ℹ️ Leggi di più su AntonioG ...

+ Rispondi al messaggio

Potrebbero interessarti anche ...

  1. Risposte: 3
    Ultimo Post: 20-05-2015, 23:57
  2. Risposte: 11
    Ultimo Post: 03-02-2014, 12:15
  3. Risposte: 4
    Ultimo Post: 05-11-2013, 17:45
  4. Copiare il risultato di una cella query
    Da thebusterazz nel forum Microsoft Access
    Risposte: 1
    Ultimo Post: 11-06-2012, 17:59
  5. risultato di una query in una cella excel
    Da frombo72 nel forum Microsoft Excel
    Risposte: 3
    Ultimo Post: 17-08-2006, 21:52