› Sviluppare funzionalita su Microsoft Office con VBA › Ricerca a doppia selezione optionbutton
-
AutoreArticoli
-
P.S. Chiaramente ho eliminato la doppia selezione opt.
E' cosa buona e giusta
beh come vedi ad ogni problema ci sono N possibili soluzioni, basta trovare quella che viene meglio incontro alle nostre esigenze ed ai nostri gusti
Ciao secondo me non serve la colonna di appoggio, sempre se ho capito bene il problema (sono al cellulare e non posso vedere il tuo file):
For each mycella in mioFoglio.range("dalla prima cella all'ultima della prima colonna che ti serve scansionare") 'ho scritto solo 2 opzioni, ma puoi controllare più campi contemporaneamente If instr(1, mycella, Cognome) > 0 or instr(1, mycella.offset(0,x), Nome) > 0 then 'fai le tue considerazioni End if Next mycellaIo di solito faccio così quando devo fare ricerche a più parametri
Ciao Luca, grazie per il tuo interesse. Ti posto il codice con cui io effettuo la ricerca. Dove dovrei inserire il tuo codice?
Private Sub cmdIniziaRicerca_Click() Sheets("Dati").Select Dim ctrl As Control Dim lCampo As Long Dim lRif As Long Dim c As Range Dim rng As Range Dim lUltRiga As Long lCampo = 0 With Me With .frSelezionaCampo For Each ctrl In .Controls If ctrl.Value = True Then lCampo = Mid(ctrl.Name, _ 4, Len(ctrl.Name)) Next End With If .txtRicerca <> "" And lCampo <> 0 Then lUltRiga = sh.Range( _ "A" & Rows.Count).End(xlUp).Row Set rng = sh.Range("A2:Z" & lUltRiga) For Each c In rng.Range( _ Cells(1, lCampo), _ Cells(lUltRiga, lCampo)) If c.Value = .txtRicerca.Text Then lRif = 4 - lCampo .txtNumProg.Value = sh.Cells(c.Row, 1).Value .txtData_di_Arrivo.Value = sh.Cells(c.Row, 2).Value .txtData_di_Partenza.Value = sh.Cells(c.Row, 3).Value .txtNumero_Notti.Value = sh.Cells(c.Row, 4).Value .ComboBox1.Value = sh.Cells(c.Row, 5).Value .ComboBox2.Value = sh.Cells(c.Row, 6).Value .ComboBox7.Value = sh.Cells(c.Row, 7).Value .txtCognome.Value = sh.Cells(c.Row, 9).Value .txtNome.Value = sh.Cells(c.Row, 10).Value .txtLuogo_di_Nascita.Value = sh.Cells(c.Row, 11).Value .txtData_di_Nascita.Value = sh.Cells(c.Row, 12).Value .txtPartita_Iva.Value = sh.Cells(c.Row, 13).Value .txtTelefono.Value = sh.Cells(c.Row, 14).Value .ComboBox6.Value = sh.Cells(c.Row, 15).Value .txtResidente.Value = sh.Cells(c.Row, 16).Value .txtCap.Value = sh.Cells(c.Row, 17).Value .ComboBox3.Value = sh.Cells(c.Row, 18).Value .txtNumero_Documento.Value = sh.Cells(c.Row, 19).Value .txtLuogo_Rilascio_Documento.Value = sh.Cells(c.Row, 20).Value .ComboBox19.Value = sh.Cells(c.Row, 21).Value .txtCodice_Fiscale.Value = sh.Cells(c.Row, 22).Value .txtEmail.Value = sh.Cells(c.Row, 23).Value .ComboBox4.Value = sh.Cells(c.Row, 24).Value .ComboBox5.Value = sh.Cells(c.Row, 25).Value .txtCognome1.Value = sh.Cells(c.Row, 26).Value .txtLuogo1.Value = sh.Cells(c.Row, 27).Value .txtNascita1.Value = sh.Cells(c.Row, 28).Value .boxDocumento1.Value = sh.Cells(c.Row, 29).Value .txtRilascioDocumento1.Value = sh.Cells(c.Row, 30).Value .txtCittadinanza1.Value = sh.Cells(c.Row, 31).Value .txtNumeroDocumento1.Value = sh.Cells(c.Row, 32).Value .txtTelefono1.Value = sh.Cells(c.Row, 33).Value .txtSesso1.Value = sh.Cells(c.Row, 34).Value .txtCognome2.Value = sh.Cells(c.Row, 35).Value .txtLuogo2.Value = sh.Cells(c.Row, 36).Value .txtNascita2.Value = sh.Cells(c.Row, 37).Value .boxDocumento2.Value = sh.Cells(c.Row, 38).Value .txtRilascioDocumento2.Value = sh.Cells(c.Row, 39).Value .txtCittadinanza2.Value = sh.Cells(c.Row, 40).Value .txtNumeroDocumento2.Value = sh.Cells(c.Row, 41).Value .txtTelefono2.Value = sh.Cells(c.Row, 42).Value .txtSesso2.Value = sh.Cells(c.Row, 43).Value .txtCognome3.Value = sh.Cells(c.Row, 44).Value .txtLuogo3.Value = sh.Cells(c.Row, 45).Value .txtNascita3.Value = sh.Cells(c.Row, 46).Value .boxDocumento3.Value = sh.Cells(c.Row, 47).Value .txtRilascioDocumento3.Value = sh.Cells(c.Row, 48).Value .txtCittadinanza3.Value = sh.Cells(c.Row, 49).Value .txtNumeroDocumento3.Value = sh.Cells(c.Row, 50).Value .txtTelefono3.Value = sh.Cells(c.Row, 51).Value .txtSesso3.Value = sh.Cells(c.Row, 52).Value .txtCognome4.Value = sh.Cells(c.Row, 53).Value .txtLuogo4.Value = sh.Cells(c.Row, 54).Value .txtNascita4.Value = sh.Cells(c.Row, 55).Value .boxDocumento4.Value = sh.Cells(c.Row, 56).Value .txtRilascioDocumento4.Value = sh.Cells(c.Row, 57).Value .txtCittadinanza4.Value = sh.Cells(c.Row, 58).Value .txtNumeroDocumento4.Value = sh.Cells(c.Row, 59).Value .txtTelefono4.Value = sh.Cells(c.Row, 60).Value .txtSesso4.Value = sh.Cells(c.Row, 61).Value .txtCognome5.Value = sh.Cells(c.Row, 62).Value .txtLuogo5.Value = sh.Cells(c.Row, 63).Value .txtNascita5.Value = sh.Cells(c.Row, 64).Value .boxDocumento5.Value = sh.Cells(c.Row, 65).Value .txtRilascioDocumento5.Value = sh.Cells(c.Row, 66).Value .txtCittadinanza5.Value = sh.Cells(c.Row, 67).Value .txtNumeroDocumento5.Value = sh.Cells(c.Row, 68).Value .txtTelefono5.Value = sh.Cells(c.Row, 69).Value .txtSesso5.Value = sh.Cells(c.Row, 70).Value .txtCognome6.Value = sh.Cells(c.Row, 71).Value .txtLuogo6.Value = sh.Cells(c.Row, 72).Value .txtNascita6.Value = sh.Cells(c.Row, 73).Value .boxDocumento6.Value = sh.Cells(c.Row, 74).Value .txtNumeroDocumento6.Value = sh.Cells(c.Row, 75).Value .txtRilascioDocumento6.Value = sh.Cells(c.Row, 76).Value .txtCittadinanza6.Value = sh.Cells(c.Row, 77).Value .txtTelefono6.Value = sh.Cells(c.Row, 78).Value .txtSesso6.Value = sh.Cells(c.Row, 79).Value .txtCognome7.Value = sh.Cells(c.Row, 80).Value .txtLuogo7.Value = sh.Cells(c.Row, 81).Value .txtNascita7.Value = sh.Cells(c.Row, 82).Value .boxDocumento7.Value = sh.Cells(c.Row, 83).Value .txtNumeroDocumento7.Value = sh.Cells(c.Row, 84).Value .txtRilascioDocumento7.Value = sh.Cells(c.Row, 85).Value .txtCittadinanza7.Value = sh.Cells(c.Row, 86).Value .txtTelefono7.Value = sh.Cells(c.Row, 87).Value .txtSesso7.Value = sh.Cells(c.Row, 88).Value .boxSorgente_Prenotazione.Value = sh.Cells(c.Row, 89).Value .txtNumPrenotazione.Value = sh.Cells(c.Row, 99).Value lRigaAttiva = c.Row lRigaValoreTrovato = c.Row Exit For End If Next Else MsgBox "Nessun dato è stato inserito o nessun metodo di ricerca è stato selezionato." & Chr(13) _ & "" & Chr(13) & "", vbExclamation, "ATTENZIONE..." End If End With Set ctrl = Nothing Set c = Nothing Set rng = Nothing End SubNon ti offendere, ma è veramente caotico! Secondo me hai sbagliato l'impostazione del progetto.
Crea una classe ad hoc, incapsula le varie proprietà e crea dei metodi di lettura, salvataggio e modifica.
Poi nel form di ricerca ti basta avere una combobox per i vari filtri ed una textbox dove inserisci i paramentri per come ti ho scritto sopra. Tutto più fluido, più leggibile (anche per una tua lettura successiva), metti i commenti a quello che fai (per ricordare) e molto più elegante e funzionale.
Da dove salta fuori l'oggetto "sh" ? non ti dà errore il codice? se sei già nel form perchè referenzi tutto con Me ? A cosa servono lRigaAttiva e lRigaTrovato che non vengono mai utilizzati nel codice?
Crea una classe ad hoc
Eh ma stai volando un po' alto anche tu però
Eh ma stai volando un po' alto anche tu però
io ho fatto così nel gestionale che sto scrivendo per il mio amico, una goduria!!!
Pulito, elegante e soprattutto funzionale
Pulito, elegante e soprattutto funzionale
Non potrei essere più d'accordo.
Non potrei essere più d'accordo.

