Discussione:
[vba]Chiarimento funzione d'utente
(troppo vecchio per rispondere)
Pippo
2007-11-22 20:13:14 UTC
Permalink
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
potenze":

'=========================================

Public Function ConvTesto(ByVal cella As Variant) As Variant


ConvTesto = Evaluate(CStr(cella))


End Function

'=========================================


...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"

nell'istruzione "ConvTesto = Evaluate(CStr(cella))".


Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.

Mi sapreste spiegare il perche'?

Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.


Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho preso
come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant": lo stesso ho
fatto anche io per generare la suddetta funzione!

Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la
funzione d'utente e le variabili "passate" di tipo variant.
--
Ciao e grazie a tutti
Pippo
eliano
2007-11-22 22:50:00 UTC
Permalink
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho preso
come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant": lo stesso ho
fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la
funzione d'utente e le variabili "passate" di tipo variant.
--
Ciao Pippo.
Post by Pippo
Ciao e grazie a tutti
Pippo
Non credo che dipenda dal Variant per funzionare correttamente. Prova:

Public Function MyValue(aCell As Range) As Variant 'by Norman/fernando
Dim myVal As Variant

On Error Resume Next
aCell = Replace(aCell, ",", ".")
myVal = Evaluate(aCell.Value)

If IsError(myVal) Then
MyValue = CVErr(xlErrNA)
Else
MyValue = myVal
End If

End Function

e prova la funzione con:

1*10^-09*-44^6-5*10^-09*-44^5+3*10^-06*-44^4+0.0009*-44^3+0.0528*-44^2+1.8051*-44+29.096

Risultato = -5,4480

Se non funziona potrebbe dipendere dalla lingua del Vba. Questo albionico!:-))
Eliano
Pippo
2007-11-22 23:32:47 UTC
Permalink
Post by eliano
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho preso
come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant": lo stesso ho
fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la
funzione d'utente e le variabili "passate" di tipo variant.
Public Function MyValue(aCell As Range) As Variant 'by Norman/fernando
Dim myVal As Variant
On Error Resume Next
aCell = Replace(aCell, ",", ".")
myVal = Evaluate(aCell.Value)
If IsError(myVal) Then
MyValue = CVErr(xlErrNA)
Else
MyValue = myVal
End If
End Function
1*10^-09*-44^6-5*10^-09*-44^5+3*10^-06*-44^4+0.0009*-44^3+0.0528*-44^2+1.8051*-44+29.096
Risultato = -5,4480
Se non funziona potrebbe dipendere dalla lingua del Vba. Questo albionico!:-))
Funziona, ma restano tutti i dubbi che ho evidanziato!

Ciao e grazie mille
Pippo
Post by eliano
Eliano
eliano
2007-11-23 00:24:00 UTC
Permalink
Post by Pippo
Post by eliano
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho preso
come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant": lo stesso ho
fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la
funzione d'utente e le variabili "passate" di tipo variant.
Public Function MyValue(aCell As Range) As Variant 'by Norman/fernando
Dim myVal As Variant
On Error Resume Next
aCell = Replace(aCell, ",", ".")
myVal = Evaluate(aCell.Value)
If IsError(myVal) Then
MyValue = CVErr(xlErrNA)
Else
MyValue = myVal
End If
End Function
1*10^-09*-44^6-5*10^-09*-44^5+3*10^-06*-44^4+0.0009*-44^3+0.0528*-44^2+1.8051*-44+29.096
Risultato = -5,4480
Se non funziona potrebbe dipendere dalla lingua del Vba. Questo albionico!:-))
Funziona, ma restano tutti i dubbi che ho evidanziato!
Ciao e grazie mille
Pippo
Post by eliano
Eliano
Ciao Pippo.
Quali dubbi ?
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Nel mio post precedente intendevo dire che probabilmente il problema da te
Post by Pippo
Post by eliano
aCell = Replace(aCell, ",", ".")
Questi albionici!! E il Vba parla Inglese, dicono.:-))

