|
| HOMEPAGE | INDICE FORUM | REGOLAMENTO | ::. | NEI PREFERITI | .:: | RSS Forum | RSS News | NEWS web | NEWS software | |
| PUBBLICITA' | | | ARTICOLI | WIN XP | VISTA | WIN 7 | REGISTRI | SOFTWARE | MANUALI | RECENSIONI | LINUX | HUMOR | HARDWARE | DOWNLOAD | | | CERCA nel FORUM » | |
21-06-2007, 19.07.15 | #1 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
Excel 2000 e VBA :problema con ciclo For...Next
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ScreenUpdating = False 'si puo' anche omettere Dim CL2 As Object For Each CL2 In Worksheets(1).Range("a1:a10") If CL2.Value = [f1] Then CL2.Select 'inizio parte incriminata Else MsgBox ("valore non presente") Exit Sub 'fine parte incriminata End If Next End Sub In questa situazione pero' la macro mi da comunque il messaggio e non mi seleziona la cella anche se il valore e' presente.Se toglo la parte "incriminata" (Else...fino a.. Exit Sub) la cella viene correttamente selezionata se contiene il valore presente in f1 e non succede nulla se il valore non e' presente.A me invece serve anche che se il valore non e' presente parta il msgbox (che potrebbe essere,in base a quello che serve,anche qualche altra cosa ).Tutto qui.Spero di essermi spiegato bene.Come si puo' fare,non mi riesce . Grazie. |
22-06-2007, 10.32.50 | #2 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
nel foglio inserisci questo codice
Codice:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) trova End Sub In un modulo inserisci questo codice Codice:
Sub trova() b = "": a = "" 'azzera le variabili all'inizio a = ActiveSheet.[F1] riga = 1 Do Until Cells(riga, 1) = Empty If Cells(riga, 1).Value = a Then Cells(riga, 1).Select b = a End If riga = riga + 1 Loop If b = "" Then MsgBox "Nessuno dato trovato" End Sub
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
22-06-2007, 20.01.23 | #3 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
Si va benissimo!Grazie.
Mi sta pero' venendo in mente una cosa a cui non avevo pensato,scusami.E' possibile che nell'intervallo contenente i numeri da ricercare siano presenti delle celle vuote.In questo caso la macro non considererebbe i numeri presenti nelle celle successive alla prima cella vuota e lancerebbe,a prescindere, il msgbox. Ti andrebbe di fare un'aggiustatina alla macro in modo tale che se ne freghi delle eventuali celle vuote presenti tra il primo e l'ultimo dato dell'elenco? Grazie in ogni caso. ciao |
22-06-2007, 22.36.09 | #4 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
mi aspettavo questa richiesta
dovresti nella tua macro verificare se ci sono valori doppi, se ci sono cele vuote e ... tante altre cose ....... io farei una cosa, perchè non esponi a 360° il tuo progetto? che lo vediamo assieme. Ti dico questo per esperienza, nel senso che tu magari vedi le cose come le hai descritte nel tuo post, mentre magari puoi trovare una soluzione diversa, è solo avendo una visione chiara di tutto il progetto che puoi attingere a tante altre info. posta quello che hai bisogno e ... troveremo una soluzione ciao
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
23-06-2007, 19.35.56 | #5 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
Certo hai ragione.Facciamo prima.Ti allego il file xls.Si tratta di un file (un po farraginoso e ripetitivo nel codice) che serve a conteggiare i costi di una vecchia connessione adsl al consumo e a crearne un calendario con i relativi dettagli.
Ho lasciao solo una piccola parte del calendario a scopo indicativo. Nel foglio "Leggimi" del file allegato trovi una breve spiegazione del funzionamento del foglio e la descrizione del problema (se lo volgiamo chiamare cosi). ciao |
25-06-2007, 00.10.33 | #6 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Ho fatto qualche modifica, prova a vedere se ti và bene così.
Io non userei tante volte Set, allochi troppa memoria. PS. non mi funziona "gestione allegati" te lo metto quì http://freefilehosting.net/download/MjI5NjU0
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
25-06-2007, 23.41.23 | #7 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
ok funziona
Grazie Alex ,sono riuscito ad ottenere esattamente quello che volevo grazie alla tua ultima macro.Ho aggiunto a quella che avevo fatto un pezzo della tua (quello relativo alla variabile Alex) ed e' andata bene.
Per scaricare dalla memoria le variabili create ho spalmato alla fine un po' di Nothing...magari qualcuno anche inutile. ...,non so bene. Questo il codice finale: Codice:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) ScreenUpdating = False 'si puo' anche omettere Dim Alex As String Dim CL1 As Object Set ac = ActiveCell x = ac.Address For Each CL1 In Worksheets(2).Range("g2:g1000") If CL1.Address = x And CL1 <> "" Then Selection.End(xlToLeft).Select y = ActiveCell.Value For Each CL2 In Worksheets(3).Range("a2:a1000") If CL2.Value = y Then Sheets("Dettagli").Select CL2.Select Alex = "1" End If Next If Alex <> "1" Then MsgBox "Valore non trovato" End End If Next Set ac = Nothing Set x = Nothing Set y = Nothing End Sub |
26-06-2007, 09.37.35 | #8 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Ti dirò che io non amo molto il Set, con le istruzioni che c'erano nel modulo Alex il codice è molto più leggero
Codice:
Sub trova() Dim Alex As String Application.ScreenUpdating = False y = Cells(ActiveCell.Row, 1) Sheets("Dettagli").Activate [A2].Select ActiveCell.CurrentRegion.Select For ind = 2 To 1000 If Range("A" & ind) = y Then Range("A" & ind).Select Alex = "1" End If Next If Alex <> "1" Then MsgBox "Valore non trovato": Sheets("Foglio1").Select End Sub Codice:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) trova End Sub PS. Controlla anche la macro che hai nel modulo ThisWorkbook Codice:
Private Sub Workbook_Open() Codice:
'inserimento nuova data in Calendario ActiveCell.Offset(1, 0).Select ActiveCell.Value = Worksheets("Foglio1").Range("A9") ciao
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
26-06-2007, 21.39.55 | #9 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
Si,quell'errore all'apertura l'avevo notato .Ti dico il motivo di alcune scelte in generale.Faccio quello che sono capace a fare(non tantissimo) quindi le scelte sulle istruzioni da inserire per ottenere questo e quell'altro sono anche un po' obbligate
Per quanto riguarda la scelta di non usare per intero il "codice Alex" ma solo integrarne una parte nel vecchio codice sta principalmente nel fatto che facendo nell'altro modo (effettivamente piu' pesante) il msgbox o la selezione della cella si ottengono solo se si clicca sulle celle del Calendario con scritto "clic x dettagli" ,solo quelle,altrimenti non succede nulla.E questo era quello che volevo ottenere.Usando il "codice Alex" non si ottiene l'identica cosa.Ma questo perche' ,su questo punto, non sono stato molto chiaro io.Ma va bene cosi comunque..........va bene. Volevo piuttosto capire meglio una cosa Alex:Il codice l'ho inserito direttamente nel Worksheet (sfruttando l'evento SelectionChange) e non in mudulo senza una ragione particolare(....abitudine).Non so,c'e qualche differenza sostanziale nell'usare ,in questo caso, un modulo di classe( oppure un modulo)come hai fatto tu rispetto all'inserire il codice direttamente nel Worksheet? Anche un'altra cosa:qual'e' il motivo per cui hai usato un modulo di classe?Ho sempre usato solo i moduli e sono curioso di capire. Grazie ciao. |
27-06-2007, 23.20.06 | #10 |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Usa il codice che ti piace di più che così và bene, ognuno vede le cose sempre dal suo punto di vista
prova questo codice: nel foglio metti questo Codice:
Private Sub worksheet_selectionchange(ByVal target As Range) If Intersect(target, Range("A1:F100")) Is Nothing Then trova End Sub Poi io non ho usato un modulo di classe, ho usato un modulo semplice, se sfrutti l'evento non hai associazione con l'oggetto perchè non lo controlli, cioè se tu copi il codice del modulo Alex e lo metti in una sub sotto all'evento worksheet_selectionchange ti genera un errore, è sempre meglio sfruttare l'evento per lanciare un'altra macro, così ottieni un modulo "intercambiabile" (chiamiamolo cosi) e non più legato all'evento. mi sono spiegata .... da cani, ma penso che tu abbia capito (spero) PS. a giorni posterò nel mio blog come fare le userform, si parlerà di Oggetti Eventi e controlli e subito dopo dei moduli di classe, anche se devo dire che sono poco usati anche da programmatori avanzati, trovo molto più semplice e lineare l'uso dei moduli normali.
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
28-06-2007, 19.10.08 | #11 |
Senior Member
Registrato: 10-01-2002
Messaggi: 252
|
In riferimento al modulo di classe hai pienamente ragione:non lo hai usato...ho preso io una svista madornale,pardon...come non detto.
Mi hai dato uno spunto molto interessante:L'istruzione "If Intersect(Target, Range("A1:F100")) Is Nothing Then trova" che non conoscevo proprio e che puo' tornare molto utile.Utilizzandola e nascondendo le colonne dopo la colonna G ,come dicevi,tutto torna.Rimanevano solo,nella colonna G,sotto l'ultima cella contenente il testo "clic x dettagli", quelle celle vuote che cliccate mi attivavano inutilmente il foglio Dettagli:ho rimediato inserendo ,nel modulo Alex,un semplice If y <> "" Then appena prima di Sheets("Dettagli").Activate e chiudendo con End If prima di End Sub. Ho fatto anche un paio di ritocchi nel modulo ThisWorkbook per evitare la comparsa di errori....mi sembra che vada liscio. Ora ottengo esattamente quello che volevo sia utilizzando il codice Alex sia il remix del mio (mio+parte di Alex).Direi che la faccenda si puo' dire conclusa. ciao Alex .... grazie ps: interessante il tuo blog |
29-06-2007, 23.37.20 | #12 | |
Senior Member
WT Expert
Registrato: 19-05-2007
Loc.: Verona
Messaggi: 1.302
|
Quota:
Mi piacciono quelli che vogliono "scoprire". Invece di nascondere le colonne, prova questo codice. Codice:
Private Sub Worksheet_Activate() Sheets("Calendario").ScrollArea = "A2:G20" End Sub ciao ... alla prossima
___________________________________
- Il primo fondamento della sicurezza non e' la tecnologia, ma l'attitudine mentale - |
|
Utenti attualmente attivi che stanno leggendo questa discussione: 1 (0 utenti e 1 ospiti) | |
Strumenti discussione | |
|
|
Discussioni simili | ||||
Discussione | Autore discussione | Forum | Risposte | Ultimo messaggio |
problema con win 2000 professional | MASSIMO_78 | Windows 9x/Me/NT4/2000 | 4 | 05-05-2005 12.46.57 |
[PA+sped] Giude per Microsoft WORD e EXCEL 2000 | AlexMineo | Mercatino Usato | 0 | 13-04-2005 22.31.04 |
Problema con Excel e aggiornamento dati | ascenzo | Office suite | 1 | 27-01-2005 15.10.12 |
win 2000 problema con localhost... | luchinobgo | Windows 9x/Me/NT4/2000 | 0 | 14-02-2004 16.25.21 |
Problema tra celle excel | simon79vi | Software applicativo | 5 | 05-09-2003 18.24.09 |