Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

da Funzione a Vba (il numero più vicino a ...)

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

da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 03/12/09 14:36

Salve a tutti,
ho questa funzione che mi restituisce il risultato voluto (il numero più grande vicino a 16,4)
=GRANDE(X3:X100;CONTA.SE(X3:X100;">="&16,4))

vorrei traslare la stessa in vba e cui iniziano le difficoltà.
Assodato che la variabile "myRange" è ok :
sMaxCarRuote1 = Application.WorksheetFunction.Large(myRange, 1)
funziona mi restituisce il numero più alto
mentre
sMaxCarRuote2= Application.WorksheetFunction.CountIf(myRange, ">=" & sRicercaF)
dove sRicercaF=16,4 , non funziona, mi restituisce 0 anziche 28 (che è il numero di dati maggiore a 16,4 nel mio range).

Inoltre dovrei mettere assieme le 2 funzioni e mi dà sempre un errore ...

Qualsiasi suggerimento è bene accetto.
Grazie
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Sponsor
 

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 03/12/09 15:20

Con numeri senza virgola, funziona anche la seconda operazione ... ho provato a trasformare il formato del numero in americano (16.4), ma continua a non funzionare ... in che formato dovrei trasformare il numero per poter fare il confronto?
grazie
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Flash30005 » 03/12/09 15:23

Per capire quale valore ti occorreva ho utilizzato la tua formula
Codice: Seleziona tutto
=GRANDE(X3:X100;CONTA.SE(X3:X100;">="&16,4))

e poi ho creato una macro che mi desse lo stesso valore della formula
te la invio per testarla
Codice: Seleziona tutto
Sub TrovaVal()
Col = "X"
RigaI = 3
sRicercaF = 16.4
UR = Range(Col & Rows.Count).End(xlUp).Row
myRange = Worksheets("Foglio1").Range(Col & RigaI & ":" & Col & UR)
'sMaxCarRuote1 = Application.WorksheetFunction.Large(myRange, 1)
sMaxCarRuote2 = UR - Application.WorksheetFunction.Large(myRange, sRicercaF) - 1
MsgBox sMaxCarRuote2
End Sub

In VBA, nei numeri decimali, usa il punto al posto delle virgole es. 16.4 non 16,4

Fai sapere
Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Flash30005 » 03/12/09 15:37

dipic ha scritto:Con numeri senza virgola, funziona anche la seconda operazione ...

a me non funziona nemmeno così impostata :roll:
dipic ha scritto:sMaxCarRuote2= Application.WorksheetFunction.CountIf(myRange, ">=" & 16)


Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 03/12/09 15:55

Grazie per l'interessamento flash ...

convertendo tutto con Cstr le 2 funzioni separate adesso restituiscono il risultato corretto ... adesso devo metterle assieme...
sMaxCarRuote1 = Application.WorksheetFunction.Large(myRange, 1)
è ok
sMaxCarRuote2 = Application.WorksheetFunction.CountIf(myRange, ">=" & sRicercaF)
è ok
sMaxCarRuote3 = Application.WorksheetFunction.Large(myRange, sMaxCarRuote2)
restituisce "errore di run-time '1004'" - Impossibile trovare la proprietà Large per la classe WorksheetFunction

penso che uscirò di senno
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Flash30005 » 03/12/09 16:29

Ma hai provato la macro del post delle ore 15:23?

Dovrebbe fare quello che ti occorre...

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 03/12/09 16:45

l'ho provata, ma mi restituisce un dato che non centra niente ... prova con questi dati (tutte celle testo)
dandogli in pasto 16,4 dovrebbe restituirmi 16,8...
...se mi dici come fare ad allegare un file ti mando un esempio...
in cella E1 inserisci 16,4
in cella G1 inserisci =GRANDE(A1:A40;CONTA.SE(A1:A40;">="&E1))
in colonna A come segue
A
7,6
8,8
10,1
9,8
12,4
13,6
12,4
14,9
16,8
16,8
16,8
16,8
20,2
22,7
31,5
26,6
29,9
32,24
29,9
41,2
51,2
39,3
51,2
51,2
39,3
54,1
66,8
45
61,8
66,8
45
61,8
77,7
52
70,2
89,6
0
0
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Flash30005 » 04/12/09 00:32