Eliano
eliano
2007-11-23 00:40:01 UTC
Permalink
"eliano" ha scritto:

[cut]
Post by eliano
Post by Pippo
Funziona, ma restano tutti i dubbi che ho evidanziato!
Ciao e grazie mille
Pippo
Post by eliano
Eliano
Ciao Pippo.
Quali dubbi ?
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Nel mio post precedente intendevo dire che probabilmente il problema da te
Post by Pippo
Post by eliano
aCell = Replace(aCell, ",", ".")
Questi albionici!! E il Vba parla Inglese, dicono.:-))
Eliano
L'avevo già postata, ma non ritrovo il thread:

Private Sub Worksheet_Change(ByVal Target As Range)
If Application.Intersect(Target, Range("A2:a100")) Is Nothing Then Exit Sub

Dim Risultato As String 'Variant
On Error Resume Next

If Target.Value = "" Then
Risultato = ""
Else
Target.Value = Replace(Target, ",", ".")
Risultato = Evaluate(Target.Value)
End If

If IsError(Risultato) Then
Target.Offset(0, 1).Value = CVErr(xlErrNA)
Else
Target.Offset(0, 1).Value = Risultato
End If

End Sub

Buona notte Pippo.
Eliano
Pippo
2007-11-23 00:44:09 UTC
Permalink
Post by eliano
Post by Pippo
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Funziona, ma restano tutti i dubbi che ho evidanziato!
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Certo che funziona,.. pero', ...

Riepilogo (cerco di spiegarmi meglio) :

1) DUBBIO

come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta al
caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?

2) DUBBIO

al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".

Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto link,
tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.

Ciao
Pippo
eliano
2007-11-23 00:56:00 UTC
Permalink
Post by Pippo
Post by eliano
Post by Pippo
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread "calcoli
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione
"CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con
"cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Funziona, ma restano tutti i dubbi che ho evidanziato!
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Certo che funziona,.. pero', ...
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta al
caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto link,
tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.
Ciao
Pippo
Pippo, non capisco, scusami; per me funziona sia con string che con variant
ed il problema credo che sia dovuto al fatto che per il Vba, noto
"baccagliatore" in Inglese, la nostra virgola corrisponde al suo punto.
E siccome è molto schizzinoso, diamogli i punti. :-))
E questa volta Buona Notte davvero.
Ciao
Eliano
Pippo
2007-11-23 01:09:13 UTC
Permalink
Post by eliano
Post by Pippo
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta al
caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto link,
tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.
Pippo, non capisco, scusami; per me funziona sia con string che con variant
ed il problema credo che sia dovuto al fatto che per il Vba, noto
"baccagliatore" in Inglese, la nostra virgola corrisponde al suo punto.
E siccome è molto schizzinoso, diamogli i punti. :-))
NO, il "punto" e la "virgola" non c'entrano: :-)))

Se scrivo la funzione in tal modo:


'=========================================

Public Function ConvTesto(ByVal cella As Variant) As Variant


ConvTesto = Evaluate(cella) 'cella e' di tipo variant


End Function



'=========================================

.... ed in una cella, es. A1, inserisco 2^3 (non c'e' punto, non c'e
virgola), in A2 scrivo =ConvTesto(A1), ottengo in A2 un errore (#VALORE!).

non c'e' "punto", non c'e "virgola"... :-)))

PS: Non hai risposto al 2 DUBBIO.. :-)))

