› Sviluppare funzionalita su Microsoft Office con VBA › Trasformare una formula cerca vert da excel in vba
-
AutoreArticoli
-
La formula in Excel è la seguente "=SE(AD52= Foglio1!$A$26;Foglio1!$A$26; CERCA.VERT(AD52;Foglio1!$A$14:$B$25;2;FALSO))"
Tramite codice vba devo visualizzare in una cella (Esempio cella G5 del Foglio3) il risultato della formula sopra indicata.
I valori sono da ricercarsi in un Excel esterno chiamato LV. Nella colonna AD del foglio LV dell' excel esterno ho dei valori numerici (Da 1 a 12) oppure una X, se la colonna AD ha come valore X nella cella visualizzo X.
Se nella cella vi è però un numero da 1 a 12 nella cella AE devo visualizzare il mese corrispondente 1 -- > JAN; 2 --> FEB..... 12 --> DEC.
Nel foglio di lavoro nel quale è contenuto il foglio LV ho un altro foglio: Foglio1 all' interno del quale ho una tabella nel range "A14:B25" dove da A14 ad A25 ho i numeri 1,2,3...,11,12 e in B14-B25 ho JAN,FEB...NOV,DEC.
CIao
Ho scritto la seguente function che dovrebbe fare quanto la tua formula.
Function MioValore() DimCellaW If Range("AD2").Value = Sheets("Foglio1").Range("A26") Then MioValore = Sheets("Foglio1").Range("A26") Else MioValore = "Errore" For Each cellaW In Sheets("Foglio1").Range("A14", "B25") If cellaW.Value = Range("AD2").Value Then MioValore = cellaW.Offset(0, 1).Value Exit For End If Next End If End Function
Fammi sapere
Ciao
Luca
<em class="bbp-the-quote-cite">Luca73 wrote:CIao
Vorrei farlo con una macro senza usare le funzioni se si può.
In questo caso mi da un errore perche CellaW non è definita
<em class="bbp-the-quote-cite">Luca73 wrote:DOve vuoi scrivere il valore?
In una cella qualsiasi di un foglio esterno ad esempio foglio3 cella "G5"
Ecco
la macro scrive il valore in A1
Dim CellaW As Range Dim CellaVal As Range Set CellaVal = Range("A1") If Range("AD2").Value = Sheets("Foglio1").Range("A26") Then CellaVal = Sheets("Foglio1").Range("A26") Else CellaVal = "Errore" For Each CellaW In Sheets("Foglio1").Range("A14", "B25") If CellaW.Value = Range("AD2").Value Then CellaVal = CellaW.Offset(0, 1).Value Exit For End If Next End If End Sub
<em class="bbp-the-quote-cite">Luca73 wrote:Ecco
Mi restituisce errore in A1
<em class="bbp-the-quote-cite">Luca73 wrote:Ecco
Dovrebbe restituire x se trova x e da JAN a DEC se trova 1,2,3 ecc
perchè non alleghi i file, semplificheresti la vita 😀
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Forse ma ripeto forse così funziona
come ti dice albatros (Ciao) no file = no test
Dim CellaW As Range Dim CellaVal As Range Set CellaVal = Range("A1") If Range("AD2").Value = Sheets("Foglio1").Range("A26") Then CellaVal.Formula = Sheets("Foglio1").Range("A26") Else CellaVal.Formula = "Errore" For Each CellaW In Sheets("Foglio1").Range("A14", "B25") If CellaW.Value = Range("AD2").Value Then CellaVal.Formula = CellaW.Offset(0, 1).Value Exit For End If Next End If End Sub
Espresso90 wrote:una macro senza usare le funzioni
E' un paradosso 🙂
Comunque non c'era già una discussione sullo stesso argomento?
Ecco in allegato un file di esempio.
I valori sono da ricercarsi nel foglio Excel chiamato LV. Nella colonna AD del foglio LV dell' excel ho dei valori numerici (Da 1 a 12) oppure una X, se la colonna AD ha come valore X nella cella visualizzo X.
Il risultato deve essere visualizzato in un altro workbook in un foglio esempio foglio3.
Se nella cella vi è un numero da 1 a 12 nella cella risultante devo visualizzare il mese corrispondente 1 -- > JAN; 2 --> FEB..... 12 --> DEC.
Nel foglio di lavoro nel quale è contenuto il foglio LV ho un altro foglio: Foglio1 all' interno del quale ho una tabella nel range "A14:B25" dove da A14 ad A25 ho i numeri 1,2,3...,11,12 e in B14-B25 ho JAN,FEB...NOV,DEC.
Io suppongo si debba fare con un ciclo for, oppure con tanti if.
Allegati:
You must be logged in to view attached files.vecchio frac wrote:Comunque non c'era già una discussione sullo stesso argomento?
che sembra si stata risolto 🙄
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )<em class="bbp-the-quote-cite">vecchio frac wrote:
<em class="bbp-the-quote-cite">Espresso90 wrote:una macro senza usare le funzioni
Non penso, cioè avevo chiesto una cosa simile ma non questo, se non sbaglio l' altra macro doveva contare le volte che erano presenti Yes e Jan in una serie di intervalli, qua chiedo di fare una ricerca e nel caso si trovi un 1 venga restituito JAN
Espresso90 wrote:Se nella cella vi è un numero da 1 a 12 nella cella risultante devo visualizzare il mese corrispondente 1 -- > JAN; 2 --> FEB..... 12 --> DEC.
😯
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )Espresso90 wrote: venga restituito JAN
Dove?
Qual è il punto di avere gusti diversi, se non mostrare che i cervelli lavorano diversamente, che pensiamo diversamente? ( Alan Turing)
Sempre il mare, uomo libero, amerai!
( Charles Baudelaire )<em class="bbp-the-quote-cite">albatros54 wrote:
<em class="bbp-the-quote-cite">Espresso90 wrote: venga restituito JAN
In un foglio excel esterno già aperto. Esempio foglio3
Ciao
Dare tutte le informazioni subito no!!!
Se il risultato è su un'altro workbook allora tutto diventa un po' più complesso.
In quale workbook vuoi la macro?
Quali sono i percorsi?
Perchè non usare una function?
perche non usare una formula?
Per Passare da 1,2,3. a Jan, Feb,.... non scomoderei nè macro nè function ma solo formule banali tipo
=MAIUSC(TESTO(DATA(2018;XX;1);"[$-en-EN]mmm"))
dove XX è la tua cella contenente il numero del mase
oppure un =SCEGLI,....
Luca73 wrote:non scomoderei nè macro nè function ma solo formule banali
Penso che lui abbia comunque bisogno di VBA per accedere (aprire, leggere) comodamente a file esterni, quindi comunque una cosa semplice con Choose fa al caso suo.
choose(index, "JAN", "FEB","MAR", "etc.")
Per il resto quoto le osservazioni di Luca 😀
Che tra parentesi la sintassi con [$-en-EN] non la sapevo e googlando ho trovato una miriade di formati di localizzazione che coprono praticamente ogni linguaggio.
Luca73 wrote:non scomoderei nè macro nè function ma solo formule banali
Avete ragione entrambi però il problema è che questa è la punta dell' iceberg e dietro ce un lavoro molto più complesso, per questo chiedevo di utilizzare una macro in vba.
Comunque dopo un po di tentativi ho risolto in questo modo:
Sub Macro15() Dim ae As String Dim result1 As String Windows("ECA Layout Validation_v01- PAUL KPI CALCULATION.xlsx").Activate Sheets("LV").Select 'Range("A1").SpecialCells(xlCellTypeLastCell).Select ae = Range("AD52").Value If ae = "X" Then result1 = "X" ElseIf ae = "1" Then result1 = "JAN" ElseIf ae = "2" Then result1 = "FEB" ElseIf ae = "3" Then result1 = "MAR" ElseIf ae = "4" Then result1 = "APR" ElseIf ae = "5" Then result1 = "MAY" ElseIf ae = "6" Then result1 = "JUN" ElseIf ae = "7" Then result1 = "JUL" ElseIf ae = "8" Then result1 = "AUG" ElseIf ae = "9" Then result1 = "SEP" ElseIf ae = "10" Then result1 = "OCT" ElseIf ae = "11" Then result1 = "NOV" Else ae = "12" result1 = "DEC" End If Windows("Layout Validation.xlsm").Activate Range("F5").Value = result1 End Sub
Per rispondere a Luca la macro mi serve nel workbook finale, non in quello da cui vado a leggere i dati.
Se qualcuno ha idee su come rendere più smart il codice ben venga. Ho risolto questo ma adesso vorrei utilizzare le SpecialCells per poter leggere interamente il foglio dove vado a leggere i dati, sapresti indicarmi come si usa il metodo SpecialCells?
Ciao invece di usare una serie di if ...
in questo caso un SELECT CASE...
(vedi L'help)
oppure ti crei un array e ne selezioni con la variabile diretta...
Ciao
Luca
Esempio con Array....
Sub prova() Dim Mese(1 To 12) Mese = Array("JAN", "FEB", "MAR",....) Range("F5").Value = Mese(Range("AD52").Value) End Sub
<em class="bbp-the-quote-cite">Luca73 wrote:Esempio con Array....
Grazie Luca, questo è molto più smart del mio.
Scusate se disturbo nuovamente, ho questo codice:
Sub Macro4()
Dim l As String
Dim result3 As String
Windows("ECA Layout Validation_v01- PAUL KPI CALCULATION.xlsx").Activate
Sheets("LV").Select
l = Range("L3").Value
If l = "N/A" Then
result3 = "N/A"
ElseIf l <> "N/A" And l > "01/01/2017" Then
'And p > #1/1/2017# Then
result3 = "YES"
ElseIf l <> "N/A" And l < "01/01/2017" Then
result3 = "NO"
End If
Windows("Layout Validation.xlsm").Activate
Range("C5").Value = result3
End Sub
vorrei utilizzare un ciclo for prima dell' if in modo da poter utilizzare il metodo specialcells, in modo tale che l' operazione che viene fatta sulla riga 3 della colonna L venga fatta automaticamente per tutte le celle della colonna L.
-
AutoreArticoli