› Excel e gli applicativi Microsoft Office › Range(Selection, Selection.End(xlDown)).Select non funziona correttamente
-
AutoreArticoli
-
Ciao a tutti, io voglio selezionare e poi cancellare un prospetto o meglio le colonne C e D. Il secondo rigo del codice che vedete dovrebbe selezionare tutte le righe "piene", quindi nel mio caso si dovrebbe fermare alla riga 40 essendo 40 le righe piene. A volte fa esattamente cosi, altre volte seleziona le due colonne dalla riga 10 fino alla riga 1048576 ovvero fino alla fine, cancellandomi alcuni appunti che sotto le 40 righe. Perchè? Vi è una soluzione più sicura che selezioni solo le righe piene? Occhio non ditemi di selezione io le righe fino a 40 perchè queste righe a volte sono 40 a volte 41 etc. Grazie.
Range("C10:D10").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContentsprova cosi:
Foglio1.Range("c10").CurrentRegion.Cleardel foglio1
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 )albatros54 grazie per la risposta ma quel comando mi cancella TUTTO IL FOGLIO, tutte le colonne. Azzera tutto.
spiega meglio lo scenario
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 )Scusami ma cosa c'è da spiegare, il tuo codice cancella tutto il foglio dalla riga 10 in giù. Il mio codice postato su dovrebbe selezionare le colonne C e D dalla riga 10 fino all'ultima riga piena. E lo fa, lo fa spesso. Però a volte anzichè fermarsi all'ultima riga piena seleziona le due colonne fino in fondo all'ultima riga di excel. Questo mi crea problemi perchè sotto il foglio io scrivo degli appunti e quando succede (diciamo 1 volta su 4) mi cancella tutto. Io sto facendo l'esempio con le colonne C e D ma in realtà sono una decina le colonne che devo cancellare. Ed il problema si verifica su tutte le colonne per questo i miei appunti spariscono.
La soluzione c'è.... basta fargli contare le righe presenti e fargli selezionare e cancellare dalla riga 10 alla riga X (il numero di righe presenti + 10 -1). Ma è una soluzione bruttina... non capisco perchè l'istruzione:
Range(Selection, Selection.End(xlDown)).Select non funzioni correttamente.
prova cosi:
trova l'ultima riga della colonna C che contiene un dato cosi
finalrow = Cells(Rows.Count, 3).End(xlUp).Row
Range("C10:D" & finalrow).Select
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 )Buon pomeriggio a Tutti.
Buon pomeriggio M.Polo;
hai provato a:
1) Selezionare le Colonne "C" e "D"
2) Funzione "F5"
3) Speciale
4) Selezionare Costanti o Formule (dipende dal contenuto delle Celle)
5) Togliere il segno di "Spunta" (Flag) da eventuali voci che non vuoi selezionare
6) OK
7) Comando "Cancella"A disposizione.
Buon fine settimana a Tutti
Giuseppe
albatros54, è la stessa cosa che ho detto io nell'ultimo post... e certamente funziona perchè gli viene dato l'inizio e la fine delle righe da cancellare. Ma è una soluzione bruttina. Detto che non capisco perchè Selection.End(xlDown) non funzioni correttamente, vorrei capire se esiste un'istruzione alternativa che funzioni.
Buon pomeriggio a te GiuseppeMN, ma tu stai parlando di excel non di vba. Oppure io non ho capito.
Sto parlando di Excel senza disturbare VBA.
Se è essenziale utilizzare VBA potresti provare con:
Option ExplicitApplication.ScreenUpdating = FalseSub Cancella_CD()Columns("C:D").SelectSelection.SpecialCells(xlCellTypeConstants, 23).SelectSelection.ClearContentsRange("C1").SelectApplication.ScreenUpdating = TrueEnd SubCredo che l'unico problema sia che, in questo modo, si cancellano anche eventuali "Intestazioni"; quindi dovresti utilizzare una o due Variabili nelle quali salvare temporaneamente il Valore delle intestazioni e da utilizzare, alla fine del Ciclo per ripristinare le "Intestazioni".
Giuseppe
Ho appena corretto il Codice VBA aggiungendo le istruzioni "Application.ScreenUpdating"
M.Paolo ha scritto:
Range("C10:D10").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.ClearContentsnon capisco perchè l'istruzione:
Range(Selection, Selection.End(xlDown)).Select non funzioni correttamente.Le tre istruzioni selezionano le due celle C10 e D10 mantenendo la cella attiva su C10. Poi la selezione viene estesa da C10 in giù fino alla prima cella occupata (anche da una eventuale formula, e pure se questa dà risultato vuoto). Se da C10 in giù non c'è niente, viene raggiunta la fine del foglio.
La soluzione che vede qual è l'ultima riga non è "bruttina", cosa vuol dire poi?, solo che non è l'unica (l'esempio di Giuseppe lo dimostra). E' una soluzione perfettamente valida e funzionante come le altre.
Prova anche questa, se vuoi.
range(Range("C10:D10"),Cells(Rows.Count, 3).End(xlUp)).ClearContentsNon sono d'accordo la selezione C10 e D10 è l'inizio delle righe da cancellare, Range(Selection, Selection.End(xlDown)) dovrebbe selezionare da C10 e D10 fino all'ultima riga "piena" non fino alla prima (sarà un tuo errore di battitura) che siano formule o dati. Cosa che fa quasi sempre, ogni tanto però anzichè fermarsi alle righe piene va giù fino all'ultima riga di excel. Perchè il 90% delle volte funziona ed il 10% delle volte va fino in fondo? E' questo che non capisco, poi di soluzione come abbiamo detto un pò tutti c'è ne sono tante.
range(Range("C10:D10"),Cells(Rows.Count, 3).End(xlUp)).ClearContents
Questa formula cancella oltre il numero di righe piene esattamente come la mia.
Non sono d'accordo
Su cosa non concordi? Che quando selezioni C10 e D10 la cella C10 è quella attiva? prova.
Poi, è sempre dalla cella attiva che Excel estende la selezione. Con il codice che hai mostrato la selezione si ferma alla prima cella non vuota che incontra in colonna C, dopo la cella C10. Non ho fatto errori di battitura 🙂
dovrebbe selezionare da C10 e D10 fino all'ultima riga "piena"
Ecco, il pezzo di codice che ho mostrato fa questo.
Questa formula cancella oltre il numero di righe piene esattamente come la mia.
Sì, se in colonna C non ci sono altri dati oltre C10.
Allega il file altrimenti non ne usciamo vivi 🙂
vecchio frac ho scritto non sono d'accordo perchè hai scritto che da c10 si va giù fino alla PRIMA cella occupata, Si va fino all'ULTIMA cella occupata. Sul resto ovviamente concordo. Utilizzerò quella che io ho definito soluzione bruttina, è la più sicura e la meno soggetta ad errori. Mi rimane il dubbio che lasciando inalterate le colonne la soluzione Range(Selection, Selection.End(xlDown)).Select che dovrebbe essere quella più corretta, a volte non funziona. Eppure non cambio una virgola. Provo 5-6-7 -8 volte e prima o poi va giù fino a fine foglio. Ribadisco utilizzerò la formula "bruttina" come io l'ho definita. Grazie a tutti per gli interventi. Se qualcuno sa spiegarmi perchè la formula corretta a volte non va gliene sarei grato, altrimenti per me si può chiudere qui. Grazie di nuovo a tutti.
Buona sera a Tutti.
Ordunque, mi ero fermato sulla richiesta in #39303:... voglio selezionare e poi cancellare un prospetto o meglio le colonne C e D ...
Poi qualifiche F1 e quindi stop.
Mi sembra che la richiesta iniziale sia stata modificata in:... la selezione C10 e D10 è l'inizio delle righe da cancellare ...
A questo punto proverei con:
Option ExplicitSub Cancella_pg()Application.ScreenUpdating = FalseDim NRc As LongDim Max As IntegerNRc = Cells(Rows.Count, "C").End(xlUp).RowMax = NRcNRc = Cells(Rows.Count, "D").End(xlUp).RowIf NRc > Max Then Max = NRcRange(Cells(10, 3), Cells(Max, 4)).ClearContentsApplication.ScreenUpdating = TrueCells(2, 3).SelectEnd SubA disposizione.
Buona serata a Tutti.
Buon fine settimana a Tutti.
Giuseppe
Ma si GiuseppeMN di soluzioni c'è ne sono tante, ma quella mia iniziale risolve tutto con un rigo (in teoria), poi però funziona a fasi alterne. Ripeto il foglio è pieno non ci sono celle vuote. Io non modifico niente. Provo varie volte e dopo un certo numero di prove ecco che anziche selezionare fino alla fine delle righe piene (come deve fare), seleziona le colonne fino alla fine del foglio ovvero fino alla riga 1048576. Perchè? E' questo che non capisco. Voi mi avete proposto tante soluzioni ma io la soluzione l'avevo già ed anche più di una, ma non capivo e non capisco perchè questa istruzione ogni tanto da i numeri. L'unica è che ci sia un bug su quella istruzione. Ringrazio te GiuseppeMN e tutti gli altri intervenuti. Saluti.
Perchè? E' questo che non capisco
Sicuramente perché in colonna C non ci sono altri dati dopo C10. Siccome la cella attiva rimane su C10, è su questa colonna che agisce il comando di estensione della selezione partendo dal fondo del foglio fino alla prima cella occupata.
L'ultima soluzione di Giuseppe, che ha centrato il punto, può essere resa più compatta così:
i = Cells(Rows.Count, 3).End(xlUp).Row j = Cells(Rows.Count, 4).End(xlUp).Row i = -((i > j) * i + (i < j) * j) Range(Range("C10"), Cells(i, "D")).Select 'ClearContentsQuesto seleziona (o cancella, metti l'istruzione che vuoi) l'intervallo tra C10:D10 fino a Cn:Dn dove n è la riga compilata di C o D, quella maggiore (non ho usato Application.Max volutamente altrimenti l'ambaradan booleano per calcolare i era più semplice).
Buongiorno a tutti, lasciate stare la notte porta consiglio. L'istruzione è corretta, ho sbagliato io nelle priorità del codice. Esiste nel codice (è molto lungo ed a volte mi ci perdo), un imput che chiede che tipo di tabellone vuoi creare, se inserisci una lettera sbagliata ti avverte dell'errore ed esce dalla routine. Peccato che io l'abbia messo per sbaglio un rigo dopo la cancellazione delle prime due colonne. Quindi quando sbagliavo per provare di fatto C e D venivano cancellate, mentre il resto delle colonne da cancellare restava intatto ed io non mi accorgevo di nulla. Sono colonne strette non mi accorgevo che le aveva cancellate, quindi al successivo comando essendo vuota la colonna C ed essendo come dice il saggio vecchio frac la casella su cui agisce il comando di estensione ecco che finiva in fondo al foglio e cancellava i miei appunti. E' bastato invertire le due righe sopra/sotto ed il problema non esiste più. Non era l'istruzione a non funzionare ma la mia vista ed il mio codice. Chiedo scusa a tutti se vi ho fatto perdere tempo, però abbiamo o almeno ho imparato qualche formula nuova. Vi prego scusatemi e buona domenica a tutti.
Grazie del feedback. Non è mai una perdita di tempo quando ci si sforza di capire come vanno le cose
-
AutoreArticoli
