Condividi:        

EXCEL Vba Utilizzo Function

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

EXCEL Vba Utilizzo Function

Postdi Francesco53 » 07/11/13 09:52

Buongiorno a tutto il Forum,
vorrei sapere se è possibile dalla chiamata di una funzione, ricevere in risposta non uno ma due o tre valori.
Nelle prove che ho fatto riesco solo a ricevere un valore in risposta, ma se la mia necessità è quella di ricevere
più di un valore, come devo fare?
Ringrazio chi mi può insegnare come fare.
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Sponsor
 

Re: EXCEL Vba Utilizzo Function

Postdi Anthony47 » 07/11/13 14:13

Affinche' la macro ti restituisca piu' valori devi dichiarare il valore reso "as Variant", e poi lo usi per inserirci una matrice di valori.
Ad esempio come fatto per SebNan nella Function MNSheet (vedi viewtopic.php?p=571356#p571449)

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 07/11/13 17:07

Ciao Anthony,
scusa se continuo a disturbarti ma purtroppo non sono riuscito ad interpretare
nel modo giusto quanto da te suggerito.
Ti posto quello che ho cercato di realizzare, ma purtroppo mi restituisce sempre
il primo risulato, se puoi gentilmente indicarmi l'errore che commetto te ne sarei grato.

Codice: Seleziona tutto
Sub Calcola()
    dati = 2
    a = Somma(dati)
    Cells(3, 2) = a
    b = Somma(dati)
    Cells(4, 2) = b
    c = Somma(dati)
    Cells(5, 2) = c
End Sub
Function Somma(ByVal dati As Byte) As Variant
 Dim calc(1 To 3)
    calc(1) = dati + 2
    calc(2) = dati + 4
    calc(3) = dati + 6
    Somma = calc
End Function


Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi Anthony47 » 08/11/13 00:42

Perdona, purtroppo dal codice che hai scritto non ho intuito che esperimento stai cercando di fare e tantomeno dove sbagli.
Puoi descrivere l' obiettivo?
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 08/11/13 09:34

Buongiorno Anthony ti faccio un esempio molto semplice:
conosco il lato di un cubo, la funzione mi deve calcolare il perimetro, l'area e il volume,
pertanto invio un dato e mi deve restituire i tre valori.

Codice: Seleziona tutto
Sub Calcola()
        lato = 2
        a = Risultato(lato) ' perimetro
        Cells(3, 2) = a
        b = Risultato(lato) ' area
        Cells(4, 2) = b
        c = Risultato(lato) ' volume
        Cells(5, 2) = c
    End Sub
    Function Risultato(ByVal n As Byte) As Variant
     Dim calc(1 To 3)
        calc(1) = n * 4
        calc(2) = n * n
        calc(3) = n * n * n
        Risultato = calc
    End Function


Nella semplicità l'esempio è quanto vorrei ottenere, invio un dato e mi restituisce tre dati.
Grazie
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi Anthony47 » 08/11/13 10:08

Immagino che per "perimetro" tu intenda la somma della misura di ognuno dei 12 spigoli...
Codice: Seleziona tutto
Function cubo(ByVal Lato As Double) As Variant
'restituisce lista a 3 posizioni con somma spigoli, area, volume
Dim myCubos(1 To 3) As Double
myCubos(1) = Lato * 12
myCubos(2) = (Lato ^ 2) * 6
myCubos(3) = Lato ^ 3
If Parent.Caller.Rows.Count > 1 Then
    cubo = Application.WorksheetFunction.Transpose(myCubos)
Else
    cubo = myCubos
End If
End Function
Poi userai una formula standard, es =cubo(2,5) oppure =cubo(A3)
Poiche' la funzione restituisce una tripletta di informazioni scriverai la formula dopo aver selezionato 3 celle contigue e la confermerai con Contr-Maiusc-Enter.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 08/11/13 11:57

Grazie Anthony,
un'altra domanda:
Se volessi memorizzare i risultati in tre variabili, senza scrivere nelle celle,
si può fare?
Grazie
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi Anthony47 » 08/11/13 13:01

Se volessi memorizzare i risultati in tre variabili, senza scrivere nelle celle,
si può fare?
Una "Function" e' fatta per restituire dei valori direttamente al chiamante, che sia una formula excel o un macro.
Vista la domanda, immagino che parli di Function richiamabili solo da altre macro.
Comunque la cosa e' fattibile usando variabili condivise con la macro chiamante, quindi comuni a livello di modulo oppure a livello di progetto; ad esempio
Codice: Seleziona tutto
Function cubo1(ByVal Lato As Double)
'restituisce lista a 3 posizioni con somma spigoli, area, volume
Dim myCubos(1 To 3) As Double
myCubos1(1) = Lato * 12
myCubos1(2) = (Lato ^ 2) * 6
myCubos1(3) = Lato ^ 3
End Function
Presuppone che myCubos1 sia definita e accessibile sia al chiamante che alla Function; ad esempio usando Dim myCubos1(1 To 3) in testa al modulo che contiene sia la Function che il chiamante.
Tuttavia se parli di qualcosa richiamabile solo da macro sarebbe piu' corretto usare una Sub con parametri, non utilizzabile in una formula; a meno che vuoi usare la Function per ottenere qualcosa di intermedio (ad esempio il risultato codificato della function, tipo False o True, oppure un tipo di Errore), ricorrendo alle variabili condivise per il dettaglio del risultato.
Ma qui entriamo nel dominio dell' identificazione dell' algoritmo di soluzione del problema e dello stile di programmazione, cose assolutamente personali perche' legate alle proprie conscenze e proprie abitudini.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 19196
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 08/11/13 14:34

Grazie Anthony.
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi scossa » 09/11/13 15:16

Anthony47 ha scritto:
Se volessi memorizzare i risultati in tre variabili, senza scrivere nelle celle,
si può fare?
Una "Function" e' fatta per restituire dei valori direttamente al chiamante, che sia una formula excel o un macro.
Vista la domanda, immagino che parli di Function richiamabili solo da altre macro.
Comunque la cosa e' fattibile usando variabili condivise con la macro chiamante, quindi comuni a livello di modulo oppure a livello di progetto; ....



Ciao Anthony,

io preferisco, quando possibile, evitare le variabili pubbliche/condivise, per cui propongo questa udf (derivata dalla tua), e due esempi di codice per utilizzarala, precisando che può essere usata (essendo una UDF) nelle celle sia in forma matriciale (in A1 il lato) selezionando 3 celle ed inserendo la seguente formula:
Codice: Seleziona tutto
=myCubo(A1)
da confermare con ctrl+maius+invio
per avere i tre valori nelle tre celle, sia in forma normale per avere la misura voluta in singole celle a scelta:
Codice: Seleziona tutto
=myCubo(A1;"P")

Codice: Seleziona tutto
=myCubo(A1;"A")

Codice: Seleziona tutto
=myCubo(A1;"V")


Questo il codice:

Codice: Seleziona tutto
Function MyCubo(ByVal Lato As Double, Optional Misura As String = "") As Variant
'restituisce lista a 3 posizioni con somma spigoli, area, volume
'oppure la singola misura se specificata come parametro opzionale:
'"P" = Perimetro
'"A" = Area
'"V" = Volume

  Dim myCubos(1 To 3) As Double
 
  myCubos(1) = Lato * 12
  myCubos(2) = (Lato ^ 2) * 6
  myCubos(3) = Lato ^ 3
  Select Case Misura
    Case "P"
      MyCubo = myCubos(1)
    Case "A"
      MyCubo = myCubos(2)
    Case "V"
      MyCubo = myCubos(3)
    Case Else
      MyCubo = myCubos
  End Select
End Function


Codice: Seleziona tutto
Sub Prova()
  Const Lato As Double = 3 'misura del lato
  Dim cubo() As Double
  Dim Perimetro As Double
  Dim Area As Double
  Dim Volume As Double
 
  cubo = MyCubo(Lato)
  Perimetro = cubo(1)
  Area = cubo(2)
  Volume = cubo(3)
  MsgBox "in un cubo di lato" & vbTab & Lato & vbCrLf & _
    "il perimetro misura " & vbTab & Perimetro & vbCrLf & _
    "l'area misura " & vbTab & Area & vbCrLf & _
    "il volume misura " & vbTab & Volume, vbInformation
End Sub


Codice: Seleziona tutto
Sub Prova2()
  Const Lato As Double = 3 'misura del lato
  Dim Perimetro As Double
  Dim Area As Double
  Dim Volume As Double
 
  Perimetro = MyCubo(Lato, "P")
  Area = MyCubo(Lato, "A")
  Volume = MyCubo(Lato, "V")
  MsgBox "in un cubo di lato" & vbTab & Lato & vbCrLf & _
    "il perimetro misura " & vbTab & Perimetro & vbCrLf & _
    "l'area misura " & vbTab & Area & vbCrLf & _
    "il volume misura " & vbTab & Volume, vbInformation
End Sub

Bye!
scossa

Se tu hai una mela, e io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno. Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)
Avatar utente
scossa
Utente Senior
 
Post: 427
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 09/11/13 19:28

grazie scossa per il tuo intervento, l'ho trovato utile ed interessante,
è la soluzione che cercavo.
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 24/11/13 21:51

Un saluto a tutto il Forum,
volevo ampliare l'utilizzo della funzione passando più parametri al posto di uno solo,
purtroppo il codice che allego mi và in errore, e non riesco a farlo funzionare.

Codice: Seleziona tutto
Sub PoligonoRettangolare()
Dim s1 As Double 'Lato minore
Dim s2 As Double 'Lato maggiore
Dim s3 As Double 'Altezza
Dim s4 As Double 'Peso specifico liquido di riempimento
Dim p1 As Double
Dim p2 As Double
Dim p3 As Double
Dim p4 As Double
    s1 = 3
    s2 = 5
    s3 = 4
    s4 = 1.2
        p1 = Calcola(s1, s2, s3, s4, "P")
        p2 = Calcola(s1, s2, s3, s4, "S")
        p3 = Calcola(s1, s2, s3, s4, "T")
        p4 = Calcola(s1, s2, s3, s4, "V")
End Sub


Codice: Seleziona tutto
Function Calcola(ByVal s1 As Double, ByVal s2 As Double, ByVal s3 As Double, ByVal s4 As Double, Optional ByVal Risultato As String = "") As Object
    Dim Calcolo(4) As Double
    Dim n1 As Double
    Dim n2 As Double
    Dim n3 As Double
    Dim n4 As Double