Si ok, non avevo afferrato bene cosa ti occorresse e hai fatto benissimo a pubblicare dei dati altrimenti avrei sbagliato ancora
Quindi, se cerchi il valore più prossimo a un dato, la macro che può fare al caso tuo potrebbe essere questa:
Codice: Seleziona tutto
Sub TrovaVal()
Col = "A"    '<<<< modifica*
RigaI = 1    '<<<<<< modifica*
sRicercaF = Range("E1").Value    '<<<< modifica*
RifV = sRicercaF
UR = Range(Col & Rows.Count).End(xlUp).Row
For VMC = RigaI To UR
If Range(Col & VMC).Value = 0 Then GoTo salta
If Abs(Range(Col & VMC).Value - sRicercaF) < RifV Then
    RifV = Abs(Range(Col & VMC).Value - sRicercaF)
    sMaxCarRuote2 = Range(Col & VMC).Value
End If
salta:
Next VMC
MsgBox sMaxCarRuote2
End Sub

Fai attenzione però che questa macro cerca il valore più prossimo (come dal titolo del topic) anche se questo valore dovesse essere più piccolo di quello che cerchi
A questo punto mi viene un dubbio perché quanto pubblichi successivamente nei post non concorda con il topic infatti i simboli ">=" stanno a significare che vorresti il primo valore più grande di quello di riferimento ma il valore più vicino potrebbe essere 16,3 o sbaglio?

Fai sapere
Ciao

Modificata* macro, il 4 dicembre ore 11:15, per adeguarla alle esigenze utente
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Anthony47 » 04/12/09 02:49

Rispetto invece al tuo codice... non dai il listato completo, ma quello che ottieni mi fa pensare che sMaxCarRuote2 sia ancora a "0", da cui la failure dell' istruzione ApplicationWorksheet.Large.
Poi non dici se il codice vba deve lavorare con una soglia costante (cablata nel vba) o se sul valore di una cella. Ipotizzo quindi che vuoi lavorare con la soglia inserita nella cella E1, come nella formula in uso, che e' il caso piu' complesso.
Le istruzioni che ti restituiscono quello che cerchi potrebbero essere:
Codice: Seleziona tutto
sRicercaF = Replace((Range("E1").Value), ",", ".")
sMaxCarRuote2 = Application.WorksheetFunction.CountIf(myrange, ">= " & sRicercaF)

Ritengo pero' che debba usare "> " & sRicercaF (nota > e non >=); la differenza e' che con >=, impostando ad es 16,8 otterrai 16,8, con > otterrai 20,2; vedi tu quale valore cerchi.

Se il valore soglia lo imposti in vba, allora basta che usi un valore stringa che usi il "punto" come separatore decimale (es sRicercaF = "16.4")

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 04/12/09 17:18

Grazie flash, era proprio quello che mi serviva ...
Per risolvere il problema del più prossimo minore ho solo inserito una riga di test per i valori più bassi di "RifV" ... non li controllo nemmeno (goto salta).
Ho poi aggiunto una variabile di seguito alla riga "sMaxCarRuote2 = Range(Col & VMC).Value" che memorizza anche la riga, così posso recuperare il dato dalla colonna che mi interessa.
Mi sfugge l'uso di "Abs()" anche perchè non molto ben spiegato nell'help...
Riusciresti a spiegarmi qual'è il motivo del suo utilizzo e come funziona?

Grazie anche ad Anthony ...
nel caso i numeri siano = deve uscire lo stesso numero quindi ">=" è corretto.
Il problema del formato del separatore decimale lo avevo già capito provando, non riuscivo invece a nidificare in vba le due operazioni come invece si riesce con la funzione
"=GRANDE(A1:A40;CONTA.SE(A1:A40;">="&E1)) "
infatti utilizzatte separatamente funzionano ma non riuscivo a nidificarle ... esiste un modo in vba?

