|
|||||||
|
|
|
![]() |
|
|
Strumenti |
|
|
#1 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
macro VB
Buon giorno a tutti,
sono certo che qlc di Voi saprà darmi una soluzione, ecco il problema su questa macro di VB: esegue tutti gli "IF" compilati tranne quello con il carattere "-" (meno, trattino, chiamatelo come volete, è quello vicino allo schift dx) o meglio gli esegue se clicco + volte sul "controllo modulo" (bottone) a cui è assegnata. Notare che l'ultimo IF, pur contenendo il "carattere" incriminato, viene eseguito al primo click!!! ecco la macro: Sub colonna() Dim r As Integer, c As Integer c = 1 For r = 10 To 200 If InStr(1, (Cells(r, c)), "------------------", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "---------------", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "-", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "1 1005 STAMPA MOV", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "AFJRWO1 001 AFRWO", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "A1PBWO2 001", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "C.R.O.", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "TOTALE MESSAGGI", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "C.R.O.", vbTextCompare) Then Rows(r).Delete End If If InStr(1, (Cells(r, c)), "- * * * F I N E T", vbTextCompare) Then Rows(r).Delete End If Next End Sub ed ecco la colonna che deve "pulire" 1 1005 STAMPA MOV ------------------ AFJRWO1 001 AFRWO A1PBWO2 001 ------------------ C.R.O. --------------- 23105971806 46881832501 46881833006 46881832602 46881832703 46881832804 46881832905 46881639104 ----------------- TOTALE MESSAGGI ----------------- - - - - - - - - - - - - * * * F I N E T Grazie in anticipo a tutti. |
|
|
|
|
|
#2 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Se usi un ciclo, all'interno del quale è prevista l'eliminazione di alcune righe, è ovvio che dopo l'eliminazione di una riga all'indice [x], quella sotto [x+1] ne prende il posto ( se lo shift è up ), col risultato che alla prossima iterazione il ciclo salterà una riga.
Per operazioni di questo genere sarebbe meglio "marcare" in un primo ciclo le celle interessate per l'eliminazione ( ad esempio con la proprietà ID del Range ), e in un secondo ciclo eliminare le righe corrispondenti : Codice:
Dim R As Range
For Each R In Range("A:A")
If R.Text = "" Then Exit For
'Condizioni
If InStr(1, R.Text, "------------------", vbTextCompare) Then R.ID = "X"
If InStr(1, R.Text, "---------------", vbTextCompare) Then R.ID = "X"
'...
'...
Next R
For Each R In Range("A:A")
If R.Text = "" Then Exit For
If R.ID = "X" Then Rows(R.Row).Delete
Next R
|
|
|
|
|
|
#3 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
Ciao Marco,
grazie per la risposta! In questo momento sono in ufficio e stasera rientro un pò tardi. Appena posso, provo e ti faccio sapere! Grazie ancora per l'attenzione. Ciao |
|
|
|
|
|
#4 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
Ciao Marco,
ho provato ad applicare quanto mi hai consigliato, ma siccome in fatto di compilazione non sono ancora arrivato neanche alle stanghe ovviamente non ci sono riuscito. ho cmq "risolto" creando una nuova macro a mezzo mouse, nella quale quella mal funzionante, viene eseguita tante volte quante quelle necessarie alla pulizia della colonna. Ti ringrazio comunque per la riposta, forse quando avrò finito la prima elementare di VB, ci capirò un pò di più. Ciao |
|
|
|
|
|
#5 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
|
|
|
|
|
|
#6 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
|
|
|
|
|
|
#7 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Per usare il mio codice basta che completi con tutte le tue condizioni dove io ho messo i puntini (...) nel primo ciclo For. Ad esempio aggiungi un semplice CommandButton sullo stesso Foglio in cui c'è la colonna da pulire e associ il mio codice al Click. Non è niente di difficile. |
|
|
|
|
|
|
#8 | ||
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
Ciao Marco,
piccolo aggiornamento: il Command Button con il tuo codice funziona! Però come la macro ad inizio discussione. Mi spiego Quote:
Quote:
Situazione attuale: con Command Button a cui è associato il codice Private Sub CommandButton1_Click() Dim R As Range For Each R In Range("A:A") If R.Text = "" Then Exit For 'Condizioni If InStr(1, R.Text, "1 1005 STAMPA MOV", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "------------------", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "AFJRWO1 001 AFRWO", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "A1PBWO2 001", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "------------------", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "C.R.O.", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "---------------", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "------------------", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "TOTALE MESSAGGI", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "------------------", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "-", vbTextCompare) Then R.ID = "X" If InStr(1, R.Text, "- * * * F I N E T", vbTextCompare) Then R.ID = "X" Next R For Each R In Range("A:A") If R.Text = "" Then Exit For If R.ID = "X" Then Rows(R.Row).Delete Next R End Sub affinchè in "A:A" restino solo celle con numeri, necessitano 4 click sul Command Button Ora dov'è che sbaglio??? Ciao e buona serata |
||
|
|
|
|
|
#9 |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
"Affinchè restino solo celle con numeri" salta fuori solo adesso.
Non mi ero addentrato in quei filtri, perciò ho suggerito quella soluzione. Se lo dicevi prima non c'era alcun bisogno di tutto quel codice ( tra l'altro credo di aver sbagliato qualcosa pure nel mio, data la fretta... ).Tra l'altro hai ripetuto n volte alcune condizioni identiche, il che è ovviamente superfluo... Basta un IsNumeric() sul testo cella : Codice:
Dim R As Range
For Each R In Range("A:A")
If R.Text = "" Then Exit For
'Condizione
If IsNumeric(R.Text) = False Then
R.ID = "X"
Else
R.ID = ""
End If
Next R
Dim indice As Long
indice = 0
Do
indice = indice + 1
If Range("A" & indice).Text = "" Then Exit Do
If Range("A" & indice).ID = "X" Then
Rows(indice).Delete
indice = indice - 1
End If
Loop
|
|
|
|
|
|
#10 |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
Ciao Marco,
sei un Genio! Questo codice è perfetto: fa esattamente quello che chiedevo! Se non necessita troppo tempo, avrei un'ultima necessità: Il codice che mi hai appena passato, come sappiamo elimina le righe che non contengono numeri, e quindi con l'utilizzo eliminerà anche il Command Button e quindi: se lo posiziono sul foglio 2 come gli dico di "lavorare" sulla colonna "A" del foglio 1? Ad intuito mi viene con un Select ad inizio Sub, ma con quale sintassi ed in quale riga della Sub? Se chiedo troppo non preoccuparti: sei stato già fin troppo paziente e di parecchia utilità e comunque, mi sembra giusto a questo punto, spiegarti per cosa mi serve tutto questo! In ufficio ricevo giornalmente dall'esterno due files in formato Excell diversi tra loro che hanno quantità di righe variabile dove nella colonna "A" del primo sono presenti gli stessi dati della colonna "D" del secondo, con la differenza che la colonna "A" è "sporca" di dati non necessari. La mission è confrontare che nelle due colonne siano presenti gli stessi dati! Attualmente in un terzo file con una macro, diciamo di riepilogo, che esegue in sequenza i comandi per aprire i due files, pulire la colonna A del primo, ordinare le colonne dei due files in ordine crescente copiare le due colonne ed incollarle su questo terzo file, diciamo in colonna "B" e "D", ho inserito in colonna "C" un SE di questo tipo: SE((B:B)=(D: D) ;VERO) evidenziando lo sfondo del risultato "FALSO" con la formattazione condizionale. Se hai notato i numeri da confrontare sono composti da 11 cifre e questa macro, oltre ad evitarmi una mezz'ora di lavoro manuale, mi evita anche di dovere cambiare gli occhiali fra qualche mese. Ancora grazie 1000 |
|
|
|
|
|
#11 | |
|
Senior Member
Iscritto dal: Dec 2004
Messaggi: 3210
|
Quote:
Formato controllo / proprietà / "non spostare nè ridimensionare con le celle". Adesso il pulsante non si sposterà più, ignorando tutto quello che succede "sotto di lui". 2. Basta aggiungere riferimenti espliciti al Foglio e si può lanciare il precedente codice da qualsiasi routine VBA : Codice:
Dim R As Range
For Each R In Sheets("Foglio1").Range("A:A")
If R.Text = "" Then Exit For
'Condizione
If IsNumeric(R.Text) = False Then
R.ID = "X"
Else
R.ID = ""
End If
Next R
Dim indice As Long
indice = 0
Do
indice = indice + 1
If Sheets("Foglio1").Range("A" & indice).Text = "" Then Exit Do
If Sheets("Foglio1").Range("A" & indice).ID = "X" Then
Sheets("Foglio1").Rows(indice).Delete
indice = indice - 1
End If
Loop
|
|
|
|
|
|
|
#12 | |
|
Member
Iscritto dal: Nov 2007
Messaggi: 39
|
Quote:
Per il codice aggiornato, che dire......., grazie ancora. Avrai notato che raggiungere il risultato finale è un pò laborioso a causa dell'estrapolazione ed elaborazione delle 2 colonne dei 2 files. Ma grazie a te sono già arrivato ad un buon risultato. Ciao |
|
|
|
|
|
| Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 15:59.












).