Ciao e grazie milleeeee
Pippo
eliano
2007-11-23 14:55:00 UTC
Permalink
Post by Pippo
Post by eliano
Post by Pippo
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta al
caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto link,
tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.
Pippo, non capisco, scusami; per me funziona sia con string che con variant
ed il problema credo che sia dovuto al fatto che per il Vba, noto
"baccagliatore" in Inglese, la nostra virgola corrisponde al suo punto.
E siccome è molto schizzinoso, diamogli i punti. :-))
NO, il "punto" e la "virgola" non c'entrano: :-)))
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(cella) 'cella e' di tipo variant
End Function
'=========================================
.... ed in una cella, es. A1, inserisco 2^3 (non c'e' punto, non c'e
virgola), in A2 scrivo =ConvTesto(A1), ottengo in A2 un errore (#VALORE!).
non c'e' "punto", non c'e "virgola"... :-)))
PS: Non hai risposto al 2 DUBBIO.. :-)))
Ciao e grazie milleeeee
Pippo
Ciao Pippo.
Non ho risposto ai tuoi dubbi, ma solo evidenziato che in una normale UDF
come quella che ti ho postato, nonchè nella macro di evento postata è
indifferente usare la definizione della variabile come Variant
(incidentalmente è il default) o come String.
L'unica incongruenza le "mie" (si fa per dire) UDF e Macro la evidenziano
nel caso di valori con decimali separati dalla virgola; per tutte le altre
formulazioni "matematiche" la macro funziona.
Nel dubbio verifica sul mio disco remoto:
http://discoremoto.alice.it/falinieliano il file Formulatestualestefano.xls
La battuta estrema è: se la tua UDF non funziona correttamente non so cosa
farci, modificala.:-))
Cordialmente
Eliano
Maurizio Borrelli
2007-11-28 23:55:05 UTC
Permalink
Post by Pippo
Post by eliano
Post by Pippo
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la
funzione "CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione
(con "cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Funziona, ma restano tutti i dubbi che ho evidanziato!
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Certo che funziona,.. pero', ...
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta
al caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto
link, tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.
Ciao Pippo.

Si usa il tipo Variant negli argomenti di una funzione utente quando si
vuole permettere all'utente di passare alla UDF qualsiasi tipo la
funzione sia in grado di gestire. Es. un Range, un valore (di testo o
numerico), un insieme di valori, ecc.. Questo implica pero' che la UDF,
se e' il caso, deve comportarsi di conseguenza, valutando il tipo del
dato passato e eseguendo le relative porzioni di codice. Si usano i tipi
base quando invece si vuole controllare l'input dell'utente, per
esempio.

Utili considerazioni si possono fare scorrendo, mediante il
Visualizzatore oggetti, i Membri della:

Class WorksheetFunction
Membro di Excel

e confrontandoli con le funzioni incorporate di Excel.

Tuttavia il tuo problema credo stia nell'uso che fai di Evaluate.
Perche' lo usi? Lo scopo della tua UDF e' convertire ... cosa? In...
cosa?

--
Ciao :o) Microsoft MVP (Excel)
Maurizio <https://mvp.support.microsoft.com/profile/Maurizio.Borrelli>
-------- Spazio personale di Maurizio Borrelli
?SPQR(C) <http://spdmb.spaces.live.com>
 X       RIO - Risorse in italiano per gli utenti di office
-------- <http://www.riolab.org>
Pippo
2007-11-29 18:58:30 UTC
Permalink
Post by Maurizio Borrelli
Post by Pippo
Post by eliano
Post by Pippo
Post by Pippo
Riprendo la seguente funzione d'utente, da me suggerita nel thread
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la
funzione "CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione
(con "cella" di tipo *variant*) restituisce errore.
Mi sapreste spiegare il perche'?
Utilizzo "Excel2003"; S.O. "WinVista - Home Premium2.
Funziona, ma restano tutti i dubbi che ho evidanziato!
Prova a cambiare nella UDF Variant con String e la function funziona
tranquillamente.
Certo che funziona,.. pero', ...
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si adatta
al caso in esame, eseguendo automaticamente la trasformazione in tipo
"stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e
la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto
link, tale da dover dichiarare la
funzione (funzione somma) d'utente e le variabili "passate", di tipo
variant.
Si usa il tipo Variant negli argomenti di una funzione utente quando si
vuole permettere all'utente di passare alla UDF qualsiasi tipo la funzione
sia in grado di gestire. Es. un Range, un valore (di testo o numerico), un
insieme di valori, ecc.. Questo implica pero' che la UDF, se e' il caso,
deve comportarsi di conseguenza, valutando il tipo del dato passato e
eseguendo le relative porzioni di codice. Si usano i tipi base quando
invece si vuole controllare l'input dell'utente, per esempio.
OK, quindi, nel tuo es. al suddetto link, avrei potuto dichiarare le
variabili direttamente come "Double"?


