View Full Version : 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.
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 :
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
;)
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
Ciao Marco,
ho provato ad applicare quanto mi hai consigliato, ma siccome in fatto di
compilazione non sono ancora arrivato neanche alle stanghe :mc: ,
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:)
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.
Beh, è una pessima soluzione, lo sai vero ? :O
Ciao Marco,
che sia una pessima soluzione in quanto NON scritta in codice, è fuori dubbio!:)
Dato che in effetti non lo so, mi mette più paura questo:
lo sai vero ? :O
"Sembra" abbia un messaggio implicito, sbaglio????
Ciao e grazie ancora.:)
Ciao Marco,
che sia una pessima soluzione in quanto NON scritta in codice, è fuori dubbio!:)
No, è comunque una pessima soluzione, anche se l'avessi messa giù da codice.
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.
Ciao Marco,
piccolo aggiornamento:
il Command Button con il tuo codice funziona!
Però come la macro ad inizio discussione. Mi spiego
Per usare il mio codice basta che completi con tutte le tue condizioni dove io ho messo i puntini (...) nel primo ciclo For.
che i puntini stessero per tutti gli altri "test" da eseguire, (poca roba) ma l'avevo intuito :D
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.
questo purtroppo non lo avevo capito ed io non applicavo il tuo codice ad un Command Button (Controllo ActiveX) ma ad un Pulsante (Controllo Modulo).
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:muro:
Ora dov'è che sbaglio???
Ciao e buona serata
"Affinchè restino solo celle con numeri" salta fuori solo adesso. :doh: :D
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... :fagiano: ).
Tra l'altro hai ripetuto n volte alcune condizioni identiche, il che è ovviamente superfluo...
Basta un IsNumeric() sul testo cella :
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
;)
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
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?
1. No, il CommandButton va creato dalla toolbar dei controlli VBA, NON associato ad una cella. In tal modo basta andare nelle proprietà del controllo :
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 :
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
;)
1. No, il CommandButton va creato dalla toolbar dei controlli VBA, NON associato ad una cella.
In effetti ho fatto così! Forse mi sono spiegato male.
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:D
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.