Scheda con Userform



  • Scheda con Userform
    di Fabio (utente non iscritto) data: 17/09/2014 16:42:15

    Buongiorno a tutti,
    ho un file con diverse anagrafiche (una per riga) con i relativi dati in diverse colonne (vedi foglio ELENCO file allegato).
    Pensavo di crearmi una maschera che, una volta selezionata la riga interessata, mi visualizzasse i dati presenti (tipo foglio SCHEDA del file allegato).
    Inoltre, ma non so se è possibile, mi servirebbe poter modificare o aggiungere i dati tramite la suddetta maschera.
    Faccio un esempio per spiegarmi meglio:
    - Seleziono la riga 3 dove è presente il cliente ALBA
    - clicco su un pulsante che mi apre la maschera con i dati presenti
    - modifico o intergro i dati e confermo.
    - memorizzo i dati modificati o inseriti nel fogli ELENCO.
    Purtroppo non conosco la funzione Userform.
    Qualcuno può aiutarmi????
    Grazie mille



  • di Lucas87 data: 17/09/2014 17:00:46

    Ciao
    Vuoi un esempio per capire come funzionano i form e crearlo come più ti piace o vuoi avere già tutto fatto?



  • di Fabio (utente non iscritto) data: 17/09/2014 17:17:57

    mi piace imparare e quindi anche un esempio che mi aiuti a crearla può andare bene.
    Però mi serve anche capire modificare e inserire i dati.
    Grazie



  • di alfrimpa (utente non iscritto) data: 17/09/2014 18:58:03

    La cosa che chiedi non è di immediata realizzazione e non solo perché la scheda che è nel file allegato è piuttosto complessa ma perché, successivamente, si dovrà scrivere tutto il codice VBA per eseguire tutte le operazioni da te descritte (ed anche alcune diciamo così "di servizio" tipo cancellazione dati o altro".

    I consiglierei di iniziare a provare tu a costruire una Userform (la cosa non è complicata) andando nell'Editor di VBA, scegli Inserisci, Userform e ti si aprirà una finestra dove potrai inserire tutti in controlli necessari come: etichette, caselle di testo, pulsanti di comando e quant'altro in modo da riprodurre più o meno la scheda del file.

    Magari documentati un po' con l''Help di Excel e soprattutto con ricerche in rete (se hai voglia di imparare (e studiare perché di questo si tratta) vedrai che riuscirai nel tuo intento.

    Ripeto la cosa più complessa sarà scrivere il codice soprattutto se sei a digiuno o alle prime armi con il VBA.

    Quando avrai realizzato qualcosa riproponila sul forum e sicuramente troverai molti che saranno in grado di aiutarti (e tra questi spero di esserci anch'io )

    Alfredo





  • di Lucas87 data: 17/09/2014 19:08:09

    Ciao
    Ho creato un file di esempio. Inserire dati - Lucas87.xlsm
    Ora non ti resta che adattarlo al tuo foglio.
    Ci sono molte proprietà che potresti impostare: colori, numero di caratteri da poter inserire,...
    Ci sarebbe poi tutta la parte per verificare se i valori inseriti sono validi.
    Usando l'help o cercando in rete puoi vedere queste proprietà e capire a cosa servono.



  • di Fabio (utente non iscritto) data: 17/09/2014 20:30:02

    Ciao Lucas87, innanzitutto grazie.
    Ho iniziato ad aggiungere le caselle di testo all'userform che hai creato.
    Prima di proseguire, riesci a spiegarmi come si crea il collegamento tra la casella di testo e la cella dove verrà inserito il valore (Nome, Cognome ecc.) ?
    Grazie



  • di Lucas87 data: 17/09/2014 20:45:57

    Scusa mi sono dimenticati di spiegarti il concetto alla base del codice.
    Il ciclo for each passa in rassegna tutti gli elementi del form e se si tratta di caselle di testo va a scrivere sulla colonna indicata dalla variabile "c", poi con c=c+1 si passa alla colonna successiva.
    L'ordine con cui i vari elementi vengono esaminati dipende dall'ordine con cui vengono creati. Di conseguenza la terza casella di testo andrà a leggere/scrivere sulla terza colonna.
    Dovrai stare attento a rispettare l'ordine delle colonne nella creazione delle caselle di testo.
    Per fare in fretta ti consiglio di creare la prima, di selezionarla e, tenendo premuto il tasto "Ctrl", trascinandola ne creerai una copia.



  • di Fabio (utente non iscritto) data: 18/09/2014 00:18:09

    grazie Lucas 87.
    Penso di aver capito il funzionamento della macro che legge e inserisce i dati.
    Ho iniziato a creare una userform con tutti i campi che mi servono.
    Sicuramente avrò bisogno di altri chiarimenti e consigli.



  • di Lucas87 data: 18/09/2014 11:22:55

    Tra le discussioni puoi trovare quella con titolo "elenco con finestra"
    Quello che chiedete è la stessa cosa. La differenza sta nel metodo si selezione del nominativo: tu lo selezioni, nell'altro caso viene cercato



  • di Fabio (utente non iscritto) data: 18/09/2014 19:52:11

    Ciao Lucas87, come "promesso" sono di nuovo a chiedrti un aiuto.
    Creando la userform, ho inserit una Casella Combinata ma non riesco a capire come collegarla alle celle dei dati.
    Ho cercato anche tramite google ma non ho trovato nulla che mi aiuti.
    Grazie



  • di alfrimpa (utente non iscritto) data: 18/09/2014 20:17:34

    Ciao

    Devi impostare da codice la proprietà RowSource della ComboBox così:

    Userform1.Controls("Combobox1").RowSource= "Foglio1!A1:A10" oppure

    Userform1.Combobox1.RowSource= "Foglio1!A1:A10".

    Detto codice va inserito in una sub denominata Userform1_Initialize (ma su questo chiedo il conforto di Lucas87 molto più esperto di me).

    Alfredo





  • di Fabio (utente non iscritto) data: 18/09/2014 20:40:29

    Ciao Alfredo e grazie.
    avevo letto su internet più o meno le indicazioni che mi hai dato, ma non riesco ad a farlo funzionare (sono alle prime armi con VBA).
    Non capisco che va inserito nella sub della Userform o se in una sub separata.
    Grazie



  • di alfrimpa (utente non iscritto) data: 18/09/2014 23:38:06

    Ciao Fabio

    Come avevo detto prima il codice credo vada inserito sull'evento Initalize della Userform.

    Vai nell'editor di VBA; nella finestra progetto (a sinistra) seleziona la userform.

    Nella finestra a destra in alto dovresti vedere a sinistra Userform1 e a destra c'è una casella a discesa con tutti gli eventi e scegli Initialize.

    Quando lo avrai fatto più in basso dovrebbe comparire;

    Sub Userform1_Initialize()
    End sub

    Ora tra queste due righe dovresti inserire il codice.

    Però sto andando a memoria per cui potrei sbagliare qualcosa quindi attendiamo il parere di Lucas87 (o di altri) per sicurezza.

    Sto,scrivendo con l'iPad quindi non ho Excel sottomano per essere più preciso.

    Anni pazienza

    Alfredo






  • di alfrimpa (utente non iscritto) data: 18/09/2014 23:43:01

    Poi per far comparire la maschera hai bisogno di un'altra macro messa in un modulo tipo questa

    Sub MostraMaschera()
    Userform1.Show
    End Sub

    Spero di non aver detto cavolate (anche nel precedente messaggio)

    Alfredo





  • di Lucas87 data: 19/09/2014 08:42:05

    Ciao
    Con "collegarla alle celle dei dati" cosa intendi?
    Cosa vorresti fare?



  • di alfrimpa (utente non iscritto) data: 19/09/2014 08:54:16

    @ Lucas87

    "Come collegarla alle celle dei dati" penso che intenda come riempire la combo con dati provenienti da un foglio.

    @ Fabio

    Un modo più semplice per riempire una combo con dati presenti su foglio (senza utilizzare codice) è andare nell'editor di vba, visualizzare la user form e selezionare la combobox.

    Poi nella finestra delle proprietà (si trova in basso a sinistratroverai la proprietà RowSource ed a fianco scrivi il range che ti interessa es. Foglio1!a1:a10

    Non so perché ma ieri non sono riuscito a farlo (non so cosa sbagliavo).

    Alfredo





  • di Lucas87 data: 19/09/2014 09:17:25

    Avevo capito che voleva caricare dei dati dal foglio...ma quali dati, a cosa servono?
    Forse vuole usare la combobox per avere un elenco dei nomi da cercare?



  • di Fabio (utente non iscritto) data: 19/09/2014 16:14:48

    @ alfrimpa - era semplicissimo .... ma non sapevo dove si potesse mettere il collegamento. Grazie

    @ lucas87 - pensavo di collegarla a una lista di dati ripetitivi (tipo Patente, Passaporto ecc) per non riscriverli manualmente nella scheda, ma forse non è la soluzione (ho provato con il suggerimento di alfrimpa ma non mi inserisce il dato nella cella).




  • di Lucas87 data: 19/09/2014 16:25:32

    Tipo un elenco dei valori già inseriti?
    Es invece di scrivere ogni volta Milano, lo selezioni dall'elenco a tendina?



  • di Fabio (utente non iscritto) data: 19/09/2014 16:32:11

    Esatto, così che la parola Milano mi viene inserita nella relativa cella della riga in cui sono posizionato.
    Es. se alla riga 5 ho il cliente Rossi che non ha Milano nella colonna Città, mi posiziona sulla riga 5, apro la userform e tramite la casella combinata inserisco Milano.



  • di alfrimpa (utente non iscritto) data: 19/09/2014 16:45:07

    Ciao Fabio

    Guarda che un conto è il popolamento della combobox ed hai visto che uno dei modi per farlo è quello di impostare la proprietà RowSource.

    Tutt'altra cosa è invece cosa vuoi farne del valore che hai selezionato nella combobox.

    Consentimi una considerazione: l'utilizzo di userform, ancorchè esteticamente più bello e professionale, comporta la necessità di padroneggiare il VBA con una certa facilità (io stesso non sono a quei livelli).

    Perdona la battuta: ma non è che per ammazzare un moscerino vuoi utilizzare un bazooka?

    Comunque, nell'ambito delle mie (limitate) conoscenze, resto a disposizione.

    Alfredo





  • di Lucas87 data: 19/09/2014 16:50:14

    Potrebbe essere fattibile...
    Ci sarebbe da vedere come riportare i valori dal form al foglio...ma credo che impostando la proprietà ControlSource dovrebbe funzionare
    Per quali campi servirebbe?



  • di alfrimpa (utente non iscritto) data: 19/09/2014 17:28:43

    È sicuramente fattibile.

    Ma da quel che ho capito Fabio vuole utilizzata la userform come interfaccia di un'anagrafica; presumo qui di che dalla form voglia effettuare tutte le operazioni tipiche cioè inserimento, modifica e cancellazione dati nonchè magari fare anche ricerche.

    Per cui, a mio avviso, ci sarebbe da scrivere un bel po di codice.

    Alfredo





  • di Fabio (utente non iscritto) data: 19/09/2014 20:31:42

    @ Lucas87 - cosi intendi per campi? le celle?
    ho modificato e inserito il file che avevi fatto tu. Nel file (Inserire dati.xlsm) ho inserito una casella combinata collegata alle celle A1:A5 del foglio2. Quello che vorrrei poter fare e utilizzarla per inserire la città nella riga selezionata alla colonna E.
    Comunque, non vorrei farvi impazzire, se è complicato le insirirò manualmente.
    Grazie



  • di Fabio (utente non iscritto) data: 19/09/2014 21:27:30

    scusa ancora Lucas87, il codice che hai creato per visualizzare con la userform il contenuto delle celle funziona benissimo.
    Nell'applicarlo al mio file, mi sono accorto che dove ho delle celle vuote, a volte in effetti c'è lo zero.
    Riesci a modificarmi il codice in modo che se trova lo zero lo sostituisce con "" o che almeno non si veda nel userform?
    Grazie



  • di Fabio (utente non iscritto) data: 20/09/2014 08:57:03

    mi permetto di aggiungere un altro piccolo problema. Quando con la userform inserico un numero di telefono con il prefisso (es. 0266778899) mi carica nella cella il valore senza lo zero (266778899) nonostante la cella sia configurata come testo.
    Va modificato il codice?
    Grazie



  • di Lucas87 data: 20/09/2014 15:05:46

    Ciao
    1 - hai inserito la combobox collegata al foglio2. Ci sono alcuni problemi: se la città è già presente, nel form

    viene inserita nella casella sbagliata; nel caso in cui la città non fosse presente nell'elenco del foglio2 come

    dovrebbe essere inserita?
    Io suggerisco di aggiungere la combobox, ma lasciare la casella di testo per inserire manualmente la città. Usando

    la combobox il valore selezionato verrebbe riportato nella casella di testo e quindi non ci sarebbero problemi con

    il resto del codice. È possibile fare in modo che l'elenco della combobox venga creato in base alle città già

    inserite nel foglio (senza doppioni, magari in ordine alfabetico...forse)

    2 - per eliminare gli zeri modifica il codice così

    If TypeName(ctl) = "TextBox" Then 'se sono caselle di testo procede
    If ctl.Text <> 0 Then
    ctl.Text = Cells(r, c) 'riempie le caselle di testo con i valori in sequenza
    c = c + 1 'cambia il valore della colonna da cui prendere i dati
    End If
    End If

    3 - sicuro che la cella sia impostata come testo? a me non inserisce lo 0. Puoi comunque risolvere modificando il codice così

    If TypeName(ctl) = "TextBox" Then
    Cells(r, c).NumberFormat = "@"
    Cells(r, c) = ctl.Text 'scrive nelle celle
    c = c + 1
    End If



  • di Fabio (utente non iscritto) data: 21/09/2014 09:04:38

    Ciao Lucas87
    per il problema al punto 1, ho deciso di soprassedere.

    Per il punto 2, ho modificato il tuo codice in quanto non eliminava la visualizzazione degli zeri. Così funziona
    If TypeName(ctl) = "TextBox" Then 'se sono caselle di testo procede
    If Cells(r, c) <> 0 Then
    ctl.Text = Cells(r, c) 'riempie le caselle di testo con i valori in sequenza
    End If
    c = c + 1 'cambia il valore della colonna da cui prendere i dati
    End If

    Per il punto 3 è perfetto.

    Un nuovo quesito:
    nella userform ho inserito una casella per inserire l'indirizzo e-mail. E' possibile assegnarli il formato mailto ?

    Grazie mille



  • di Lucas87 data: 21/09/2014 15:00:43

    Aggiungi questo per la mail
     
    If InStr(1, ctl.Text, "@") > 0 Then
        ActiveSheet.Hyperlinks.Add Cells(r, c), ctl.Text
    Else
        Cells(r, c) = ctl.Text
    End If



  • di Fabio (utente non iscritto) data: 21/09/2014 17:00:30

    ho aggiunto il codice, però mi crea un link ad un file (file:///C: ossi@gmail.com ......) mentre dovrebbe creare il link alla posta elettronica (mailto:rossi@gmail.com ......)



  • di Lucas87 data: 22/09/2014 08:28:30

    Ok
    così dovrebbe andare
     
    ActiveSheet.Hyperlinks.Add Cells(r, c), "mailto:" & ctl.Text & "", , , ctl.Text



  • di Fabio (utente non iscritto) data: 22/09/2014 09:47:03

    ora è tutto ok.
    Complimenti per la tua competenza e per la pazienza.
    Grazie.



  • di Lucas87 data: 22/09/2014 10:13:19

    Per la questione del menù a tendina con le città..se vuoi, un codice pronto io ce l'avrei (posso postarlo stasera)...devi adattarlo alla tua situazione



  • di Fabio (utente non iscritto) data: 22/09/2014 10:17:57

    Se l'hai già pronto, mi sarebbe utile, sperando di riuscire ad adattarlo.
    Grazie



  • di Lucas87 data: 22/09/2014 12:55:06

    Ciao
    ecco qua il file con il codice che dicevo
    Combobox - Lucas87.xls

    ci sono due metodi (il primo è più sicuro) con le dovute spiegazioni



  • di Lucas87 data: 22/09/2014 14:48:53

    Forse se ti spiego come adattarlo è meglio...
    il file che ho allegato mostra come caricare nella combobox dei valori non ripetuti e in ordine alfabetico.
    Dovrai modificare la variabile k impostando la colonna che ti interessa (ora e la A) e di conseguenza anche i riferimenti alle celle.
    Il codice andrà inserito nella parte che apre il form
    Sul form dovrai creare la combobox e per l'evento Change dovrai scrivere il codice che riporta il valore nella casella di testo corrispondente:
    Es. textbox5.text=combobox1



  • di Fabio (utente non iscritto) data: 24/09/2014 09:06:41

    Ciao Lucas87,
    ieri sera ho dato un'occhiata al file che hai inserito ma non sono riuscito a seguire le tue indicazioni.
    Forse era anche la stanchezza della giornata, per cui ci riprovo appena ho un po' di tempo e sono più rilassato.
    Grazie



  • di Fabio (utente non iscritto) data: 28/09/2014 22:25:37

    Ciao Lucas87,
    perdona ma a volte sono molto pignolo.
    ho inserito il codice per creare il link come indirizzo e-mail e funziona perfettamente.
    Ho però notato che che mi scrive l'indirizzo e-mail con un formato carattere (Calibri 11) diverso da quello originale della cella (Arial 8).
    Ho provato ha modificare il codice (vedi sotto) ma non cambia il formato. Dove sbaglio?
    Inoltre, volevo chiederti se era possibile che il link sia attivo anche nella casella della userform. Questo mi permetterebbe, in lettura dei dati, di aprire l'email direttamente cliccando sulla casella dello userform che contiente l'indirizzo email.
    Grazie mille

     
        If InStr(1, ctl.Text, "@") > 0 Then
        ActiveSheet.Hyperlinks.Add Cells(r, c), "mailto:" & ctl.Text & "", , , ctl.Text
        With Selection.Font
            .Name = "Arial"
            .Size = 8
        End With
    
    



  • di Lucas87 data: 29/09/2014 08:21:20

    Il tuo codice funziona.
    Però agisce sulla selezione...sei sicuro che la cella con il collegamento sia selezionata?



  • di Lucas87 data: 29/09/2014 08:40:14

    Per la questione della casella di testo che invia la mail, non credo sia possibile...non come pensi tu almeno.
    È possibile aprire il software per le mail ma io non ho idea di come si faccia.
    A livello di form si può far partire l'evento con un doppio click sulla casella o in altri modi.



  • di Fabio (utente non iscritto) data: 29/09/2014 09:57:10

    hai perfettamente ragione, mi formatta la cella selezionata. Non essendo quasi mai la cella selezionata quella dell'indirizzo e-mail, è possibile, modificando il codice, formattare (come per il link) le celle che contengono un indirizzo email?

    Per il secondo problema, far partire l'evento con un doppio clik potrebbe andar bene. Purtroppo non so come si fa. Mi puoi ancora aiutare?
    Grazie



  • di Lucas87 data: 29/09/2014 10:14:35

    Con questo cerca i collegamenti alle mail e cambia il formato

    Per il doppio click:
    dall'editor, dove modifichi il codice degli elementi del form,
    dal menù a tendina in alto a sinistra seleziona la textbox, da quello a destra seleziona DblClick.
    Per il codice ti conviene aprire una nuova discussione o cercare in rete
     
    For Each ma In ActiveSheet.Hyperlinks
        If InStr(1, ma.Address, "mailto:") > 0 Then
            ma.Range.Font.Name = "Algerian"
        End If
    Next



  • di Fabio (utente non iscritto) data: 14/10/2014 14:35:44

    Ciao Lucas87,
    perdona se ne approfitto ma stò ancora implementando la mia userform che, grazie al tuo aiuto è sempre più completa.
    Ora ho inserito un CheckBox e mi servirebbe che, se è valorizzato mi scrivesse SI (oppure NO se non valorizzato) nella colonna P della riga selezionata (es. P3).
    Naturalmente quando riapro la userform dovrebbe farmi vedere valorizzato se nella cella P3 trova SI.
    Ho provato a farlo da solo ma proprio non riesco.
    Riallego il file di prova che mi avevi creato al quale ho aggiunto un CheckBox.
    Grazie ancora.



  • di Lucas87 data: 14/10/2014 19:13:40

    Ciao e ben tornato...
     
    Questo per caricare i valori sul form. Va inserito prima di .Show
    If Cells(r, 16) = "SI" Then
        .CheckBox1 = True
    Else
        .CheckBox1 = False
    End If
    
    Questo per caricare i valori sul foglio. Va inserito prima di Unload me
    If CheckBox1 = True Then
        Cells(r, 16) = "SI"
    Else
        Cells(r, 16) = "NO"
    End If di .Show



  • di Fabio (utente non iscritto) data: 14/10/2014 20:07:05

    è perfetto.... proprio quello che volevo (c'è solo un "di .Show" nel codice riportato per errore che ho tolto).

    ma il quadratino del checkbox non si riesce ad ingrandire???? Nelle proprietà non ho trovato nulla per modificarlo.
    Grazie infinite.



  • di Lucas87 data: 14/10/2014 20:29:46

    La dimensione della casella è fissa...purtroppo.