+ Rispondi al Thread
Visualizzazione dei risultati da 1 a 9 su 9

Discussione: Problema con ComboBox ActiveX

  1. #1
    Eusty non è in linea Scolaretto
    Post
    57

    Problema con ComboBox ActiveX

    Buongiorno,
    Sto creando un file Excel per la gestione Sociale della mia Associazione.
    Un File che mi permetta di inserire nuovi soci, rinnovare tesseramenti, fare ricerche per stampare report e molto altro e la ComboBox che ho inserito per ricercare i soci mi crea qualche problema.

    Appena riesco a svuotare un po' il file da dati sensibili e altro cerco di allegarvelo.

    La ComboBox (ActiveX) è nel Foglio "Home".
    E' collegata alla cella "E5" e prende i dati da un elenco che ho chiamato "ElencoSoci".
    Questo elenco è dinamico in modo che la ComboBox funzioni un po' come la ricerca di Google, ovvero man mano che scrivo il mone, nella tendina compaiono solo i soci con il nome che contiene quelle lettere.
    questo l'ho fatto mettendo nel riferimento di Gestione Nomi la formula:
    "=Soci!$AB$1:INDICE(Soci!$AB$1:$AB$1;CONTA.SE(Soci !$AB$1:$AB$1;"?*"))"
    Questo elenco si trova nel Foglio "Soci"

    Ho inserito anche la Sub (Nel Foglio "Home"):

    codice:
    Private Sub ComboRicercaSocio_Change()
        ComboRicercaSocio.DropDown
    End Sub
    in modo da visualizzare la tendina quando inizio a scrivere.

    Selezionato il nome premo il pulsante "Rinnova Tesseramento" che mi apre una userform con tutti i dati dell'interessato da controllare (eventualmente da modificare) e poi premendo Salva mi salva di nuovo tutti i dati aggiungendo la data di rinnovo.

    Il salvataggio viene fatto su più fogli perché il Foglio "Soci" è come se fosse il Libro Soci mentre i Fogli "Generale" e "Pagamenti" tengono traccia di tutta la storia della associazione.

    il problema ce l'ho qui. Quando clicco salva e inserisco i dati nei Fogli "Generale" e "Pagamenti", ogni volta che inserisco un dato mi richiama la Sub ComboRicercaSocio_Change(). Questo rallenta il codice e mi fa visualizzare la ComboBox nel Foglio "Generale" o "Pagamenti".
    Come posso risolvere???

    Per ora vi invio i codici:
    codice:
    'Apertura User Rinnovo
    Private Sub UserForm_Initialize()
        '---Riempi i campi automaticamente---
        Sheets("Soci").Select
        NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
        For i = 2 To NumRows
            If Cells(i, 1) = Range("AC1") Then
                TextNumTess.Value = Cells(i, 2)
                TextCognome.Value = Cells(i, 3)
                TextNome.Value = Cells(i, 4)
                If Cells(i, 5) = "M" Then
                    OptMaschio.Value = 1
                ElseIf Cells(i, 5) = "F" Then
                    OptFemmina.Value = 1
                End If
                TextDataNascita.Value = Cells(i, 6)
                TextLuogoNascita.Value = Cells(i, 7)
                TextProvNascita.Value = Cells(i, 8)
                TextIndirizzo.Value = Cells(i, 9)
                TextCAP.Value = Cells(i, 10)
                TextComune.Value = Cells(i, 11)
                TextProv.Value = Cells(i, 12)
                TextCodFisc.Value = Cells(i, 13)
                TextTel1.Value = Cells(i, 14)
                TextTel2.Value = Cells(i, 15)
                TextMail.Value = Cells(i, 16)
                ComboTipo.Value = Cells(i, 17)
                TextDataIscr = Cells(i, 18)
                TextNumRic.Value = Cells(i, 19)
                TextGenitore.Value = Cells(i, 20)
                TextAnnoRinnovo.Value = Format(Now, "yyyy")
                TextDataRinnovo.Value = Format(Now, "dd/mm/yyyy")
                TextNumRicRinnovo.Value = Sheets("Home").Range("P1").Value + 1 & "/" & Format(Now, "yyyy")
            End If
            Exit For
        Next
    End Sub
    
    'Salva Contatto
    Private Sub CommandRinnova_Click()
        Data1 = Now
        Data2 = CDate(TextDataNascita.Value)
        
        '---Foglio Soci---
        Sheets("Soci").Select
        NumRows = Range("A2", Range("A2").End(xlDown)).Rows.Count
        For i = 2 To NumRows
            If Cells(i, 1) = Range("AC1") Then
                Cells(i, 2) = TextNumTess.Value
                Cells(i, 3) = TextCognome.Value
                Cells(i, 4) = TextNome.Value
                If OptMaschio.Value = True Then
                    Cells(i, 5) = "M"
                ElseIf OptFemmina.Value = True Then
                    Cells(i, 5) = "F"
                End If
                Cells(i, 6) = TextDataNascita.Value
                Cells(i, 7) = TextLuogoNascita.Value
                Cells(i, 8) = TextProvNascita.Value
                Cells(i, 9) = TextIndirizzo.Value
                Cells(i, 10) = TextCAP.Value
                Cells(i, 11) = TextComune.Value
                Cells(i, 12) = TextProv.Value
                Cells(i, 13) = TextCodFisc.Value
                Cells(i, 14) = TextTel1.Value
                Cells(i, 15) = TextTel2.Value
                Cells(i, 16) = TextMail.Value
                Cells(i, 17) = ComboTipo.Value
                Cells(i, 18) = TextDataIscr.Value
                Cells(i, 19) = TextNumRic.Value
                Cells(i, 20) = TextDataRinnovo.Value
                Cells(i, 21) = TextNumRicRinnovo.Value
                Cells(i, 22) = TextAnnoRinnovo.Value
                Cells(i, 23) = TextGenitore.Value
            End If
            Exit For
        Next
        
        '---Foglio Pagamenti---
            Sheets("Pagamenti").Select
            Range("A2").Select
            Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
            Rows("2:2").Interior.ColorIndex = xlNone
            Rows("2:2").Font.Bold = False
            Range("A2") = TextCognome.Value
            Range("B2") = TextNome.Value
            Range("C2") = TextNumTess.Value
            Range("D2") = FormatNumber(10, 2)
            Range("D2").NumberFormat = "? ##0,0"
            Range("E2") = TextDataIscr
            Range("F2") = TextNumRic.Value
            Range("I2") = Format(Now, "yyyy")
        
        '---Foglio Pagamenti---
        Sheets("Pagamenti").Select
        Range("A2").Select
        Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
        Rows("2:2").Interior.ColorIndex = xlNone
        Rows("2:2").Font.Bold = False
        Range("A2") = TextCognome.Value
        Range("B2") = TextNome.Value
        Range("C2") = TextNumTess.Value
        Range("D2") = FormatNumber(10, 2)
        Range("D2").NumberFormat = "? ##0,0"
        Range("E2") = TextDataIscr
        Range("F2") = TextNumRic.Value
        Range("I2") = Format(Now, "yyyy")
        
    End Sub

  2. #2
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    239
    Quote Originariamente inviato da Eusty Visualizza il messaggio
    ...il problema ce l'ho qui. Quando clicco salva e inserisco i dati nei Fogli "Generale" e "Pagamenti", ogni volta che inserisco un dato mi richiama la Sub ComboRicercaSocio_Change(). Questo rallenta il codice e mi fa visualizzare la ComboBox nel Foglio "Generale" o "Pagamenti".
    Come posso risolvere???...
    Buongiorno Eusty,

    di primo acchito ti suggerirei di iniziare la Sub di salvataggio bloccando l'aggiornamento dello schermo e impostando il calcolo del foglio a Manuale. Li riattiverai subito prima dell'End Sub. Già questo credo che impatterà favorevolmente sulle prestazioni.

    In seconda battuta ti faccio notare che tutti quei Select sui fogli o sui range non sono necessari. Potresti ottimizzare ulteriormente il codice includendo le operazioni di scrittura nelle celle sfruttando un blocco With/End With.

    In merito all'esecuzione della Sub sulla pagina Home, non vedendo nessun richiamo esplicito, ti direi che potrebbe dipendere dal ricalcolo dei vari fogli. se così fosse, risolvi impostando il calcolo in manuale come ti dicevo all'inizio. Altrimenti mettici un bel punto di interruzione e quando il codice si ferma li, controlla lo stack di chiamate per vedere se qualche routine che non hai postato ti causa l'effetto indesiderato.

  3. #3
    Eusty non è in linea Scolaretto
    Post
    57
    Grazie per aver risposto

    di primo acchito ti suggerirei di iniziare la Sub di salvataggio bloccando l'aggiornamento dello schermo e impostando il calcolo del foglio a Manuale. Li riattiverai subito prima dell'End Sub.
    Scusa non ho capito cosa dovrei fare.

    In seconda battuta ti faccio notare che tutti quei Select sui fogli o sui range non sono necessari. Potresti ottimizzare ulteriormente il codice includendo le operazioni di scrittura nelle celle sfruttando un blocco With/End With.
    Con With dovrei scrivere così?
    codice:
    '---Foglio Soci---
        With Sheets("Soci")
        NumRows = .Range("A2", .Range("A2").End(xlDown)).Rows.Count
        For i = 2 To NumRows
            If .Cells(i, 1) = .Range("AC1") Then
                .Cells(i, 2) = TextNumTess.Value
                .Cells(i, 3) = TextCognome.Value
                .Cells(i, 4) = TextNome.Value
             …
             End If
           Next
        End With
    e così per ogni foglio Giusto??

  4. #4
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    239
    Quote Originariamente inviato da Eusty Visualizza il messaggio
    Scusa non ho capito cosa dovrei fare.
    Apri la sub così:
    codice:
    Private Sub CommandRinnova_Click()
    
    With Application
        .ScreenUpdating = False
        .Calculation = xlManual
    End With
    
    Data1 = Now
    Data2 = CDate(TextDataNascita.Value)
    
    'Il resto del tuo codice...
    
    With Application
        .Calculation = xlAutomatic
        .ScreenUpdating = True
    End With
    
    End Sub
    Qui trovi informazioni aggiuntive sui comandi che ti ho postato: ScreenUpdating e Calculation
    Quote Originariamente inviato da Eusty Visualizza il messaggio
    Con With dovrei scrivere così?
    ...
    e così per ogni foglio Giusto??
    Si ad entrambe le domande.
    Ultima modifica di Sgrubak; 31-01-2019 14:29  Motivo: Errore di battitura

  5. #5
    Eusty non è in linea Scolaretto
    Post
    57
    .Calulation = xlManual
    In questo punto mi da errore "Proprietà o metodo non supportati dall'oggetto

    Errore trovato….Mancava una C
    Ultima modifica di Eusty; 31-01-2019 14:35 

  6. #6
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    239
    Un mio errore di battitura, pardon. La proprietà corretta è Calculation.

  7. #7
    Eusty non è in linea Scolaretto
    Post
    57
    Ora Funziona ed è anche più veloce (Avevo anche dimenticato di inserire un Exit For per uscire dal ciclo for quando trovavo il contatto giusto quindi faceva passare comunque tutti i contatti)

    L'unuca cosa che è rimasta è che alla fine di tutta la sub quando eseguo
    With Application
    .Calculation = xlAutomatic
    .ScreenUpdating = True
    End With
    mi riattiva la sub Combo_Change() mostrandomi la Combobox con la tendina nel Foglio "Home" aperta. Poco male...la richiudo cliccando sulla freccetta della ComboBox...ma per curiosità c'è qualche impostazione per non farla riaprire oppure bisogna scrivere un codice apposta?

  8. #8
    Sgrubak non è in linea Scolaretto
    Luogo
    Torrazza Piemonte
    Post
    239
    Io aggirerei il problema disabilitando gli eventi subito prime del calcolo e riattivandoli subito dopo... Basta impostare la proprietà EnableEvents a False e poi riportarla a True. Questo se la Sub del Change è effettivamente richiamata dal calcolo. Per esserne sicuro, devi seguire lo stack delle chiamate.

  9. #9
    Eusty non è in linea Scolaretto
    Post
    57
    Si la Sub Change veniva richiamata dal Calcolo. Ho provato a inserire EnableEvent e sembra non dare più questo problema.
    Grazie mille per i consigli!!!

+ Rispondi al Thread

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi