Discussione:
Selezionare celle su altro foglio in funzione vba
(troppo vecchio per rispondere)
Luca
2009-10-28 11:50:05 UTC
Permalink
Ho provato a scrivere una funzione vba (che riporto qui sotto) che mi
consenta di pescare valori da un foglio di lavoro (foglio2) diverso da quello
in cui la funzione è inserita (foglio1).
A causa della mia scarsa conoscenza di VB, non mi spiego perché la funzione
ignori il comando di selezione del foglio2 e lavori sul foglio1.

C'è modo di fargli capire di agire sul foglio2?
Grazie mille,
LucaS

Public Function Quant(ByVal v As Variant) As Variant
Sheets("foglio2").Select
Columns("B:B").Select
Selection.Find(What:=v, After:=ActiveCell, LookIn:= _
xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
xlNext, MatchCase:=False).Activate
ActiveCell.Offset(0, 3).Select
Do While ActiveCell.Value <> "totale"
ActiveCell.Offset(1, 0).Select
Loop
Quant = ActiveCell.Offset(0, 1).Value
End Function
Mauro Gamberini
2009-10-28 14:34:01 UTC
Permalink
Post by Luca
Ho provato a scrivere una funzione vba (che riporto qui sotto) che mi
consenta di pescare valori da un foglio di lavoro (foglio2) diverso da quello
in cui la funzione è inserita (foglio1).
A causa della mia scarsa conoscenza di VB, non mi spiego perché la funzione
ignori il comando di selezione del foglio2 e lavori sul foglio1.
<cut>

La Function dovrebbe trovarsi in un modulo
standard e ricevere 2 parametri,
il valore da cercare ed il foglio nel quale
fare la ricerca.

Public Function Quant( _
ByVal v As Variant, _
ByVal sh As Worksheet) _
As Variant

'codice

Quant = ""

End Function


Richiamata poi così:

Sub m()
MsgBox Quant("", Worksheets("Foglio1"))
End Sub

Io però non ho capito cosa deve restituire
la Function. Puoi spiegarlo, grazie.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/officeit/threads
Luca
2009-10-29 09:31:01 UTC
Permalink
Post by Mauro Gamberini
La Function dovrebbe trovarsi in un modulo
standard e ricevere 2 parametri,
il valore da cercare ed il foglio nel quale
fare la ricerca.
Public Function Quant( _
ByVal v As Variant, _
ByVal sh As Worksheet) _
As Variant
'codice
Quant = ""
End Function
Sub m()
MsgBox Quant("", Worksheets("Foglio1"))
End Sub
Io però non ho capito cosa deve restituire
la Function. Puoi spiegarlo, grazie.
Grazie Mauro per la disponibilità. La function dovrebbe essere una sorta di
cerca.vert, ovvero dovrei inserirla nella cella E2 di foglio1 (e in tutte le
celle sottostanti) e richiamarla come =quant(B2;Worksheets("foglio2")), dove
B2 di foglio1 e sottostanti contengono un "codice lavorazione" da ricercare
nella colonna B di foglio2.
Questo foglio è un computo metrico dettagliato che mi viene dato in un
formato non proprio esemplare. In colonna E ci sono varie stringhe
descrittive del "codice lavorazione", fra cui (in posizione non
predeterminabile) "totale", e nella cella a destra di totale c'è il valore
che la function mi dovrebbe restituire.
L'idea della function nasce dalla necessità di non toccare foglio2
(altrimenti con 1 o2 colonne aggiuntive su foglio 2 e la funzione cerca.vert
su foglio1 me la sarei cavata...).
Se sono riuscito a chiarirti il quadro, avrai capito che ho ancora un
problema: dovrei riuscire a richiamare la function senza sub...

Luca
Mauro Gamberini
2009-10-29 10:35:29 UTC
Permalink
Post by Luca
Grazie Mauro per la disponibilità. La function dovrebbe essere una sorta di
cerca.vert, ovvero dovrei inserirla nella cella E2 di foglio1 (e in tutte le
celle sottostanti) e richiamarla come =quant(B2;Worksheets("foglio2")), dove
B2 di foglio1 e sottostanti contengono un "codice lavorazione" da ricercare
nella colonna B di foglio2.
Questo foglio è un computo metrico dettagliato che mi viene dato in un
formato non proprio esemplare. In colonna E ci sono varie stringhe
descrittive del "codice lavorazione", fra cui (in posizione non
predeterminabile) "totale", e nella cella a destra di totale c'è il valore
che la function mi dovrebbe restituire.
L'idea della function nasce dalla necessità di non toccare foglio2
(altrimenti con 1 o2 colonne aggiuntive su foglio 2 e la funzione cerca.vert
su foglio1 me la sarei cavata...).
Personalmente darei un nome(es.Totale) alla cella
che contiene il totale(quello in cifre) con
Inserisci-->Nome-->Definisci
e poi punterei così alla cella da vb:

MsgBox = [Totale]

e così dalle celle:

=Totale

Se aggiungi o rimuovi righe, la cella con il valore
mantiene il suo nome.


Diversamente, un modo.
In un modulo standard:

Public Function fQuant( _
ByVal v As Variant, _
ByRef sh As Worksheet, _
ByVal sCol As String) _
As Variant

'dichiaro le variabili
Dim rng As Range
Dim c As Range
Dim lUltRiga As Long
Dim vv As Variant

'valore di default della Function
vv = "Non trovato."

With sh
'trovo l'ultima riga con valori
'della colonna di ricerca
lUltRiga = .Range( _
sCol & .Rows.Count _
).End(xlUp).Row
'Set del Range di ricerca
Set rng = .Range(sCol & _
"1:" & sCol & _
lUltRiga)
'ricerca del valore
For Each c In rng
'se trovato
If c.Value = v Then
'carico nella variabile il valore
'della cella a fianco(a dx)
vv = c.Offset(0, 1).Value
End If
Next
End With

'Set a Nothing delle variabili oggetto
Set c = Nothing
Set rng = Nothing

'valore restituito dalla Function
fQuant = vv

End Function

'chiamata della function
Public Sub m()
'richiamo la Function passando
'i tre parametri previsti
MsgBox fQuant("totale", _
Worksheets("Foglio2"), _
"E")
End Sub

Ma forse non ho capito.
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Mauro Gamberini
2009-10-29 10:49:20 UTC
Permalink
<cut>

Aggiungo, forse non è chiaro e chiedo scusa,
che i tre parametri per la Function sono:

1) cosa cercare(case sensitive)
2) in che foglio(es. Worksheets("Foglio1"))
3) in quale colonna(es. "A")
--
---------------------------
Mauro Gamberini
http://www.riolab.org/
http://www.maurogsc.eu/
http://social.microsoft.com/Forums/it-IT/excelit/threads
Loading...