Newsgroup: it.comp.lang.visual-basic
Titolo: Chiamata di funzione VBA Excel con passaggio indirizzo cella

Spero mi possiate gentilmente aiutare:
Voglio scrivere una funzione per Excel.
la mia funzione dovrebbe essere
function CalcPoint (foglio as Worksheet, cella as range)
 dove la cella è quella da dove viene chiamata la formula mentre il foglio
viene inserito dall'utente.
1° Domanda_ come posso passare l'indirizzo della cella da cui chiamo la
funzione
La funzione mi serve per trovare il valore presente nel foglio inserito
dall'utente nella cella che ha come indirizzo A(noto a priori)e riga uguale
a quella della cella da cui viene chiamata la funzione (
esempio per chiamata da c27 la cella è A27 e da f43 è a43).
2° Domanda_  come posso comporre questo indirizzo?? (naturalmente se
possibile io passerei direttamente alla funzione il valore riga e non
l'indirizzo della cella in cui ho inserito la chiamata di funzione.
Grazie infinite
Paolo

 l'indirizzo della cella in cui ho inserito la chiamata di funzione.
Non ho capito una cosa: tale funzione deve essere una "funzione utente"? Per
intenderci, una funzione che intendi usare/far usare in una cella di un
foglio di lavoro? Per esempio:
    =CalcPoint(...
come scriveresti:
    =SOMMA(...
?
Perche' se intendi questo allora non capisco il primo argomento "foglio as
Worksheet", come ho gia scritto piu' sopra.
Ma potrebbe essere che invece questa funzione tu intenda richiamarla da
codice.
Rileggendo, pero', non mi e' chiara anche la questione del "... valore
presente nel foglio inserito dall'utente nella cella ..."
Vediamo un po'... Hai presente la funzione del foglio di lavoro "RIF.RIGA"?
Se per esempio scrivi:
    A1: =RIF.RIGA()
ottieni come risultato:
    1
che e' appunto il numero della riga della cella chiamante. Cosa che puoi
riprodurre con:
    Public Function MiaRifRiga()
        MiaRifRiga = Application.Caller.Row
    End Function
Intendi forse qualcosa del genere?
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 Intendi forse qualcosa del genere?
era esattamente quello a cui pensavo.
non avevo trovato la libreria Application.caller (sempre che libreria sia il
termine corretto)
Mi rimane da capire come posso ora unire questo valore ad A per creare un
indirizzo es A1 se MiaRifRiga =1
Per intenderci devo creare una stringa come faccio in java unendo a A il
MiaRifRiga (a cui faccio un cast e lo trasformo in stringa)??
Come si fa in VBA?
Grazie infinite per l'aiuto datomi
paolo

Sono arrivato a scrivere il seguente codice
Function CalcPunt(foglio As String)
Dim MiaRifRiga As Integer
Dim Indirizzo_Numerico As String
MiaRifRiga = Application.Caller.Row
Indirizzo_Numerico = CStr(MiaRifRiga)
Indirizzo_PrSquadra = "A" + Indirizzo_Numerico
CalcPunt = Worksheet(foglio).Range(Indirizzo_PrSquadra)
End Function
Quando nella cella del foglio scrivo =CalcPunt("Foglio2") mi dà errore di
non riconoscimento formula (#NOME?)
Perchè?
Io sono principiante in VBA
Ho scelto visualizza codice e poi inserito il codice sopra riportato...devo
fare altre operazioni per usare la formula...
il messaggio precedente può dipendere da errori differenti??
Grazie mille per l'aiuto

 ha scritto nel messaggio
news:knpK8.8135$t47.2...@twister1.libero.it...

Essendo domenica... concedimi di darti solo qualche dritta e non una
solouzione + conpleta...
se cerchi bene nelle guide troverai funzioni che ti riportano
il riferimento alle celle in tutti i formati che vuoi anche 'A1'
attento bene alla sintassi di Worksheet e di Sheets, ed al foglio corrente
inoltre io sarei più propenso anche solo per stile( ma non solo) ad usare
l'operatore di concatenazione "&" al posto dell'operatore somma("+")  per
unire stringhe

 il messaggio precedente può dipendere da errori differenti??
Puo' darsi. Vediamo come andrebbe fatto il tutto partendo dall'inizio.
Prima scelta da fare: la funzione dovra' essere locale o pubblica?
Con "locale" intendo una funzione con visibilita' solo all'interno del
progetto. Per "progetto" in questo caso intendiamo la cartella di lavoro.
Esaminiamo prima il caso piu' semplice, la visibilita' locale. Scriviamo
quindi una funzione che possa essere usata unicamente nella cartella di
lavoro che possiede il progetto in cui scriveremo tale funzione.
All'apertura di un progetto:
    Strumenti > Macro > Visual Basic Editor
vediamo elencati nella finestra "Gestione progetti" i moduli Visual Basic
per la gestione degli eventi relativi agli oggetti Workbook e Sheets del
progetto:
    . il modulo "ThisWorkbook" per la classe "Workbook";
    . tanti moduli "Foglio" di classe "Worksheet" per ciascun Foglio di
lavoro della Cartella di lavoro.
Essendo questi Moduli di classe, potremo scrivere al loro interno procedure
"Sub", "Function" e "Property", sia pubbliche che private, ma l'uso di
quelle pubbliche al di fuori di tali moduli sara' soggetto alla sintassi
propria dei metodi, funzioni e proprieta' degli oggetti. Esempio veloce:
    <oggetto>.nomeprocedura
Per scrivere invece una "funzione utente" che possa essere invocata da una
cella del foglio di lavoro dovremo inserire nel progetto un "Modulo". E le
"Sub", "Function" e "Property" pubbliche che in esso scriveremo potranno
essere chiamate con la sintassi:
    nomeprocedura
Nel caso particolare di una procedura "Function" pubblica, chiamata da una
cella del Foglio di lavoro:
    =nomefunzione
Probabilmente l'errore "#NOME?" lo ottieni proprio a causa della non
visibilita' della funzione da parte del Foglio di lavoro.
Riguardo la seconda possibilita' -- funzione pubblica -- se sei interessato
potresti come prima cosa fare una ricerca su google, e potresti cominciare
da questo link:
http://groups.google.com/groups?as_q=personal.xls&as_ugroup=it.comp.lang.vis
ual-basic&lr=lang_it&hl=it
poi scrivere nuovamente se incontri problemi.
Spero di essere stato esaustivo. Io almeno esausto lo sono. :)


Grazie infinite sono riuscito a fare tutto quello che volevo...naturalmente
posso migliorarlo sintatticamente e come pesantezza del codice ma per ora
era per me importante arrivare a una soluzione