La consultazione del forum è libera per tutti.
Per poter porre un quesito è invece necessario essere un utente registrato (clicca qui se non lo sei).
Tutti gli utenti che richiedono un supporto, come da REGOLAMENTO, sono caldamente invitati ad allegare un file di esempio con l'indicazione di quello che si desidera ottenere.
Buongiorno a tutti, vi volevo chiedere un aiuto su un problema che non riesco a risolvere. Ho una tabella che allego in forma ridotta come esempio, e dove devo andare ad inserire un valore (tipo 0) per tutti i soggetti alla prima cella libera. Nel mio caso 0 dovrebbe essere inserito nell'intervallo F1:F5.
Grazie
Ciao @vrestu non è che sia molto chiaro ciò che chiedi. Da quel poco che ho capito (vedendo l'allegato però) sembra che tu voglia un "0" di fianco ad ogni prima cella libera. Ad esempio:
in riga 1 deve comparire in "E1"
in riga 2 deve comparire in "F2"
in riga 3 deve comparire in "C3"
in riga 4 deve comparire in "D4"
in riga 5 deve comparire in "E5"
chiaramente questo ragionamento va applicato per ogni riga compilata...giusto così?
Se così fosse prova questo codice e fammi sapere.
Option Explicit Sub Riempi_cella() Dim i As Long For i = 1 To Foglio1.Cells(Rows.Count, "A").End(xlUp).Row Foglio1.Cells(i, (Foglio1.Cells(i, 1).End(xlToRight).Column) + 1) = 0 Next i End Sub
Ciao, grazie per l'interessamento. Lo zero deve essere inserito nelle celle F1, F2, F3, F4, F5 perché nel mio intervallo l'ultima cella piena è E2. Probabilmente riflettendo sarebbe il caso di fare un ordine decrescente delle celle in base al numero di valori che porterebbe Antonio nella riga 1 e copiare magari il valore nelle celle sottostanti.
prova
Sub Riempi_cella() Dim i As Long, ucol As Long ucol = Foglio1.UsedRange.Columns.Count For i = 1 To Foglio1.Cells(Rows.Count, "A").End(xlUp).Row Foglio1.Cells(i, ucol + 1).Value = 0 Next i End Sub
Nel file allegato che è una versione ridotta con pochi nomi funziona benissimo. Lo testerò nel foglio completo e ti farò sapere.
Grazie
ciao,
l'ho capita così con i dati che iniziano da A1
Sub zeri() Dim rng As Range, c As Integer, i As Integer, r As Integer Set rng = Range("A1").CurrentRegion c = rng.Columns.Count + 1: r = rng.Rows.Count Range(Cells(1, c), Cells(r, c)) = 0 End Sub
Ciao @vrestu, una volta che hai dichiarato che la soluzione offerta da @tanimon funziona come hai richiesto, tutto mi è tornato più chiaro. In realtà avresti dovuto chiedere di "ricavare l'ultima colonna in cui è presente un valore nell'intervallo indicato nel Foglio1 per poi scrivere uno "0" di fianco a quella colonna ad ogni rigo dell'intervallo stesso."
Per quanto riguarda la soluzione, quella di @tanimon svolge egregiamente quanto richiesto ma fai attenzione che se la struttura reale è identica a quella proposta da te in allegato allora continuerà a funzionare bene. Se invece, per ragioni che non conosciamo, ti ritrovi dei dati sparsi in altre colonne e che non centrano nulla con l'intervallo (ad esempio in colonna "R" hai altri dati ed è l'ultima colonna in cui ci sia un dato sul Foglio1), questa macro scriverà lo "0" in colonna "S", non so se mi sono spiegato?
In quel caso hai bisogno di una macro strutturata in modo diverso. Qualcosa del genere:
Sub Riempi_cella() Dim i As Long, uc As Long, uc2 As Long, ur As Long ur = Foglio1.Cells(Rows.Count, "A").End(xlUp).Row uc = Foglio1.Cells(1, "A").End(xlToRight).Column For i = 1 To ur uc2 = Foglio1.Cells(i, "A").End(xlToRight).Column If uc2 > uc Then uc = uc2 Next i Foglio1.Range(Cells(1, uc + 1), Foglio1.Cells(ur, uc + 1)).Value = 0 End Sub
Qui andiamo a considerare la colonna "A" come punto di partenza. Scansioniamo ogni cella dal rigo 1 a scendere e preleviamo l'ultima colonna non vuota del rigo scansionato partendo dalla colonna "A" fintanto che le celle di fianco sono piene. Per intenderci se il rigo 1 ha "A1:D1" con valori e "G1" con un valore, il prelievo dell'ultima colonna si fermerà in "D1" perché tra "D1" e "G1" ci sono celle vuote e quindi non le considera.
Quindi per ogni rigo preleva l'ultima colonna come su descritto e la confronta con quella precedente. Se quella successiva è superiore alla precedente allora la prendiamo come riferimento come ultima colonna.
Alla fine applichiamo in un sol colpo gli "0" alla colonna interessata.
Per @tanimon (buongiorno anche a te), non so come mai la mia prima macro ti va in Debug al rigo segnalato. A me funziona e mette gli "0" di fianco a l'ultimo numero di ogni rigo. Poi va be'...non è quello che cercava l'utente ma questo è un altro discorso.
Ciao a tutti.
EDIT: non avevo notato la macro di @LukeReds, ecco onestamente tra le 2 preferisco la sua
Ciao ragazzi, vi ringrazio tutti. Testerò le vostre soluzioni nel file completo al più presto e vi aggiornerò
Buongiorno a tutti. Ho testato le soluzioni proposte e devo dire che funzionano tutte egregiamente. Avrei una domanda per @alexps81 che probabilmente ti sembrerà banale, ma non ho una conoscenza del VBA così approfondita: in base a quale parte del codice la ricerca si basa solo nella tabella di mio interesse senza andare a cercare in altre colonne come tu avevi fatto notare? "Se invece, per ragioni che non conosciamo, ti ritrovi dei dati sparsi in altre colonne e che non centrano nulla con l'intervallo (ad esempio in colonna "R" hai altri dati ed è l'ultima colonna in cui ci sia un dato sul Foglio1), questa macro scriverà lo "0" in colonna "S",".
Grazie
Ciao @vestru
nel codice:
Sub Riempi_cella() Dim i As Long, ucol As Long ucol = Foglio1.UsedRange.Columns.Count For i = 1 To Foglio1.Cells(Rows.Count, "A").End(xlUp).Row Foglio1.Cells(i, ucol + 1).Value = 0 Next i End Sub
succede che utilizzando Foglio1.UsedRange.Columns.Count stai chiedendo di restituire il numero di colonne utilizzate nel Foglio1. Perciò se ad esempio il tuo intervallo di celle che a te interessa inserire gli "0" può andare da "A1:G20" ma per qualsiasi motivo in "M1:P20" hai altri dati in quelle celle, allora Foglio1.UsedRange.Columns.Count restituirà 16 perché troverà in colonna "P" qualche dato in qualche cella.
In questo codice:
Sub zeri() Dim rng As Range, c As Integer, i As Integer, r As Integer Set rng = Range("A1").CurrentRegion c = rng.Columns.Count + 1: r = rng.Rows.Count Range(Cells(1, c), Cells(r, c)) = 0 End Sub
con Range("A1").CurrentRegion si va a definire un range che comprende tutte quelle celle che a partire da "A1" sono collegate tra loro. Ad esempio se in "A1", "B1", "C1", "D2", "F3" hai dei valori, allora grazie a Range("A1").CurrentRegion ti verrà restituito un range va comprende tutte quelle su descritte tranne "F3" perché non ha alcun collegamento con le altre celle, mentre "A1", "B1", "C1", "D2" sono confinanti tra loro.
A questo punto con c = rng.Columns.Count +1 si chiede di ricavare la somma (+ 1) delle colonne presenti appunto nel range definito con CurrentRagion
In questo codice:
Sub Riempi_cella() Dim i As Long, uc As Long, uc2 As Long, ur As Long ur = Foglio1.Cells(Rows.Count, "A").End(xlUp).Row uc = Foglio1.Cells(1, "A").End(xlToRight).Column For i = 1 To ur uc2 = Foglio1.Cells(i, "A").End(xlToRight).Column If uc2 > uc Then uc = uc2 Next i Foglio1.Range(Cells(1, uc + 1), Foglio1.Cells(ur, uc + 1)).Value = 0 End Sub
C'è un ciclo che scorre dalla prima riga fino all'ultima compilata in colonna "A" e per ogni riga preleva l'ultima colonna compilata e la confronta con l'ultima colonna compilata nella riga precedente. Se è superiore allora considera quella come ultima colonna compilata. Esegue questo confronto fino alla fine e poi applica gli "0" nella colonna giusta.