Testo concatenato da più checkbox

di il
31 risposte

31 Risposte - Pagina 2

  • Re: Testo concatenato da più checkbox

    15/10/2025 - Mailman ha scritto:

    14/10/2025 - @Alex ha scritto:

    Ma no non va bene... il mio era un TEST per provarla da riga di comando in finestra immediata senza farmi una Form ma la struttura era quella di prima in quanto così non la puoi richiamare direttamente su Evento AfterUpdate... 

    Deve essere una Function senza parametri:

    Anche con i parametri la si puo' richiamare sugli eventi AfterUpdate e Current, perche' dici che non si puo' fare? Io l'ho testata in una form e funziona correttamente.

    Pensavo che Tu l'avessi resa parametrica per poterla salvare su un modulo standard e poterla richiamare da qualsiasi form; perche' salvata nel modulo della form non serve renderla Public, poteva essere anche Private...

    Sbaglio?

    Questa di fatto non è una function che richiede parametri... ed essendo in maschera e non esterna e non riciclabile hanno ancora meno senso, detto questo la comodità di scrivere questo invece che attivare l'evento nel quale inserire il codice per ogni oggetto, mi pare molto comodo:

    =CheckAttachments()

    Alternativa è attivare 5 eventi ed inserie la chiamata.

    Poi io il Current lo uso a prescindere per motivi di Debug o per altri scopi e preferisco esplicitare la chiamata nell'ordine che io predefinisco, e non quello che Access impone (questo sotto non serve):

    Private Ckbox1_AfterUpdate()
    	CheckAttachments
    End Sub
    
    Private Ckbox2_AfterUpdate()
    	CheckAttachments
    End Sub
    
    Private Ckbox3_AfterUpdate()
    	CheckAttachments
    End Sub
    
    Private Ckbox4_AfterUpdate()
    	CheckAttachments
    End Sub
    
    Private Form_Current()
    	CheckAttachments
    End Sub

    Non so se sono riuscito a spiegarmi... 

  • Re: Testo concatenato da più checkbox

    Non so se hai risolto ma...

    qualche buon samaritano più ferrato di me in access mi dice se è giusta questa?

    costruita guardando manuali vari.

    
    Public Function CheckAttachments()
        Dim strLabel As String
        Dim attachments As Collection
    
        Set attachments = New Collection
    
        If Me!ChkAllegatoA.Value Then attachments.Add "Allegato A"
        If Me!ChkAllegatoB.Value Then attachments.Add "Allegato B"
        If Me!ChkAllegatoC.Value Then attachments.Add "Allegato C"
        If Me!ChkAllegatoD.Value Then attachments.Add "Allegato D"
    
        Select Case attachments.Count
            Case 0
                strLabel = ""
            Case 1
                strLabel = attachments(1) & "."
            Case 2
                strLabel = attachments(1) & " e " & attachments(2) & "."
            Case 3
                strLabel = attachments(1) & ", " & attachments(2) & " e " & attachments(3) & "."
            Case 4
                strLabel = attachments(1) & ", " & attachments(2) & ", " & attachments(3) & " e " & attachments(4) & "."
        End Select
    
        Me!ckLabel.Caption=strLabel
    End Function

    ovviamente alla label si può anteporre qualsiasi altro testo aggiuntivo.

  • Re: Testo concatenato da più checkbox

    15/10/2025 - @Alex ha scritto:

    Questa di fatto non è una function che richiede parametri... ed essendo in maschera e non esterna e non riciclabile hanno ancora meno senso, detto questo la comodità di scrivere questo invece che attivare l'evento nel quale inserire il codice per ogni oggetto, mi pare molto comodo:

    =CheckAttachments()

    Alternativa è attivare 5 eventi ed inserie la chiamata.

    Ciao @Alex, sono interessato ad approfondire la Tua soluzione, ma non ho capito come chiami la function senza utilizzare i singoli eventi dei controlli.

    Dove scrivi quella chiamata con l'uguale? A me da errore...

  • Re: Testo concatenato da più checkbox

    15/10/2025 - sihsandrea ha scritto:

    Non so se hai risolto ma...

    qualche buon samaritano più ferrato di me in access mi dice se è giusta questa?

    costruita guardando manuali vari.

    
    Public Function CheckAttachments()
        Dim strLabel As String
        Dim attachments As Collection
    
        Set attachments = New Collection
    
        If Me!ChkAllegatoA.Value Then attachments.Add "Allegato A"
        If Me!ChkAllegatoB.Value Then attachments.Add "Allegato B"
        If Me!ChkAllegatoC.Value Then attachments.Add "Allegato C"
        If Me!ChkAllegatoD.Value Then attachments.Add "Allegato D"
    
        Select Case attachments.Count
            Case 0
                strLabel = ""
            Case 1
                strLabel = attachments(1) & "."
            Case 2
                strLabel = attachments(1) & " e " & attachments(2) & "."
            Case 3
                strLabel = attachments(1) & ", " & attachments(2) & " e " & attachments(3) & "."
            Case 4
                strLabel = attachments(1) & ", " & attachments(2) & ", " & attachments(3) & " e " & attachments(4) & "."
        End Select
    
        Me!ckLabel.Caption=strLabel
    End Function

    ovviamente alla label si può anteporre qualsiasi altro testo aggiuntivo.

    Funziona parzialmente, si dovrebbe anteporre la scritta "Istanza" seguita da virgola se ci sono almeno 2 scelte, da una " e " se c'è una sola scelta e nulla dopo (rimane solo la scritta istanza) se non viene fatta alcuna scelta.

  • Re: Testo concatenato da più checkbox

    15/10/2025 - Azucarea ha scritto:

    Funziona parzialmente, si dovrebbe anteporre la scritta "Istanza" seguita da virgola se ci sono almeno 2 scelte, da una " e " se c'è una sola scelta e nulla dopo (rimane solo la scritta istanza) se non viene fatta alcuna scelta.

    Case 0 indica nessuna scelta... 

    Label= "quello che vuoi" & strlabel

    Se funonzia controlla cosa scrivere nei vari case.

  • Re: Testo concatenato da più checkbox

    Select Case attachments.Count
            Case 0
                strLabel = "nessuna scelta quindi qua scrivi quello che vuoi..."
            Case 1
                strLabel = "Istanza" & " e " & attachments(1) & "."
            Case 2
                strLabel = "Istanza/e" & ", " & attachments(1) & " e " & attachments(2) & "."
            Case 3
                strLabel = "Istanza/e" & ", " & attachments(1) & ", " & attachments(2) & " e " & attachments(3) & "."
            Case 4
                strLabel = "Istanza/e" & ", " & attachments(1) & ", " & attachments(2) & ", " & attachments(3) & " e " & attachments(4) & "."
        End Select
    
        Me!ckLabel.Caption=strLabel
  • Re: Testo concatenato da più checkbox

    15/10/2025 - Mailman ha scritto:

    15/10/2025 - @Alex ha scritto:

    Questa di fatto non è una function che richiede parametri... ed essendo in maschera e non esterna e non riciclabile hanno ancora meno senso, detto questo la comodità di scrivere questo invece che attivare l'evento nel quale inserire il codice per ogni oggetto, mi pare molto comodo:

    =CheckAttachments()

    Alternativa è attivare 5 eventi ed inserie la chiamata.

    Ciao @Alex, sono interessato ad approfondire la Tua soluzione, ma non ho capito come chiami la function senza utilizzare i singoli eventi dei controlli.

    Dove scrivi quella chiamata con l'uguale? A me da errore...

    Immaginavo non ci stessimo capendo...

    Provo ad allegare l'immagine se risulta utile, nel mio Funziona sia la Functoin definita Public sia Private, c'è stato un periodo in cui funzionava solo Public...

    Quindi nella Form scrivi:

    Option Compare Database
    Option Explicit
    
    Private Function NomeFunzione()
        MsgBox "AAAA"
    End Function
  • Re: Testo concatenato da più checkbox

    @Alex: ok capito; niente "routine evento" e relativo codice VBA ma si chiama direttamente la Function

    Buono a sapersi...

  • Re: Testo concatenato da più checkbox

    15/10/2025 - Mailman ha scritto:

    @Alex: ok capito; niente "routine evento" e relativo codice VBA ma si chiama direttamente la Function

    Buono a sapersi...

    Si certo molto comodo.

  • Re: Testo concatenato da più checkbox

    15/10/2025 - sihsandrea ha scritto:

    Select Case attachments.Count
            Case 0
                strLabel = "nessuna scelta quindi qua scrivi quello che vuoi..."
            Case 1
                strLabel = "Istanza" & " e " & attachments(1) & "."
            Case 2
                strLabel = "Istanza/e" & ", " & attachments(1) & " e " & attachments(2) & "."
            Case 3
                strLabel = "Istanza/e" & ", " & attachments(1) & ", " & attachments(2) & " e " & attachments(3) & "."
            Case 4
                strLabel = "Istanza/e" & ", " & attachments(1) & ", " & attachments(2) & ", " & attachments(3) & " e " & attachments(4) & "."
        End Select
    
        Me!ckLabel.Caption=strLabel

    La soluzione è simpatica, metterei un For...Each... per non fare il Select, anche se per così poche opzioni è ugualmente semplice

  • Re: Testo concatenato da più checkbox

    16/10/2025 - @Alex ha scritto:

    La soluzione è simpatica, metterei un For...Each... per non fare il Select, anche se per così poche opzioni è ugualmente semplice

    inizialmente avevo previsto un array dinamico da azzerare e ripopolare, poi leggendo in giro mi sono rifatto alla tua proposta. non essendo un deus ex access ho chiesto se qualche buon samaritano controllasse e eventualmente migliorasse i codice ma alludevo a te...

    con array basta contare gli elementi a prescindere dalle scelte:

    a.

    a e d.

    a, b e c. e così via.

    un ciclo for per elementi maggiori di due dove inserire la virgola e la congiunzione dopo il penultimo elemento e il punto finale in ogni caso. 

    se un domani aggiunge o rimuove i checkbox la funzione resta sempre valida.

  • Re: Testo concatenato da più checkbox

    16/10/2025 - sihsandrea ha scritto:

    inizialmente avevo previsto un array dinamico da azzerare e ripopolare, poi leggendo in giro mi sono rifatto alla tua proposta. non essendo un deus ex access ho chiesto se qualche buon samaritano controllasse e eventualmente migliorasse i codice ma alludevo a te...

    con array basta contare gli elementi a prescindere dalle scelte:

    a.

    a e d.

    a, b e c. e così via.

    un ciclo for per elementi maggiori di due dove inserire la virgola e la congiunzione dopo il penultimo elemento e il punto finale in ogni caso. 

    se un domani aggiunge o rimuove i checkbox la funzione resta sempre valida.

    Questa la funzione che penso sia ALL-INCLUSIVE con la tua proposta, se aumentano le Check deve solo aggiungere una riha di IF per ogni Check aggiunta.

    Public Function CheckAttachments()
        Dim strLabel    As String
        Dim attachments As Collection
        Dim attachment  As Variant
        Dim iCount      As Integer
        Set attachments = New Collection
        
        If Me!ChkAllegatoA.Value Then attachments.Add "Allegato A"
        If Me!ChkAllegatoB.Value Then attachments.Add "Allegato B"
        If Me!ChkAllegatoC.Value Then attachments.Add "Allegato C"
        If Me!ChkAllegatoD.Value Then attachments.Add "Allegato D"
            
        If attachments.Count = 0 Then
            strLabel = "Istanza."
        Else
            strLabel = "Istanza "
            For Each attachment In attachments
                iCount = iCount + 1
                
                Select Case True
                
                    Case iCount > 0 And attachments.Count = 1
                        strLabel = strLabel & attachment & "."
                    Case iCount < attachments.Count - 1 And attachments.Count > 1
                        strLabel = strLabel & attachment & ", "
                    Case iCount < attachments.Count And attachments.Count > 1
                        strLabel = strLabel & attachment & " e "
                    Case Else
                        strLabel = strLabel & attachment & "."
    
                End Select
            Next
        End If
        Me!ckLabel.Caption = strLabel
    End Function
  • Re: Testo concatenato da più checkbox

    No, un ciclo for x=elementi-2 ...

    Mette l'elemento e la virgola

    Fine

    Restano 2 elementi (da elementi-2) che vanno separati dalla congiunzione "e" e il punto finale

    In pratica il case 2 o il case 1.

    Man mano che conta i flag aggiunge l'elemento all'array.

    Fa il ciclo for fino ad elementi-2 se esistono altrimenti esegue case2 (due elementi) o case1 (un elemento)

  • Re: Testo concatenato da più checkbox

    Con Delphi lo scrivo in 3 secondi con access devo sbirciare i manuali partendo dal count dell'array...

  • Re: Testo concatenato da più checkbox

    Salve a tutti,

    Posto anch'io la mia versione, giusto per divertimento, ovviamente.

    Funziona con un numero arbitrario di CheckBox, sempre che seguano la nomenclatura chkAllegato[x]

    Function CheckAttachments()
        Dim ctl As Control, idx As Long
        Dim arrAllegati() As String, strAllegati As String
        For Each ctl In Me.Controls
            If TypeOf ctl Is CheckBox And InStr(ctl.Name, "chkAllegato") > 0 Then
                If ctl.Value Then
                    ReDim Preserve arrAllegati(idx)
                    arrAllegati(idx) = "Allegato " & Right(ctl.Name, 1)
                    idx = idx + 1
                End If
            End If
        Next ctl
        strAllegati = Join(arrAllegati, ", ")
        If strAllegati <> "" And InStr(strAllegati, ",") > 0 Then
            strAllegati = Mid(strAllegati, 1, InStrRev(strAllegati, ",") - 1) & " e" & Mid(strAllegati, InStrRev(strAllegati, ",") + 1)
            CheckAttachments = "Istanza, " & strAllegati
        ElseIf strAllegati <> "" Then
            CheckAttachments = "Istanza e " & strAllegati
        Else
            CheckAttachments = "Istanza."
        End If
    End Function
    
Devi accedere o registrarti per scrivere nel forum
31 risposte