Cioe':

Public Function SommaDueNumeri( _
ByVal Num1 As Double _
, ByVal Num2 As Double _
) As Double
SommaDueNumeri = Num1 + Num2
End Function
Post by Maurizio Borrelli
Utili considerazioni si possono fare scorrendo, mediante il Visualizzatore
Class WorksheetFunction
Membro di Excel
e confrontandoli con le funzioni incorporate di Excel.
Puoi fare un esempio?
Post by Maurizio Borrelli
Tuttavia il tuo problema credo stia nell'uso che fai di Evaluate. Perche'
lo usi? Lo scopo della tua UDF e' convertire ... cosa? In... cosa?
Era un tentativo di risposta al thread: "calcoli con le potenze", dove, il
quesito posto, non mi e' molto chiaro....


Ciao e grazie milleeeee
Pippo
Maurizio Borrelli
2007-11-29 22:39:32 UTC
Permalink
[...]
Post by Pippo
1) DUBBIO
come mai il tipo di dati "variant", per sua DEFINIZIONE, non si
adatta al caso in esame, eseguendo automaticamente la trasformazione
in tipo "stringa"?
2) DUBBIO
al link http://tinyurl.com/3a6ous, le variabili passate alla funzione e la funzione stessa, sono state dichiarate di tipo "variant".
Vorrei sapere, se c'e' un motivo particolare, nell'esempio al suddetto link, tale da dover dichiarare la funzione (funzione somma) d'utente e le variabili "passate", di tipo variant.
Si usa il tipo Variant negli argomenti di una funzione utente quando si vuole permettere all'utente di passare alla UDF qualsiasi tipo la funzione sia in grado di gestire. Es. un Range, un valore (di testo o numerico), un insieme di valori, ecc.. Questo implica pero' che la UDF, se e' il caso, deve comportarsi di conseguenza, valutando il tipo del dato passato e eseguendo le relative porzioni di codice. Si usano i tipi base quando invece si vuole controllare l'input dell'utente, per esempio.
OK, quindi, nel tuo es. al suddetto link, avrei potuto dichiarare le variabili direttamente come "Double"?
Public Function SommaDueNumeri( _
ByVal Num1 As Double _
, ByVal Num2 As Double _
) As Double
SommaDueNumeri = Num1 + Num2
End Function
(3)
Class WorksheetFunction
Membro di Excel
e confrontandoli con le funzioni incorporate di Excel.
Puoi fare un esempio?
(4)
Tuttavia il tuo problema credo stia nell'uso che fai di Evaluate.
Perche' lo usi? Lo scopo della tua UDF e' convertire ... cosa? In... cosa?
Era un tentativo di risposta al thread: "calcoli con le potenze", dove,
il quesito posto, non mi e' molto chiaro....
Ciao Pippo.

2) DUBBIO.

Esatto. In quel caso anche Double andava benissimo.

(3)
Un esempio? Vediamo...

Function VLookup(Arg1, Arg2, Arg3, [Arg4])
Membro di Excel.WorksheetFunction

che va letta come:

Function VLookup(ByRef Arg1 As Variant _
, ByRef Arg2 As Variant _
, ByRef Arg3 As Variant _
, Optional ByRef Arg4 As Variant _
) As Variant

da confrontare con:

CERCA.VERT(*valore*;*matrice_tabella*;*indice*;intervallo)

Oppure:

Function Ceiling(Arg1 As Double, Arg2 As Double) As Double
Membro di Excel.WorksheetFunction

ovvero:

Function Ceiling(ByRef Arg1 As Double _
, ByRef Arg2 As Double _
) As Double

da confrontare con:

ARROTONDA.ECCESSO(*num*;*peso*)

(4)
Ah be' allora...

--
Ciao :o) Microsoft MVP (Excel)
Maurizio https://mvp.support.microsoft.com/profile/Maurizio.Borrelli
-------- Spazio personale di Maurizio Borrelli
?SPQR(C) http://spdmb.spaces.live.com
 X       RIO - Risorse in italiano per gli utenti di office
-------- http://www.riolab.org
Pippo
2007-12-02 12:39:52 UTC
Permalink
"Pippo" wrote in message
[cut]
(3)
Un esempio? Vediamo...
Function VLookup(Arg1, Arg2, Arg3, [Arg4])
Membro di Excel.WorksheetFunction
Function VLookup(ByRef Arg1 As Variant _
, ByRef Arg2 As Variant _
, ByRef Arg3 As Variant _
, Optional ByRef Arg4 As Variant _
) As Variant
CERCA.VERT(*valore*;*matrice_tabella*;*indice*;intervallo)
[cut]

Nella suddetta funzione, "indice" non poteva essere dichiarato come "Long"?

Ciao e grazie milleeee
Pippo
Maurizio Borrelli
2007-12-02 17:52:33 UTC
Permalink
Post by Pippo
"Pippo" wrote in message
[...]
Post by Pippo
Function VLookup(ByRef Arg1 As Variant _
, ByRef Arg2 As Variant _
, ByRef Arg3 As Variant _
, Optional ByRef Arg4 As Variant _
) As Variant
CERCA.VERT(*valore*;*matrice_tabella*;*indice*;intervallo)
Nella suddetta funzione, "indice" non poteva essere dichiarato come "Long"?
[...]

Ciao Pippo.

Gia', ma perche' non Integer, allora, visto che il numero delle colonne,
all'epoca, era di 256 e ancora oggi (Office 2007: 16.384) e'
abbondantemente compreso in quell'intervallo (-32.768 e 32.767)?

Dicevo (e scusa se mi ripeto):

Si usa il tipo Variant negli argomenti di una funzione utente quando si
vuole permettere all'utente di passare alla UDF qualsiasi tipo la
funzione sia in grado di gestire. Es. un Range, un valore (di testo o
numerico), un insieme di valori, ecc.. Questo implica pero' che la UDF,
se e' il caso, deve comportarsi di conseguenza, valutando il tipo del
dato passato e eseguendo le relative porzioni di codice.

Forse non e' chiaro? Probabilmente no, ne convengo, ma sta di fatto che
la definizione VBA di VLookup non l'ho scritta io, per cui posso al
massimo supporre i ragionamenti che sono a monte di tale definizione; e
trovo che sono abbastanza simili a quelli che farei io: 1) permettere
all'utente ampia liberta' di immissione; 2) controllo rigoroso del tipo
di dato passato; 3) gestione conseguente del dato.

--
Ciao :o) Microsoft MVP (Excel)
Maurizio https://mvp.support.microsoft.com/profile/Maurizio.Borrelli
-------- Spazio personale di Maurizio Borrelli
?SPQR(C) http://spdmb.spaces.live.com
 X       RIO - Risorse in italiano per gli utenti di office
