› Excel e gli applicativi Microsoft Office › Elimina celle selezionate in una tabella
-
AutoreArticoli
-
alve a tutti ho un problema che non riesco a risolvere tramite vba dovrei elininare le celle selezionate in un tabella, naturalmente posso selezionare piu di una cella e possono essere anche non consecutive, ho inserito il codice che adesso allego, solo che nella tabella non funziona mentre se le celle da eliminare non fanno parte di ina tabella funziona. spero che qualcuno mi possa aiutare a risolvere il problema. Allego il codice e il foglio di esempio.
Sub cancellrigheSelezionateOK() 'OK
RwRng = Cells(Rows.Count, 3).End(xlUp).Row
For i = RwRng To 7 Step -1
If Cells(i, "C") = Selection Then
Cells(i, "C").EntireRow.Delete
End If
Next i
End Sub
Allegati:
You must be logged in to view attached files.Ma lo hai eseguito passo passo con F8? Fallo e ti renderai facilmente conto del perchè non funziona.
Ci sono almeno un paio di errori progettuali nel codice.
- Come esegui la selezione multipla?
- Manca Option Explicit.
- L'uso di Selection non è appropriato.
Ci riproviamo? 🙂
Crazie vecchio frac per aver risposto per quanto riguarda la selezione ci clikko dentro la cella se devo effettuare selezione multipla tengo premuto il tasto ctrl da tastiere e clikko sull'altra cella da selezionare. Per quanto riguarda Option Explicit posso provvedere. mar luso in proprio L'uso di Selection, non ho proprio idea di come posso fare.
Chiarito allora che esegui una selezione da tastiera e poi avvii la macro, ti resta da capire perchè Selection usato così dentro l'If non ti dà il risultato desiderato.
Hai eseguito il codice con F8? se non conosci questo modo di fare debug, è semplice: imposti un punto di interruzione all'inizio del codice poi lanci la macro e quando il codice si fema lo puoi eseguire un'istruzione alla volta (passo-passo) con il tasto F8. In questo modo hai il controllo totale dell'esecuzione e puoi verificare il valore che le diverse variabili assumono di volta in volta. In questa modalità ti sarà utilissima la finestra Immediata che puoi aprire con Ctrl-G nell'editor.
Esrgui dunque il codice passo-passo e ogni volta che arrivi all'If, controlla pure il valore di Selection. Scoprirai che... non cambia e quindi dovrai scrivere un codice un po' diverso per far capire a VBA quale cella deve verificare 🙂
Ciao vecchio frac sto cercando di capire dove sbaglio ed apportare le giuste modifiche, per far funzionare il codice. Spero di riuscirci.
Sono anch'io un novello, ma nello spirito di questo forum, che non è di preparare la "pappa pronta" ma di aiutare ad apprendere, a modo mio cerco di farti riflettere su come trovare la soluzione . La macro qui sotto, posto di avere una riga vuota tra quelle scritte, provvede ad eliminarla. Come vedi ho fatto una precisazione ="" quindi ...
Sub cancellrigheSelezionate2() 'OK ' questa cancella le righe vuote Dim rwRng As Integer, i As Integer rwRng = Cells(Rows.Count, 3).End(xlUp).Row For i = rwRng To 7 Step -1 If Cells(i, "C") = "" Then <<<<<<< Cells(i, "C").EntireRow.Delete End If Next i End Sub
Riflettiamo. Selezioniamo una o più celle anche non contigue (con il tasto Ctrl, giusto).
Abbiamo per VBA, quindi, un oggetto di tipo Selection composto da uno o più oggetti Cells (che sono di tipo Range, dunque l'oggetto Selection è esso stesso un oggetto Range).
Un oggetto Range espone delle proprietà (attributi) e dei metodi (funzioni o procedure).
C'è in questo oggetto un qualcosa che selezioni l'intera riga e che la possa cancellare?
Sorry, non avevo capito che era la "selezione"da cancellare . ovvero ActiveCell , giusto VF ?
Giusto per non lasciare le cose a metà = ennesima incompiuta , propongo due soluzioni :
Option Explicit Sub cancellrigheSelezionateOK() ' cancella cella selezionata nella tabella Dim rwRng As Integer, i As Integer rwRng = Cells(Rows.Count, 3).End(xlUp).Row For i = rwRng To 7 Step -1 If Cells(i, "C") = ActiveCell Then Cells(i, "C").EntireRow.Delete End If Next i End Sub Sub cancellrigheSelezionate4() ' questa cancella celle selezionate in tutto il foglio With ActiveCell .EntireRow.Delete End With End Sub
gianca53, ma le hai provate le tue soluzioni ? facendo così non aiuti Jonny ma aumenti la confusione.
Non ci possono essere più di una activecell, mentre ci possono essere pù celle selezionate.
Comunque il quesito non è banale perché eliminando una riga le selezioni si spostano, però la soluzione è semplicissima
`Sub cancella_righe_CelleSelezionate() Selection.EntireRow.Delete End Sub`
la soluzione è semplicissima
Avevo pensato anche io a questo (che è in effetti molto semplice), poi però ho guardato il file e mi sono accorto che stiamo parlando di una "tabella" Excel. Nella quale purtroppo questa istruzione non funziona (gli oggetti ListObjects sono delle bestioline un po' antipatiche).
La soluzione che ho trovato io è un'altra, e prevede di convertire la tabella in un intervallo normale, quindi eliminare la selezione (col metodo che hai indicato giustamente, visto che funziona), infine riconvertire l'intervallo in tabella.
A me funzionano con i limiti di una cella /riga x volta.
Allegati:
You must be logged in to view attached files.Mi dispiace gianca, Non funziona correttamente se selezioni più di una cella.
Infatti il codice fa sempre riferimento ad ActiveCell che non è una selezione multipla ma una cella sola.
La strada è un'altra, poiché Jonny_60 ha stabilito che può selezionare più di una cella anche non consecutive.
Provate questo codice con una selezione multipla anche discontinua:
Option Explicit Sub delete_rows_in_table() Dim t As Range Set t = ActiveSheet.ListObjects(1).Range ActiveSheet.ListObjects(1).Unlist Selection.EntireRow.Delete ActiveSheet.ListObjects.Add(xlSrcRange, t, , xlYes).Name = "Tabella1" End Sub
Gianca :"A me funzionano con i limiti di una cella /riga x volta. "
VF : " Mi dispiace gianca, Non funziona correttamente se selezioni più di una cella."
???? ?
Va be che è solo mercoledi però ...
Ah ok, avevo inteso che volessi dire che funziona come richiesto, eliminando le celle selezionate, una alla volta (invece che, magari, tutte insieme come invece fa correttamente l'istruzione
Selection.EntireRow.Delete
).Ho cercato di attenermi al quesito iniziale 🙂
ciao a tutti
ciao Jonny,
ed un saluto a VF, Patel e Gianca.
sò che l'Intento di VF non è quello di fornire la soluzione finita all'utente, ma sono un pò "arruginito"
e per come mi è venuta sarebbe stato un pò difficile spiegarla passo passo.
Mi sembra funzioni, dacci un'occhiata e fai sapere.
Allego anche il file.
edit: ho modificato il post e ne risultano allegati 2
Ciao
Frank
Option Explicit Sub elimina_righe_selezione() Dim rng As Range Dim ur As Long, n As Long, r As Long, c As Long Dim verifica() As String, selezione As String Dim contatore As Integer, sel As Integer ur = Cells(Rows.Count, "a").End(xlUp).Row uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1 contatore = 0 sel = Selection.Count selezione = Selection.Address r = 2 For r = ur To 2 Step -1 If contatore = sel Then Exit For For c = uc To 1 Step -1 verifica = Split(selezione, ",") For n = LBound(verifica) To UBound(verifica) If verifica(n) = Cells(r, c).Address Then contatore = contatore + 1 Set rng = Range(Cells(r, 1), Cells(r, 4)) rng.EntireRow.Delete shift:=xlShiftToUp End If Next n Next c Next r Set rng = Nothing End Sub
Allegati:
You must be logged in to view attached files.ciao a tutti
ciao Jonny
ed un saluto a VF Patel e Gianca.
mi è sparito il post precedente..........boh
Sò che VF non desidera di fornire soluzioni finite all'utente, ma sono un pò "arruginito" e per come mi è venuta sarebbe stato un pò difficile spiegarla passo passo ed invitarti a seguirne la logica.
Rimane sicuramente più sbrigativa la soluzione di VF di convertire la tabella in un range "standard" per poi riconvertirla in tabella, ma a titolo didattico, forse anche la macro che posto può risultare interessante.
Mi sembra funzioni, dacci un'occhiata e fai sapere.
Allego anche il file.
Ciao
Frank
Option Explicit Sub elimina_righe_selezione() Dim rng As Range Dim ur As Long, uc As Long, n As Long, r As Long, c As Long Dim verifica() As String, selezione As String Dim contatore As Integer, sel As Integer ur = Cells(Rows.Count, "a").End(xlUp).Row uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1 contatore = 0 sel = Selection.Count selezione = Selection.Address r = 2 For r = ur To 2 Step -1 If contatore = sel Then Exit For For c = uc To 1 Step -1 verifica = Split(selezione, ",") For n = LBound(verifica) To UBound(verifica) If verifica(n) = Cells(r, c).Address Then contatore = contatore + 1 Set rng = Range(Cells(r, 1), Cells(r, 4)) rng.EntireRow.Delete shift:=xlShiftToUp End If Next n Next c Next r Set rng = Nothing End Sub
Allegati:
You must be logged in to view attached files.Perfetta , con due refusi , mancava un <em>uc as long</em> e <em>shift:=xlShiftUp</em>
poi l'ho immessa nel mio " portafogli VBA delle cose da tenere " . tks
`Sub elimina_righe_selezione() Dim rng As Range Dim ur As Long, n As Long, r As Long, c As Long, uc As Long Dim verifica() As String, selezione As String Dim contatore As Integer, sel As Integer ur = Cells(Rows.Count, "a").End(xlUp).Row uc = Cells(2, Columns.Count).End(xlToLeft).Columns - 1 contatore = 0 sel = Selection.Count selezione = Selection.Address r = 2 For r = ur To 2 Step -1 If contatore = sel Then Exit For For c = uc To 1 Step -1 verifica = Split(selezione, ",") For n = LBound(verifica) To UBound(verifica) If verifica(n) = Cells(r, c).Address Then contatore = contatore + 1 Set rng = Range(Cells(r, 1), Cells(r, 4)) rng.EntireRow.Delete shift:=xlShiftUp End If Next n Next c Next r Set rng = Nothing End Sub `
ciao a tutti
ciao Giancarlo, grazie per la segnalazione:
per uc, l'ho messa nel codice che ho postato dimenticando di correggere il file
per xlShiftUp, mi sono proprio confuso con xlToLeft.
Con la tabella che ho allegato, pochissime righe, i tempi con quella suggerita da VF, sono comunque
notevoli: la mia ci impiega 3 centesimi di secondo di più
Con una tabella degna di tale nome quindi, nettamente meglio quella di VF (ciao)
ciao
Frank
Sò che VF non desidera di fornire soluzioni finite all'utente
A parte le prestazioni, che in alcuni casi è bene sacrificare rispetto alla robustezza, non voglio sempre fare la parte del cattivo 🙂 anche dare soluzioni complete va bene se l'utente dimostra di volersi applicare nello studio della soluzione proposta (a differenza di chi invece prende sempre questi forum come mezzi spiccioli per avere soluzioni a costo e tempo zero).
Quindi grazie del contributo anche se la soluzione mi sembra un po' contorta e comunque è legata agli indirizzi della tabella (se sposti la tabella non funziona o meglio devi aggiustare i riferimenti di riga)
Ma non è una critica anzi è carino come approccio! del resto, lo sai che mi piacciono tanto questi confronti 🙂
Ciao a tutti
Quindi grazie del contributo anche se la soluzione mi sembra un po' contorta e comunque è legata agli indirizzi della tabella
ciao VF,
correggimi pure se dico una fesseria, ma il fatto che la soluzione che ho proposto possa essere contorta
è totalmente soggettivo e di conseguenza opinabile anche se, vedendo la tua, capisco quanto hai voluto
dire.
Non sono d'accordo invece sulle conseguenze date dallo spostamento della tabella:
quello che nel codice chiamo "verifica", lo effettuo sull'indirizzo di una selezione effettuata prima dell'avvio della macro, e quindi la soluzione non è predisposta/pensata per una tabella, ma per una selezione di celle le cui righe verranno eliminate.
Sulle prestazioni concordo con quanto hai detto, ma le certezze non sono opinabili.
Gradirei comunque un tuo parere su quanto espresso e Ti auguro una buona domenica.
A presto
Frank
il fatto che la soluzione che ho proposto possa essere contorta
è totalmente soggettivo e di conseguenza opinabile
Giusto 🙂 si tratta di stili e tecnica di programmazione diversi, e ognuno ha i propri.
quello che nel codice chiamo "verifica", lo effettuo sull'indirizzo di una selezione
Vero! Pensa che ho anche sottolineato l'uso accorto di Split 🙂
Ho riletto le sciocchezze che ho scritto. Che dirti? avrei dovuto collegare il cervello prima di scrivere.
ciao a tutti
Giusto si tratta di stili e tecnica di programmazione diversi, e ognuno ha i propri.
ciao VF,
aggiungerei anche conoscenza e capacità' di utilizzo dello strumento: Excel.
Ho riletto le sciocchezze che ho scritto
finalmente un po' di compagnia: credevo di essere l'unica particella di acqua rimasta.
buona domenica,
Frank
-
AutoreArticoli