|
Domanda.
nome=Giuseppe
cognome=Di Leo
versione=2000
conosco2=medio
vba=SI
email=olepin@libero.it
chr=1000
problema=Ciao Ennius Grazie per il tuo prezioso lavoro che è di notevole
aiuto per noi meno esperti.
Mi rivolgo ancora alla tua cortesia per risolvere un problema.
In un foglio le celle (G4:H2003) contengono dei numeri, le celle I
(I4:I2003) contengono una stringa.
L'area G4:G2003 è stata formattata con l'istruzione Range(G4:G2003).NumberFormat
= "00000" L'area H4:H2003 è stata formattata con l'istruzione Range(h4:h2003).NumberFormat
= "000"
Ho lo necessità di sostituire la stringa contenuta in una cella della
colonna "I" indicando i corrispondenti valori delle colonne "G" e "H".
Consultando la tua rubrica ho adattato la routine contenuta
nell'articolo "Realizzazione di un database"
Poiché i dati della colonna "G" sono spesse volte ripetuti, ho iniziato la
ricerca dalla colonna "H" e dopo aver verificato che il dato della
colonna "G" corrisponde a quello desiderato, dovrei sostituire il dato
della colonna "I. Cerco di spiegarmi meglio:
Devo , ad esempio, sostituire il valore "pieno" con il valore "vuoto"
del buono "00452"(colonna G) "025" (colonna H). Poiché, come ho già detto,
il valore della colonna "G" può essere ripetuto molte volte ho
ritenuto utile cercare prima il valore della colonna "H" e poi
verificare che quello della "G" sia quello
desiderato. Purtroppo, però, non riesco ad ottenere il risultato voluto. La
routine individua esattamente il valore della colonna "H" ma poi non
trova quello della colonna "G".
Non so se il problema dipende dalla particolare formattazione delle colonne
G e H ma, purtroppo, non posso modificarla, i dati devono essere
lasciati in questo formato e ricercati nella stessa forma.
Ti riporto la routine perché tu possa individuare il mio errore.
Sub prova()
line1:
SerBloc = InputBox("Inserire la serie del blocchetto da annullare")
If SerBloc < 0 Or SerBloc > 99999 Then
MsgBox "Inserire un numero compreso fra 00000 e 99999", 48, "MESSAGGIO"
GoTo line1
End If
line2:
SerTick = InputBox("Inserire la serie del buono da annullare")
If SerTick < 0 Or SerTick > 999 Then
MsgBox "Inserire un numero compreso fra 000 e 999", 48, "MESSAGGIO"
GoTo line2
End If
Sheets("Ticket").Select
Dim CL As Object
For Each CL In Range("h4:h2003")
x = SerTick
If CL = x Then
CL.Select
CL.Offset(0, -1).Select
If CL.Offset(0, -1).Value = SerBloc Then
'QUESTA IF
'NON VIENE MAI ATTIVATA
risposta = MsgBox("Trovato buono " _
& SerBloc & SerTick _
& ". Confermi sostituzione?", vbYesNo)
End If
If risposta = vbYes Then
CL.Offset(0, 1).Value = "vuoto"
Exit For
End If
End If
Next CL
MsgBox ("Buono non trovato") 'DOVE DEVO
COLLOCARE QUESTA ISTRUZIONE
End Sub
Spero di essere stato chiaro e ti ringrazio anticipatamente
Cordiali saluti.
Risposta.
salve Giuseppe, temo che una parte del tuo progetto non funzionerà mai: che
tu imposti i NumberFormat non serve a far sì che excel vba riconosca come
numeri con lo zero davanti i valori che scrivi nelle celle. Lo zero davanti
ad un numero excel lo accetta solo se il formato celle è impostato a
"Testo", (a parte i decimali) che ti consiglio di impostare manualmente,
altrimenti il vba "vede" i numeri reperiti con le inputbox diversi da come
sono sul foglio. La tua routine mancava del doppio controllo: se x = pippo E
SerBlox = pluto, allora.... , capito? Nella tua lunga spiegazione credo di
aver capito questo: vuoi controllare se serbloc (chiave univoca) E x (chiave
multipla) (ma insieme si verificano una sola volta, giusto?) sono presenti,
in quel caso scrivi "vuoto" ed esci.
........
Dim CL As Object
For Each CL In Range("h4:h2003")
x = SerTick
If CL.Value = CStr(x) And CL.Offset(0, -1).Value = CStr(SerBloc) Then
CL.Select 'basta questo per fermarsi alla riga
risposta = MsgBox("Trovato buono " _
& SerBloc & SerTick _
& ". Confermi sostituzione?", vbYesNo)
If risposta = vbYes Then
CL.Offset(0, 1).Value = "vuoto"
End If
Exit Sub 'qui devi mettere di uscire dalla
routine, non dal ciclo
End If
Next CL
MsgBox ("Buono non trovato") 'va bene qui, che
ti appare se la coppia valori non è stata trovata
End Sub
Fammi sapere, ciao, ennius
|