-------- http://www.riolab.org
Maurizio Borrelli
2007-12-02 18:11:18 UTC
Permalink
Post by Maurizio Borrelli
Post by Pippo
"Pippo" wrote in message
[...]
Post by Maurizio Borrelli
Post by Pippo
Function VLookup(ByRef Arg1 As Variant _
, ByRef Arg2 As Variant _
, ByRef Arg3 As Variant _
, Optional ByRef Arg4 As Variant _
) As Variant
CERCA.VERT(*valore*;*matrice_tabella*;*indice*;intervallo)
Nella suddetta funzione, "indice" non poteva essere dichiarato come "Long"?
[...]
Post by Maurizio Borrelli
Gia', ma perche' non Integer, allora, visto che il numero delle colonne,
all'epoca, era di 256 e ancora oggi (Office 2007: 16.384) e'
abbondantemente compreso in quell'intervallo (-32.768 e 32.767)?
Si usa il tipo Variant negli argomenti di una funzione utente quando si
vuole permettere all'utente di passare alla UDF qualsiasi tipo la
funzione sia in grado di gestire. Es. un Range, un valore (di testo o
numerico), un insieme di valori, ecc.. Questo implica pero' che la UDF,
se e' il caso, deve comportarsi di conseguenza, valutando il tipo del
dato passato e eseguendo le relative porzioni di codice.
Forse non e' chiaro? Probabilmente no, ne convengo, ma sta di fatto che
la definizione VBA di VLookup non l'ho scritta io, per cui posso al
massimo supporre i ragionamenti che sono a monte di tale definizione; e
trovo che sono abbastanza simili a quelli che farei io: 1) permettere
all'utente ampia liberta' di immissione; 2) controllo rigoroso del tipo
di dato passato; 3) gestione conseguente del dato.
Ciao Pippo.

Rileggendomi appena dopo l'invio mi accorgo di un aspetto del mio
discorso che potrebbe notevolmente fuorviare chi mi legge. Ho parlato
di:

Function VLookup(Arg1, Arg2, Arg3, [Arg4])
Membro di Excel.WorksheetFunction

come se fosse una UDF (User Defined Function, Funzione definita
dall'utente) mentre evidentemente non lo e'. L'ho fatto perche'
l'argomento era appunto la costruzione di una UDF. Una funzione cioe' da
usare "lato Excel". Nel discorso ci stava bene, credo, perche'
precedentemente avevo invitato a confrontare le funzioni native di Excel
con la corrispondente versione VBA. Sta di fatto che lo scopo di una UDF
e' ben diverso da quello della versione VBA di una funzione nativa di
Excel: la prima (UDF) verra' usata "lato Excel", l'altra invece lato
"VB", e questo implica anche un diverso ragionamento nella definizione
della funzione. Credo che il mio discorso regga comunque, a condizione
di considerare ragionevolmente quanto appena detto e di non prenderlo
alla lettera e usando le definizioni VBA delle funzioni native solo
come... fonte di ispirazione e confronto.

--
Ciao :o) Microsoft MVP (Excel)
Maurizio https://mvp.support.microsoft.com/profile/Maurizio.Borrelli
-------- Spazio personale di Maurizio Borrelli
?SPQR(C) http://spdmb.spaces.live.com
 X       RIO - Risorse in italiano per gli utenti di office
-------- http://www.riolab.org
Pippo
2007-12-02 19:32:14 UTC
Permalink
Post by Maurizio Borrelli
Post by Pippo
"Pippo" wrote in message
[...]
Post by Pippo
Function VLookup(ByRef Arg1 As Variant _
, ByRef Arg2 As Variant _
, ByRef Arg3 As Variant _
, Optional ByRef Arg4 As Variant _
) As Variant
CERCA.VERT(*valore*;*matrice_tabella*;*indice*;intervallo)
Nella suddetta funzione, "indice" non poteva essere dichiarato come "Long"?
[...]
Gia', ma perche' non Integer, allora, visto che il numero delle colonne,
all'epoca, era di 256 e ancora oggi (Office 2007: 16.384) e'
abbondantemente compreso in quell'intervallo (-32.768 e 32.767)?
Si', hai ragione, nel caso in esame, e' piu' che sufficiente il tipo
"integer"; ma, avevo un ricordo *errato* del thread
http://tinyurl.com/3cgjle, cioe', ricordavo *erroneamente*, che il tipo
"Long" fosse piu' veloce...
Post by Maurizio Borrelli
Si usa il tipo Variant negli argomenti di una funzione utente quando si
vuole permettere all'utente di passare alla UDF qualsiasi tipo la funzione
sia in grado di gestire. Es. un Range, un valore (di testo o numerico), un
insieme di valori, ecc.. Questo implica pero' che la UDF, se e' il caso,
deve comportarsi di conseguenza, valutando il tipo del dato passato e
eseguendo le relative porzioni di codice.
Forse non e' chiaro? Probabilmente no, ne convengo, ma sta di fatto che la
definizione VBA di VLookup non l'ho scritta io, per cui posso al massimo
supporre i ragionamenti che sono a monte di tale definizione; e trovo che
sono abbastanza simili a quelli che farei io: 1) permettere all'utente
ampia liberta' di immissione; 2) controllo rigoroso del tipo di dato
passato; 3) gestione conseguente del dato.
Grazie, ..quando ti e' possibile, puoi dare uno sguardo al thread
*"Numerazione progressiva in Word"* su mpiow?..Non riesco a proseguire. :-((

Ciao e grazie milleeee
Pippo

cucchiaino
2007-11-23 05:46:21 UTC
Permalink
Pippo scrive:

cucchiaino saluta
Post by Pippo
'=========================================
Public Function ConvTesto(ByVal cella As Variant) As Variant
ConvTesto = Evaluate(CStr(cella))
End Function
'=========================================
...per poter funzionare correttamente, ho dovuto utilizzare la funzione "CStr()"
nell'istruzione "ConvTesto = Evaluate(CStr(cella))".
Scrivendo direttamente: "ConvTesto = Evaluate(cella)" la funzione (con "cella" di tipo variant) restituisce errore.
1) Non è corretto già il nome della variabile! :-)