'-------- Calcolo Perimetro -------------------------------
n1 = s1 * 2 + s2 * 2
'-------- Calcolo Area base -------------------------------
n2 = s1 * s2
'-------- Calcolo Volume ----------------------------------
n3 = n2 * s3
'-------- Calcolo Peso liquido ----------------------------
n4 = n3 * s4
   Calcolo(1) = n1
   Calcolo(2) = n2
   Calcolo(3) = n3
   Calcolo(4) = n4
        Select Case Risultato
            Case "P"
                Risultato = Calcolo(1)
            Case "S"
                Risultato = Calcolo(2)
            Case "T"
                Risultato = Calcolo(3)
            Case "V"
                Risultato = Calcolo(4)
            Case Else
                Risultato = Calcolo(0)
        End Select
    End Function

Chiedo per favore se mi potete aiutare a correggere l'errore.
Grazie
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45

Re: EXCEL Vba Utilizzo Function

Postdi Francesco53 » 25/11/13 09:39

Risolto trovato errore commesso.
Francesco
S.O. Windows 10 e Office 2007
Avatar utente
Francesco53
Utente Senior
 
Post: 811
Iscritto il: 20/02/10 18:45


Torna a Applicazioni Office Windows


Topic correlati a "EXCEL Vba Utilizzo Function":


Chi c’è in linea

Visitano il forum: Marius44 e 48 ospiti