Mi sto... Mi sto... Mi sto emozionando
il boss che si complimenta con
grazie Frac (msg privato... cmq resti il numero 1
)Buongiorno LucaSR,
Non ti offendere, ma è veramente caotico! Secondo me hai sbagliato l'impostazione del progetto.
Non vedo perchè dovrei offendermi se ho detto che il VBA lo conosco quasi niente, altrimenti non sarei qui a chiedere il vostro aiuto.
Il "progetto" è nato trovando in rete dei codici che si avvicinassero alle mie esigenze, da qui la costruzione di un progetto, sicuramente un progetto fatto male, però ho iniziato a fare qualcosa.
Poi nel form di ricerca ti basta avere una combobox per i vari filtri ed una textbox dove inserisci i paramentri per come ti ho scritto sopra. Tutto più fluido, più leggibile (anche per una tua lettura successiva), metti i commenti a quello che fai (per ricordare) e molto più elegante e funzionale. Come detto prima non sarei capace di eliminare le optionbutton ed inserire una scelta tramite combobox.
Detto questo, sembra che tutto funzioni sia nelle registrazioni dei record , sia nella ricerca cliente. Ho allegato un file prova.
Se tu hai altre soluzioni (non dimenticando che sono alle prime armi), rendendo ancora più fluido e più leggibile, mi piacerebbe, se tu lo volessi, seguirti passo passo.
Grazie comunque per il tuo tempo a me dedicato.
Buongiorno Vecchio Frac,
Da dove salta fuori l'oggetto "sh" ? non ti dà errore il codice? se sei già nel form perchè referenzi tutto con Me ? A cosa servono lRigaAttiva e lRigaTrovato che non vengono mai utilizzati nel codice?
Iniziando da "sh" non saprei risponderti per la mia pochissima conoscenza del VBA, credo di averlo trovati così.
Il codice lo trovato in rete e con le mie difficoltà del VBA, ho cercato di modificarne parte del codice madre, con copia ed incolla di porzioni di altri codici sempre trovati in rete.(un minestrone).Per quanto riguarda gli Errori, ti dico che non me ne da. Se avrai notato "sh" si trova anche all'inizio del codice del Form e te le ripoto qui.
In cima a "GENERALE" cè questo:Option Explicit
Private sh As Worksheet
Private lUltRiga As Long
Private lRigaAttiva As Long
Private lNuovoID As Long
Private sRicercaDato As String
Private sRicercaCampo As String
Private lRigaValoreTrovato As Longe poi tutto il resto del codice.
Per quanto riguarda il "me" ho visto un video su YouTube, dove consigliava (correggimi se sbaglio) di inserirlo per non creare eventuali conflitti qual ora ci fossero altri Form. Nel mio caso ci sono altri Form.
Se non è così e vuoi spiegarmi sarò lieto di seguirti.Mentre per la "lRigaAttiva" una volta alimentato il Form con
Private Sub Alimenta_Form(ByVal riga As Long), credo che serva a scorrere i record tramite i 4 pulsanti: Primo, Avanti, Indietro e Ultimo, che trovi in alto a DX del Form.Mentre per "lRigaValoreTrovato" credo che serva per far funzionare i pulsanti riportato nel menù in basso a dx per la ricerca avanzata.
Di più non so dire.
Grazie mille per il tuo intervento.
Ciao gli darei volentieri uno sguardo, ma purtroppo per inconvenienti tecnici sono senza Office da un paio di settimane
cmq sicuramente ci sarà chi ti potrà aiutare e chi già ti ha aiutato.Forse dopo Natale ritornerò attivo.
Dal codice che hai postato (quando ti ho detto di non offenderti) si capiva che era una sorta di accoglienza presa qua e la. Il progetto che hai messo su è bello grosso, almeno da quello che ho visto. Più il progetto è grosso, più è importante fermarsi ed organizzarsi bene prima, per non perdersi strada facendo.
Grazie comunque per il tuo tempo a me dedicato.
Grazie molto gentile, quando è possibile, si ci aiuta e si impara gli uni dagli altri. Tanti punti dì vista ti fanno capire che non esiste una soluzione soltanto ma ne esistono diverse, tante quante sono i partecipanti.
Grazie LucaSR per i tuoi consigli, vedremo di migliorare nel mio interesse e di tanti altri che seguono questo forum molto interessante.
Con l'occasione di salutarti nuovamente, ti auguro un sereno Buon Natale. Auguri...
Per quanto riguarda referenziare il form con ME, hai letto bene non serve se hai solamente un form ma c'è un grosso MA.
Se per caso, dopo settimana o mesi di stesura del codice (dipende dal tempo libero e dalla conoscenza di base che si ha a riguardo) decidessi di inserirne un altro? Ti toccherebbe riprendere il vecchio codice e cambiare tutti i riferimenti, altro tempo che si accumula.
Detto questo, piu il progetto è grosso e più le cose vanno distribuite, per non rendere tutto troppo caotico. Ricorda sempre, più è semplice da vedere più è semplice da gestire (o quasi... dipende).
Poi magari, adesso lo usi tu che sai come funziona, poi tra un po' di tempo inizierebbe ad usarlo un tuo collaboratore e li ci sarebbe l'inghippo
LucaSR,
Onestamente non vedo tutta questa difficoltà ad usare il file in questione. Una volta imparato saranno poi sempre le stesse cose. Sarà usato da me e da 2/3 collaboratori. Tieni presente che i file allegato è una parte dell'intero progetto. Nel MultiPage ad esempio ci sono altre pagine che fanno; calcoli, note, richieste, genera ricevute, eccc......
Comunque non allontanandoci dall'oggetto della discussione, migliorare e trovare altre soluzioni (da gente che sa il fatto suo), credo sia l'interesse prioritario di ogni forum. Correggimi se sbaglio.
Hai perfettamente ragione! Chiedo venia e ti offro una
e ricambio gli auguri
Caspita che linee di codice inutili per popolare Textbox, Combobox e Celle nel foglio!!!
Giusto per farti notare che con una buona base di partenza del foglio e i relativi oggetti, puoi sostituire tutto quel codice riferito alla ricerca con questo:
Private Sub cmdIniziaRicerca_Click() Dim ws As Worksheet Dim ctrl As Control Dim c As Range Dim ricerca As Range Dim sRicerca As String Dim lUltRiga As Long, lultColonna As Long Dim i As Integer Set ws = Sheets("Dati") If txtRicerca <> "" Then lUltRiga = ws.Range("A" & Rows.Count).End(xlUp).Row lultColonna = ws.Cells(1, Columns.Count).End(xlToLeft).Column sRicerca = Replace("A2:A%i, B2:B%i, C2:C%i, O2:O%i, P2:P%i, U2:U%i, Z2:Z%i, W2:W%i", "%i", lUltRiga) Set ricerca = ws.Range(sRicerca) For Each c In ricerca If c.Text = txtRicerca.Text Then For Each ctrl In Me.Controls For i = 1 To lultColonna Controls("txt" & i) = Cells(c.Row, i) Next i Next ctrl Exit For End If Next Else MsgBox "Nessun dato è stato inserito o nessun metodo di ricerca è stato selezionato.", vbExclamation, "ATTENZIONE..." End If Set ctrl = Nothing: Set c = Nothing: Set ricerca = Nothing: Set ws = Nothing End Sube si può fare di meglio sicuramente. Ovviamente questo è solo per la ricerca. Poi va tutto adattato al tuo progetto...ma da quello che vedo non è difficile. Basta sostituire tanti spezzoni con cicli For Each...Next e For....Next
Cmq con un po' di tempo si può sistemare un po'.
Cmq tornando al tuo problema...io lo imposterei in modo un po' diverso. Secondo me bisogna fare che scrivi nella txtRicerca e se trova una sula corrispondenza allora recupera i dati nelle textbox relative, altrimenti se ci sono più occorrenza allora deve comparire una ListBox con tutti i nominativi uguali. Poi in base a chi ti serve, lo selezioni e riporti i dati nelle textbox.
Nel senso....io capisco che tu voglia fare una ricerca approfondita con Cognome Nome, ma se ci sono 4 nominativi con lo stesso Cognome Nome che fai? Premi su mostra prossimo per 4 volte? Secondo me è anche poco professionale così. Meglio una ListBox che raccoglie tutti i nominativi uguali e poi la relativa selezione di quello che ti interessa.
Grazie Alex per il tuo prezioso contributo che proverò certamente fra poco. Infatti pensavo ed sono convinto che si possa fare di meglio.
Infatti mi aspettavo qualche suggerimento da Vecchio Frac.
Comunque ti farò sapere.
proverò certamente fra poco.
No no non provare che non funzionerà mai sul tuo progetto. Bisogna modificare la struttura del tuo Foglio (cosa che ho fatto io per provare il mio codice).
No no non provare che non funzionerà mai sul tuo progetto. Bisogna modificare la struttura del tuo Foglio (cosa che ho fatto io per provare il mio codice).
Infatti ho provato ma non funziona. Da dove devo iniziare per per modificare la struttura? Io mi so perso.
Tieni presente che da pochissimo che sto usando il VBA. Per la verità avevo iniziato un pò di tempo fa, quando mi sono iscritto al forum. Poi però notando le mie difficoltà, lo avevo accantonato.
Vedendo però in giro è davvero utile. Si può costruire davvero cose molto belle. Da qui e da poco tempo ho iniziato ad usarlo nuovamente, ma è dura ragazzi per chi come me è alle prime armi e non ha le basi.
Comunque grazie
ma è dura ragazzi per chi come me è alle prime armi e non ha le basi.
Alle prime armi ci siamo stati tutti e le basi se non si hanno si costruiscono (e nella vita nulla è facile) occorre impegno e studio.
Se mi consenti l'unica tua "colpa" (passami il termine) è di aver iniziato con una cosa che era al di fuori della tua portata.
Se avessi iniziato con qualcosa di pìù semplice magari saresti riuscito.
Quando si vuole costruire un'applicazione (anche quelle di Excel con VBA lo sono) prima di mettere mano al codice bisogna avere ben chiaro quello che si vuole fare stendendo su carta le varie fasi del progetto cercando di individuare eventuali "falle" nel processo logico.
Una volta che si è ragionevolmente certi di questo si può passare alla stesura del codice avendo sempre presente che, passami la metafora, se se stai costruendo un palazzo e a due terzi ti accorgi che hai commesso un errore nelle fondamenta molte alternative non ne hai devi buttare giù il palazzo e ricostruirlo daccapo.
Queste mie parole non devono demoralizzarti ma devono esserti di sprone.
-
AutoreArticoli
