› Sviluppare funzionalita su Microsoft Office con VBA › Trasformare una formula cerca vert da excel in vba
-
AutoreArticoli
-
Io non uso mai specialcells
Io farei un ciclo del tipo
Dim CellaW For Each CellaW in Range("L3", Range("L3").end(xltoright)) ' qui la variabile CellaW diventa uno per uno tutte le celle da L3 fino all'ltima occupata alla sua destra Next CellaWPerché parli di Specialcells? Non ne vedo traccia in questo codice.
Comunque: provaci e vediamo.
Implementa un ciclo For Each per ogni cella del range che ti interessa, al cui interno infili il codice che deve essere eseguito ad ogni passaggio.
Battuto da Luca sul tempo 😛
Cercavo di far ragionare il nostro amico.
<em class="bbp-the-quote-cite">Luca73 wrote:Io non uso mai specialcells
Vero forse così è addirittura più smart rispetto al metodo specialcells.
L' unica cosa è che mi viene restituito un unico valore invece io vorrei che mi vengano restituiti tutti i valori di ogni singola cella. Se non sono stato chiaro ditemi pure.
Ciao
punto 1) senza avere un file e sapre come è fatto, darti suggerimenti è come cercare di sparare ad un orso bendati....(bello l'esempio???)
Punto 2) come è fatto il tuo range che vuoi esaminare? sono tutte celle piene? ci sono celle vuote? ci sono celle unite? ci sono numeri, ci sono formule,.....?
Sapere quanto sopra fa modificare il codce con cui selezioni un intervallo:
Puoi selezionare un intervallo dando la prima el'ultima cella, oppure la prima e andare a destra fino alla'ultima occupata oppure la prima cella e andare a cercare l'ultima della raga che non sia vuota, la prima cella e poi un numero fisso (o variabile di celle a detra),....
Ogni range avrà il suo metodo migliore di selezione.
Inoltre a seconda di quello che devi fare può convenire usare un for each e far "scorrere le celle" oppure usare una singola cella e un offset, oppure un ciclo do .... loop.
Allega il tuo file o una copia semplificata che sia significativa di come è fatto e senza dati sensibili e spiega in dettaglio cosa vuoi fare.
Inoltre non ho capito qual'è il tuo livello con il VBA, non mi sembra di aver letto analisi legate al fatto che hai fatto un debug passo-passo dei codici proposti.
Tu scrivi
L' unica cosa è che mi viene restituito un unico valore
cosa vuol dire, come ti viene restituito?
Ciao
Luca
<em class="bbp-the-quote-cite">Luca73 wrote:Ciao
1) bell' esempio ahah
2) ti allego un file fac-simile
Anticipo il fatto che il risultato deve essere visualizzato in un' altro foglio excel e che le celle nel file test hanno soltanto il valore e non la formula(come nel file originale). Il codice vba deve andare a leggere cella per cella i valori che trova in questo file e copiarli nel file excel di output.
Quando dico che mi viene restituito un unico valore vuol dire che quando lancio la macro nel foglio di output mi compare un unico valore (che può essere yes, no o n/a)
Il mio livello di vba è molto basso, sono alle prime armi, ci lavoro da 4-5 giorni, chiedo scusa per errori e per "l' ignoranza" e ti ringrazio della disponibilità.
Allegati:
You must be logged in to view attached files.Ciao Nel file che hai allegato
sulla riga 3 della colonna L venga fatta automaticamente per tutte le celle della colonna L.
C'è occupata solo ala cella AB3 cosa ti serve un ciclo?
<em class="bbp-the-quote-cite">Luca73 wrote:
Nel foglio di lavoro LV deve essere letta cella per cella tutta la colonna AB e i valori devono essere scritti uno ad uno in un altro foglio excel sempre in colonna.
Ma perche scrivi una cosa se poi ne vuoi un'altra?
Sub Prova2() Dim CellaW For each cellaW in Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select 'qui tue operazioni su cella W Next End Sub<em class="bbp-the-quote-cite">Luca73 wrote:Ma perche scrivi una cosa se poi ne vuoi un'altra?
Scusami quando avrei fatto una richiesta diversa?
Comunque mi viene segnalato un errore di Run-Time '13': Tipo non corrispondente. --->Riga : For Each CellaW In Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select
Sub Macro4() ' colonna AB test Dim l As String Dim result3 As String Const START_ROW = 2 ' Riga di inizio della tabella Windows("ECA Layout Validation_v01- PAUL KPI CALCULATION.xlsx").Activate Sheets("LV").Select For intI = START_ROW + 2 To Sheets("LV").Cells.SpecialCells(xlLastCell).Row Step 1 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 Next Windows("Layout Validation.xlsm").Activate Range("C5").Value = result3 End SubPenso di essere riuscito nel mio intento, ho comunque ancora il problema che non riesco a scrivere tutti i risultati del ciclo for, in output ho solo un valore che mi viene visualizzato in C5.
Espresso90 wrote: di Run-Time '13': Tipo non corrispondente. --->Riga : For Each CellaW In Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select
il ciclo "For each..." lavora su di una classe di oggetti, "Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select" per VBA non è una classe object, prova a modificare il codice cosi
`Sub Prova2() Dim CellaW set rng = Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select For each cellaW in rng 'qui tue operazioni su cella W Next End Sub`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: di Run-Time '13': Tipo non corrispondente. --->Riga : For Each CellaW In Range(Range("AB1"), Range("AB1").Offset(Rows.Count - 1, 0).End(xlUp)).Select
Sub Macro4() ' colonna AB test Dim l As String Dim result3 As String Const START_ROW = 2 ' Riga di inizio della tabella Windows("ECA Layout Validation_v01- PAUL KPI CALCULATION.xlsx").Activate Sheets("LV").Select For intI = START_ROW + 2 To Sheets("LV").Cells.SpecialCells(xlLastCell).Row Step 1 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 Next Windows("Layout Validation.xlsm").Activate Range("C5").Value = result3 End SubScusami Albatros, con questo codice son riuscito a risolvere in parte il problema, quello che adesso non riesco a fare è quello di fargli stampare in colonna tutti i valori delle celle che va a leggere in AB
Ho cercato di capire il tuo algoritmo,e l'ho modificato cosi.Non avendo i vari file non l'ho potuto testare, provalo e testalo.
Sub Macro4() ' colonna AB test Dim l As String Dim result3 As String Const START_ROW = 2 ' Riga di inizio della tabella Dim wkeca As Workbook Dim shlv As Worksheet Dim wklayout As Workbook Set wkeca = Windows("ECA Layout Validation_v01- PAUL KPI CALCULATION.xlsx").Activate Set whlv = wkeca.Sheets("LV") Set wklayout = Windows("Layout Validation.xlsm") Set Rng = whlv.Cells.SpecialCells(xlLastCell).Row For Each cl In Rng If cl = "N/A" Then result3 = "N/A" ElseIf cl <> "N/A" And cl > "01/01/2017" Then 'And p > #1/1/2017# Then result3 = "YES" ElseIf cl <> "N/A" And cl < "01/01/2017" Then result3 = "NO" End If righacl = cl.Row colonnacl = cl.Column wklayout.Cells(righacl, colonnacl) = result3 Next End SubQual è 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:Ho cercato di capire il tuo algoritmo,e l'ho modificato cosi.Non avendo i vari file non l'ho potuto testare, provalo e testalo.
Error 424 necessario un oggetto.
Espresso90 wrote:Error 424 necessario un oggetto.
in quale riga del codice.
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 )Scusate, ho chiuso il post, ma va terminato:
Set Rng = whlv.Cells.SpecialCells(xlLastCell).Row"Row" restituisce un numero lungo e quindi non va assegnato con un Set perchè un numero in VBA non è un oggetto (in senso tecnico).
Set Rng = whlv.Cells.SpecialCells(xlLastCell).Rowrestituisce un numero lungo e quindi non va assegnato con un Set perchè un numero in VBA non è un oggetto (in senso tecnico).
Mi sono lasciato prendere la mano, ma non avendo nessun file dove testare...ho bucato 😳
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 )Niente ragazzi non riesco a farlo funzionare 😥
Grazie comunque del supporto.
Espresso90 wrote:Niente ragazzi non riesco a farlo funzionare
Secondo me , il problema lo possiamo risolvere , solo ci devi mettere nelle condizioni di avere lo scenario completo,con i file (senza dati sensibili),dove poter testare il codice, è sapere con certezza cosa tu vuoi ottenere.
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:Niente ragazzi non riesco a farlo funzionare
Se vuoi l' unica cosa che mi viene in mente è di passarti il tutto tramite e-mail, compreso di dati e spiegarti bene tutto quello che la macro deve andare ad eseguire.
Espresso90 wrote:Se vuoi l' unica cosa che mi viene in mente è di passarti il tutto tramite e-mail, compreso di dati e spiegarti bene tutto quello che la macro deve andare ad eseguire.
non funziona cosi, perchè il tuo problema verrebbe circoscritto solamente tra te e me, cerca invece di spiegare , magari allegando un file di word o txt, lo scenrio, è descrivere passo passo quello che la macro dovrebbe fare, come se lo dovessi spiegare tua nonna, perche se tu riesci a farla comprendere a tua nonna, il problema è risolto.Poi allega i due file dove la macro deve girare.Se i file superano i 4Mb cerca di zipparli, altrimenti li posti in un server,tipo dropbox, è alleghi il link dove scaricare.
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 ) -
AutoreArticoli