cella può far pensare ad un Range mentre qui ci si riferisce al suo contenuto, quindi

Public Function ConvTesto(ByVal contenutocella As Variant) As Variant


2) Il contenuto di una cella di Excel è Variant per sua natura, non è possibile ad
inizio routine "dimensionare" il contenuto di una cella di Excel perchè può
contenere qualsiasi cosa e non per forza quello che vb(a) si aspetta di trovare.

3) E' meglio non contare sulle "gentilezze" di vba, tipo tradurre in testo un numero
perchè la funzione necessita di testo, ma offrire il valore "confezionato" e
"garantito" per lo scopo. Nei casi impossibili c'è sempre la gestione errori.
L'uso di Option Explicit è consigliato per questo motivo.
Post by Pippo
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho preso come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla funzione e la funzione stessa, sono state dichiarate di tipo "variant": lo stesso ho fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la funzione d'utente e le variabili "passate" di tipo variant.
se la funzione riceverà le variabili "all'interno di vb" ciò non serve


()---cucchiaino
Pippo
2007-11-23 20:45:48 UTC
Permalink
Post by cucchiaino
Post by Pippo
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho
preso come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla
lo stesso ho fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la
funzione d'utente e le variabili "passate" di tipo variant.
se la funzione riceverà le variabili "all'interno di vb" ciò non serve
Non capisco?!

Cosa intendi con: "se la funzione riceverà le variabili "all'interno di vb"
ciò non serve".

Ciao e grazie milleeee
Pippo
Pippo
2007-11-23 21:02:52 UTC
Permalink
Post by Pippo
Post by cucchiaino
Post by Pippo
Inoltre, per come inserire ed utilizzare la funzione "ConvTesto", ho
preso come esempio le istruzioni
al link http://tinyurl.com/3a6ous, dove le variabili passate alla
lo stesso ho fatto anche io per generare la suddetta funzione!
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare
la funzione d'utente e le variabili "passate" di tipo variant.
se la funzione riceverà le variabili "all'interno di vb" ciò non serve
Non capisco?!
Cosa intendi con: "se la funzione riceverà le variabili "all'interno di
vb" ciò non serve".
Inoltre, se ho ben capito, dopo avere dichiarato le variabili (relative al
contenuto di celle) "variant", occorre applicare la successiva
trasformazione nel *reale* tipo di dato, come ho fatto io usando la funzione
CStr() ?

Ripredendo cioe',ad es., la funzione scritta da Maurizio, avrei:

'===========================================
Public Function SommaDueNumeri( _
ByVal Num1 As Variant _
, ByVal Num2 As Variant _
) As Variant
SommaDueNumeri = CDbl(Num1) + CDbl(Num2)
End Function
'===========================================

