Filtro valuta su maschera continua

di il
4 risposte

Filtro valuta su maschera continua

Ciao a tutti. Premetto che se sono a digiuno di pc e VBA da moltissimo tempo…e ho dimenticato tutto (o quasi)

Ho una tabella Dati su cui, tra i vari campi, il campo Importo, formattato  € #.##0,00;-€ #.##0,00 (per visualizzare, ad es. € 10,00)

Sulla maschera continua creata sulla query della tabella, ho inserito vari controlli (cbo/txt) per filtrare i record.

Funzionano tutti, tranne le due: txtImportoMin e txtImportoMax (formattati nella finestra delle Proprietà come sopra) per filtrare i record contenenti i valori compresi inseriti.

Questa la parte di filtro che non funziona

Private Sub txtImportoMin_AfterUpdate()
    Call SetFilter
End Sub
Private Sub txtImportoMax_AfterUpdate()
    Call SetFilter
End Sub

Sub SetFilter()
   Dim strWH As String

    If Len(Me!txtImportoMin.Value & vbNullString) > 0 And Me!txtImportoMin.Value <> "" Then _
                strWH = strWH & "[Importo]>=#" & Format$(Me!txtImportoMin.Value, "€ #.##0,00;-€ #.##0,00") & "#" & " AND "
    If Len(Me!txtImportoMax.Value & vbNullString) > 0 And Me!txtImportoMax.Value <> "" Then _
                strWH = strWH & "[Importo]<=#" & Format$(Me!txtImportoMax.Value, "€ #.##0,00;-€ #.##0,00") & "#" & " AND "
  
   If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
   Me.Filter = strWH
   Me.FilterOn = True
End Sub

Dove sbaglio?
Grazie

4 Risposte

  • Re: Filtro valuta su maschera continua

    Scusa ma leggi gli errori che vengono segnalati? Io non vedo neanche un end if.

  • Re: Filtro valuta su maschera continua

    Questo codice è pieno di errori. Sopratutto di sintassi.

    Mancano gli end if e hai un and di troppo nella seconda assegnazione.

    Quind  mi accodo alla domanda del post precedente, visto che scritto così non apre nemmeno il form, ma ti blocca il compilatore.

    Hai letto i messaggi di errore?

  • Re: Filtro valuta su maschera continua

    Stai facvendo una cosa che non ha senso… nel modo più assoluto, oltretutto applichi erroneamente la Sintassi delle DATE [#] ad un importo.

    Il Campo Importo è NUMERICO a cosa serve formattare un numero per come invece abitualmente si usa solo ai fini della visualizzazione per passarlo come stringa ad un Criterio…?

    Quello che ti serve si riassume così:

    If Len(Me!txtImportoMin.Value & vbNullString) > 0 Then strWH = strWH & "[Importo]>=" & Me!txtImportoMin.Value & " AND "
    If Len(Me!txtImportoMax.Value & vbNullString) > 0 Then strWH = strWH & "[Importo]<=" & Me!txtImportoMax.Value & " AND "
  • Re: Filtro valuta su maschera continua

    Risolto. Grazie a tutti.

    Quanto alle osservazioni:

    1)  l' end if (che avevo inizialmente inserito) non me lo accetta, dandomi l'errore “end if senza blocco if”. Il motivo non l'ho capito, ma funzionando senza ci sarà una ragione che và oltre le mie conoscenze.

    2) l'assegnazione And Me![NomeControllo].Value <> "" , (anche se spesso inutile) la inserisco sempre nei filtri multipli per due ragioni. Primo, perché nelle cbo con elenco valori in origine riga, aggiungo un valore “” per deselezionare rapidamente il filtro dal menù a tendina, senza evidenziare il valore e cancellarlo. Secondo, perché ho sempre il timore della differenza in un record tra campo nullo (vergine) e campo cancellato. Capisco l'inutilità in molte occasioni, ma è una condizione in più che non mi genera mai problemi

    3) Quanto all'utilizzo della formattazione “#” .. format$(…..) , l'ho appreso proprio per il campo data. L'ho utilizzato anche per l'Euro perché inizialmente non avevo impostato campo e controllo con la medesima formattazione ( sul primo avevo € 10,00 mentre sul controllo 10,00 €)

    Avendo letto sulla guida le varie formattazioni tramite cancelletto, oltre ad un post sul forum che affrontava l'argomento (se pur in altro contesto), pensavo che il problema fosse quello.

    Ora cmq funziona tutto (..ma senza end if..). Questo l'intero filtro.

    ' INIZIO SET FILTER
    
    Private Sub cboMovimento_AfterUpdate()
       Call SetFilter
    End Sub
    
    Private Sub cboConto_AfterUpdate()
        Call SetFilter
    End Sub
    
    
    Private Sub txtDataInizio_AfterUpdate()
        Call SetFilter
    End Sub
    
    Private Sub txtDataFine_AfterUpdate()
        Call SetFilter
    End Sub
    
    Private Sub txtImportoMin_AfterUpdate()
        Call SetFilter
    End Sub
    Private Sub txtImportoMax_AfterUpdate()
        Call SetFilter
    End Sub
    
    
    Sub SetFilter()
       Dim strWH As String
    
       If Len(Me!cboMovimento.Value & vbNullString) > 0 And Me!cboMovimento.Value <> "" Then _
                                        strWH = strWH & "Movimento='" & Me.cboMovimento.Value & "'" & " AND "
       If Len(Me!cboConto.Value & vbNullString) > 0 And Me!cboConto.Value <> "" Then _
                                        strWH = strWH & "Conto='" & Me.cboConto.Value & "'" & " AND "
        If Len(Me!txtDataInizio.Value & vbNullString) > 0 And Me!txtDataInizio.Value <> "" Then _
                                strWH = strWH & "[Data]>=#" & Format$(Me!txtDataInizio.Value, "mm/dd/yyyy") & "#" & " AND "
        If Len(Me!txtDataFine.Value & vbNullString) > 0 And Me!txtDataFine.Value <> "" Then _
                                strWH = strWH & "[Data]<=#" & Format$(Me!txtDataFine.Value, "mm/dd/yyyy") & "#" & " AND "
        
    If Len(Me!txtImportoMin.Value & vbNullString) > 0 Then strWH = strWH & "[Importo]>=" & Me!txtImportoMin.Value & " AND "
    If Len(Me!txtImportoMax.Value & vbNullString) > 0 Then strWH = strWH & "[Importo]<=" & Me!txtImportoMax.Value & " AND "
        
      
       If Len(strWH) <> 0 Then strWH = Mid$(strWH, 1, Len(strWH) - 5)
       Me.Filter = strWH
       Me.FilterOn = True
     
    End Sub

    Grazie nuovamente a tutti per l'aiuto e le osservazioni

Devi accedere o registrarti per scrivere nel forum
4 risposte