Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa
Marvel's Wolverine porta Logan in un'avventura inedita, violenta e fortemente narrativa, costruita attorno alla sua natura di combattente e al difficile rapporto con il proprio passato. Insomniac Games punta su combattimenti spettacolari, progressione e personalizzazione, inserendo l'azione in un mondo segnato dalla persecuzione dei mutanti. Un viaggio intenso, che alterna mattanza, esplorazione e momenti sorprendentemente emotivi.
DJI Romo 2: tante novità lo rendono un robot completo
DJI Romo 2: tante novità lo rendono un robot completo
Romo 2 è la seconda generazione di robot lavapavimenti di DJI, un modello che si caratterizza per la precisione nel sistema di navigazione e per il funzionamento particolarmente silenzioso. Con le modifiche introdotte in questa seconda versione, e un posizionamento di prezzo più allineato alla concorrenza, rappresenta una valida alternativa sul mercato delle soluzioni di pulizia domestica
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED
Il primo Sony con retroilluminazione True RGB alla prova del banco di misura e dei contenuti: luminanza enorme, colori accurati in HDR e un antiriflesso molto efficace. I limiti sono due sole HDMI 2.1 e il blooming fuori asse
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 23-08-2010, 18:06   #1
tanimon
Member
 
L'Avatar di tanimon
 
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.
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2010, 12:25   #2
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
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
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 24-08-2010, 15:22   #3
tanimon
Member
 
L'Avatar di tanimon
 
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
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 11:43   #4
tanimon
Member
 
L'Avatar di tanimon
 
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
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 12:52   #5
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da tanimon Guarda i messaggi
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 ?
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 13:56   #6
tanimon
Member
 
L'Avatar di tanimon
 
Iscritto dal: Nov 2007
Messaggi: 39
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:
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
lo sai vero ?
"Sembra" abbia un messaggio implicito, sbaglio????

Ciao e grazie ancora.
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 14:36   #7
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da tanimon Guarda i messaggi
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.
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 17:57   #8
tanimon
Member
 
L'Avatar di tanimon
 
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:
Originariamente inviato da MarcoGG Guarda i messaggi
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

Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
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

Ora dov'è che sbaglio???
Ciao e buona serata
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 18:44   #9
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
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
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 25-08-2010, 21:05   #10
tanimon
Member
 
L'Avatar di tanimon
 
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
tanimon è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2010, 08:28   #11
MarcoGG
Senior Member
 
L'Avatar di MarcoGG
 
Iscritto dal: Dec 2004
Messaggi: 3210
Quote:
Originariamente inviato da tanimon Guarda i messaggi
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 :

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
MarcoGG è offline   Rispondi citando il messaggio o parte di esso
Old 26-08-2010, 09:31   #12
tanimon
Member
 
L'Avatar di tanimon
 
Iscritto dal: Nov 2007
Messaggi: 39
Quote:
Originariamente inviato da MarcoGG Guarda i messaggi
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
tanimon è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Marvel's Wolverine, la recensione: Logan torna protagonista in un'avventura brutale e intensa Marvel's Wolverine, la recensione: Logan torna p...
DJI Romo 2: tante novità lo rendono un robot completo DJI Romo 2: tante novità lo rendono un ro...
Sony Bravia 9 II: il True RGB alla prova, dove l'LCD sfida l'OLED Sony Bravia 9 II: il True RGB alla prova, dove l...
Geely EX5, un mese al volante: il SUV elettrico cinese che ci ha sorpreso (quasi) senza riserve Geely EX5, un mese al volante: il SUV elettrico ...
Mova Z70 Ultra Roller Complete: motore potente, rullo di lavaggio e l'IA a guidare Mova Z70 Ultra Roller Complete: motore potente, ...
Un piccolo accessorio trasforma lo smart...
Dopo 370 anni il Cyphral Distich non è p...
Oppo Find X10, X10 Pro Max e X10 E: conf...
Dal microscopio all'IA: un cervello di i...
Cyberpunk 2077 arriverà su Battle...
Altro che divieto: interi pallet di GeFo...
QNAPTS-h966TX, il NAS per chi fa editing...
Il trucco semplicissimo per installare W...
Apple rinvia due novità di iOS 27...
Una memoria ferroelettrica raggiunge 10 ...
Honor Magic 9, Pro Max e Super Edition: ...
24 offerte Amazon da non perdere, dalla ...
Apple starebbe progettando i propri cont...
Niente borsa per OpenAI prima del 2027: ...
Meta potrebbe aver mostrato in anticipo ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 13:21.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2026, Jelsoft Enterprises Ltd.
Served by www3v