Ho utilizzato la funzione CDbl() per convertire il tipo di dato dichiarato
come "variant"....

Cosa ne pensi?

Ciao e grazie milleee
Pippo
cucchiaino
2007-11-24 02:19:04 UTC
Permalink
Inoltre, se ho ben capito, dopo avere dichiarato le variabili (relative al contenuto di celle) "variant", occorre applicare la successiva trasformazione nel reale tipo di dato, come ho fatto io usando la funzione CStr() ?
si
'===========================================
Public Function SommaDueNumeri( _
ByVal Num1 As Variant _
, ByVal Num2 As Variant _
) As Variant
SommaDueNumeri = CDbl(Num1) + CDbl(Num2)
End Function
'===========================================
Ho utilizzato la funzione CDbl() per convertire il tipo di dato dichiarato come "variant"....
giusto
Cosa ne pensi?
che sei forte! :-)


()---cucchiaino
cucchiaino
2007-11-24 02:17:03 UTC
Permalink
Post by Pippo
Post by cucchiaino
Vorrei sapere, se c'e' un motivo particolare, tale da dover dichiarare la funzione d'utente e le variabili "passate" di tipo variant.
se la funzione riceverà le variabili "all'interno di vb" ciò non serve
Non capisco?!
Cosa intendi con: "se la funzione riceverà le variabili "all'interno di vb" ciò non serve".
Non mi sono espresso molto bene. Faccio due esempi:

1)

Sub pica()
Dim a As Long
Dim b As Long
Dim cella As Range

Set cella = ActiveSheet.Range("A1")
If IsError(cella.Value) Then
MsgBox ("Verificare contenuto cella A1")
Else
a = CLng("0" & cella.Value)
b = quadruplo(a)
End If
End Sub

In questo primo esempio la Function riceve da vb un valore
"confezionato" e cioè un Long.
Questa funzione puoi utilizzarla all'interno di vb ma non
in un foglio di lavoro scrivendo:

=quadruplo("A1")

perchè potrebbe avere qualche sorpresa (in A1 potrebbe esserci di tutto)



2)

Sub zica()
Dim a As Long
Dim b As Long
Dim cella As Range

Set cella = ActiveSheet.Range("A1")
b = quadruplo(cella.Value)
End Sub

Function quadruplo(ByVal n As Variant)
quadruplo = CLng("0" & n) * 4
End Function

In questo caso la Function è poco adatta per essere utilizzata
all'interno di vb, ma invece adatta per un foglio di lavoro:

=quadruplo("A1")





()---cucchiaino
cucchiaino
2007-11-24 03:36:02 UTC
Permalink
cucchiaino scrive:

chiedo scusa, non ho incollato la funzione del primo esempio
Post by cucchiaino
1)
Sub pica()
Dim a As Long
Dim b As Long
Dim cella As Range
Set cella = ActiveSheet.Range("A1")
If IsError(cella.Value) Then
MsgBox ("Verificare contenuto cella A1")
Else
a = CLng("0" & cella.Value)
b = quadruplo(a)
End If
End Sub
Function quadruplo(n As Long) As Long
quadruplo = n * 4
End Function
Post by cucchiaino
In questo primo esempio la Function riceve da vb un valore
"confezionato" e cioè un Long.
Questa funzione puoi utilizzarla all'interno di vb ma non
in un foglio di lavoro scrivendo =quadruplo("A1")
perchè potrebbe avere qualche sorpresa (in A1 potrebbe esserci di tutto)
2)
Sub zica()
Dim a As Long
Dim b As Long
Dim cella As Range
Set cella = ActiveSheet.Range("A1")
b = quadruplo(cella.Value)
End Sub
Function quadruplo(ByVal n As Variant) As Long
quadruplo = CLng("0" & n) * 4
End Function
In questo caso la Function è poco adatta per essere utilizzata
=quadruplo("A1")
()---cucchiaino
Loading...