Una famiglia di sistemi di gestione per database relazionali di Microsoft progettati per semplificare l'uso.
Come immaginavo la stampa del valore assunto dalla variabile sWhere ha svelato il "mistero". Ci sono alcune cose che andrebbero verificate:
- Via: il nome del controllo farebbe presagire il contenuto stringa del campo che andrai a filtrare mentre quello che viene stampato è un numero ed è senza apici. Si tratta di un campo stringa (e allora ci vogliono gli apici) o un campo numerico (magari una chiave che si riferisce ad altra tabella)? A mio avviso l'errore che ricevi potrebbe essere relativo alla mancanza di apici intorno al valore 17 (ammesso che questo valore sia corretto);
- Nella costruzione della clausola where (dentro sWhere per intenderci) ci vanno SEMPRE i nomi dei campi e i relativi valori che devono essere conformi alla natura del campo. In fondo a quanto hai riportato trovo "vfrequenza = ....". Non può funzionare, vfrequenza, per quanto ci siamo detti è il nome della variabile mentre il nome del campo, immagino, sarà Frequenza. Questo a prescindere dagli apici (che non vanno) intorno al valore 0/-1
- Altra annotazione in merito sempre all'ultimo campo "Frequenza": immaginando che la tua maschera sia costruita per generare dei criteri di estrazione devi imporre nelle proprietà del controllo il valore di "SI" a "Stato Triplo". I campi SI/NO valgono per loro natura 0/-1. Solo cambiando la proprietà stato triplo puoi aggiungere una terza possibilità da sfruttare appunto come criterio di estrazione "Tutti" (ovvero tutte le signore Maria presenti sia che frequentino sia che non frequentino).
Prima di riportarti il codice che ho utilizzato per il test (e che ho finalmente provato successo) concludo dicendo che di fronte ad un errore non bisogna mai partire in modo schizofrenico tentando la qualunque. Occorre utilizzare gli strumenti messi a disposizione da VBA per capire e apportare i necessari correttivi. Il primo passo è comunque CAPIRE quello che si scrive, anche se suggerito da altri.
Nel codice ho eliminato l'uso delle variabili in quanto, nel tuo caso, inutili alo scopo prefissato. I concetti restano identici.
Dim sWhere As String
If Len(Me!Nome.Value & "") > 0 Then
sWhere = sWhere & "AND Nome LIKE '*" & Replace(Me!Nome.Value, "'", "''") & "*' "
End If
If Len(Me!professione.Value & "") > 0 Then
sWhere = sWhere & "AND Professione = '" & Me!professione.Value & "' "
End If
If Len(Me!data_nascita.Value & "") > 0 Then
sWhere = sWhere & "AND data_nascita = #" & Format(Me!data_nascita.Value, "mm/dd/yyyy") & "# "
End If
If Len(Me!genere.Value & "") > 0 Then
sWhere = sWhere & "AND genere = '" & Me!genere.Value & "' "
End If
If Len(Me!Frequenza.Value & "") > 0 Then
sWhere = sWhere & "AND frequenza = " & Me!Frequenza.Value & " "
End If
If Len(sWhere) > 0 Then
sWhere = " WHERE " & Mid(sWhere, 5)
End If
David