Grazie ancora per l'enorme aiuto
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Anthony47 » 05/12/09 00:17

infatti utilizzatte separatamente funzionano ma non riuscivo a nidificarle ... esiste un modo in vba?
Hai provato le istruzioni che ti ho proposto, vedi viewtopic.php?f=26&t=83652&p=476516#p476405?

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Flash30005 » 05/12/09 00:55

dipic ha scritto:Mi sfugge l'uso di "Abs()" anche perchè non molto ben spiegato nell'help...
Riusciresti a spiegarmi qual'è il motivo del suo utilizzo e come funziona?

Abs() è la funzione di Assoluto che ci permette di avere la differenza, tra la cella scansionata e il valore ricercato, sempre con valore positivo, in questa maniera, RifV assume, quando la condizione viene soddisfatta, un valore inferiore.
A fine del ciclo della macro, RifV, avrà assunto la differenza minima che cercavamo e con esso anche il valore del dato esistente nella colonna-dati.

Ciao
Flash
Win7 + Office 2010 Ita
"Fotografica" al servizio dell'immagine

Ottime opportunità di lavoro (part-time o full-time) con guadagni immediati. Info in MP
Avatar utente
Flash30005
Moderatore
 
Post: 8460
Iscritto il: 27/09/07 11:44
Località: Roma +o-

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi dipic » 05/12/09 10:41

Grazie per le spiegazioni ed i suggerimenti, funziona perfettamente.

Per Anthony
Continua a non funzionarmi con Countif ...
solo per conoscenza: se hai scritto la macro per provarne il funzionamento, potresti postarla che provo a studiarmela e a vedere dove stò sbagliando?
grazie
Avatar utente
dipic
Utente Junior
 
Post: 95
Iscritto il: 13/09/08 14:57
Località: Cormòns (I)

Re: da Funzione a Vba (il numero più vicino a ...)

Postdi Anthony47 » 05/12/09 17:59

La macro sono le tue istruzioni con la piccolissima variazione del contenuto di sRicercaF di cui ti avevo scritto:
Codice: Seleziona tutto
Sub mm1()

Set myrange = Range("A1:A40")
sRicercaF = Replace((Range("E1").Value), ",", ".")
sMaxCarRuote2 = Application.WorksheetFunction.CountIf(myrange, ">= " & sRicercaF)
sMaxCarRuote1 = Application.WorksheetFunction.Large(myrange, sMaxCarRuote2)

MsgBox ("sMaxCarRuote2 = " & sMaxCarRuote2 & vbCrLf & _
  "sMaxCarRuote1= " & sMaxCarRuote1)
End Sub

Ma anche combinando il calcolo di sMaxCarRuote2 all' interno di sMaxCarRuote1 il risultato e' lo stesso.
Nota che questa macro risponde alla domanda "come faccio a far funzionare la WorksheetFunction.Countif" e non "come faccio a trovare il valore piu' prossimo a un valore impostato in E1, e infatti il risultato e' spesso diverso da quanto da' la macro di Flash. Tra l' altro, se vuoi ottenere via formula questo risultato (il valore pi' prossimo a E1) puoi usare anche la formula
Codice: Seleziona tutto
=SE(CONTA.SE(A1:A100;E1+MIN(ASS(E1-A1:A100)))>0;E1+MIN(ASS(E1-A1:A100));E1-MIN(ASS(E1-A1:A100)))
(notazione matriciale, quindi Contr-Maiusc-Enter)

Le figure rappresentano un paio di elaborazioni ottenute sui dati da te postati (vedi viewtopic.php?f=26&t=83652#p476374), per due valori di E1.
Immagine
Immagine

Ciao.
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "da Funzione a Vba (il numero più vicino a ...)":


Chi c’è in linea

Visitano il forum: Nessuno e 9 ospiti