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

Discussione: Ricerca testo ACCESS con VBA

  1. #1
    carminecrr non è in linea Novello
    Post
    34

    Ricerca testo ACCESS con VBA

    Ho un problema con questo codice, lo stesso funziona se nel testo620 è presente solo un risultato, se ci sono due risultati non mi funziona, di seguito il codice che ho scritto. Segue spiegazione..

    codice:
    Private Sub CasellaCombinata65_AfterUpdate() 
    
    Dim Testo657 As String
    Dim Testo620 As String
    Dim Testo659 As Integer
    
    Testo657 = Me.Testo657
    Testo620 = Me.Testo620
    
    Testo659 = InStr(1, Testo657, Testo620, vbTextCompare)
    
    If Testo659 = 0 Then
    MsgBox """" & " L 'AUDITOR NON HA L'AREA TECNICA PER POTER CONDURRE DA SOLO L'AUDIT, SCEGLIERE UN AUDITOR IN POSSESSO DELL'AREA TECNICA:" & Chr(13) & Chr(10) & """" & Me.Testo620 & """"
    
    End If
    
    End Sub

    Io prima scelgo l'azienda e nella casella Testo620 (richiama una serie di codici assegnati all'azienda, Esempio AT2 - AT23)
    Poi scelgo l'auditor e nella casella Testo657 (richiama una serie di codice assegnati all'auditor, esempio AT1 - AT2 - AT3 - AT23 - AT27, ecc.)

    La casella Testo659 la uso per il risultato.

    Se l'azienda ha un solo codice (il tutto funziona), se l'azienda ha due codici come nell'esempio sopra "AT2 - AT23", il codice dovrebbe controllare se nel Testo657 è presente, se c'è tutto OK altrimenti mi dovrebbe dare l'avviso MsgBox .

    Grazie per i consigli.
    Ultima modifica di AntonioG; 16-10-2014 10:24  Motivo: Inserire i tag CODE per il codice ...

  2. #2
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,692
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Ho un problema con questo codice, lo stesso funziona se nel testo620 è presente solo un risultato, se ci sono due risultati non mi funziona, di seguito il codice che ho scritto. Segue spiegazione..
    codice:
    Testo659 = InStr(1, Testo657, Testo620, vbTextCompare)
    Io prima scelgo l'azienda e nella casella Testo620 (richiama una serie di codici assegnati all'azienda, Esempio AT2 - AT23)
    Poi scelgo l'auditor e nella casella Testo657 (richiama una serie di codice assegnati all'auditor, esempio AT1 - AT2 - AT3 - AT23 - AT27, ecc.)

    Se l'azienda ha un solo codice (il tutto funziona), se l'azienda ha due codici come nell'esempio sopra "AT2 - AT23", il codice dovrebbe controllare se nel Testo657 è presente, se c'è tutto OK altrimenti mi dovrebbe dare l'avviso MsgBox .
    codice:
    InStr(1, "AT1 - AT2 - AT3 - AT23 - AT27", "AT2 - AT23", vbTextCompare)
    darà sempre risultato 0 perché nella stringa in cui fare la ricerca non trova la corrispondenza della stringa cercata. Devi cercare un altro modo per "estrarre" i singolarmente i codici assegnati all'azienda e per ognuno di questi eventualmente eseguire la ricerca con InStr in modo che esegua, in serie (un classico ciclo)
    codice:
    InStr(1, "AT1 - AT2 - AT3 - AT23 - AT27", "AT2", vbTextCompare)
    InStr(1, "AT1 - AT2 - AT3 - AT23 - AT27", "AT23", vbTextCompare)
    anche se forse c'è di meglio: non è possibile avere i codici dell'auditor in una tabella, un record per ogni codice?
    Integro: allo stato attuale (cioè serie di codici affiancati in un'unica stringa) l'unica via che trovo è quella di creare un array con Split su Testo620, con carattere di separazione " - " (spazi compresi, se li prende, non l'ho mai fatto). Per ogni elemento dell'array esegui la ricerca con InStr.
    codice:
    Dim arrTesto620() as String
    Dim i as Integer
    ArrTesto620 = Split (Testo620, " - ")
    For i = 0 to UBound(ArrTesto620)
    InStr(1, Testo657, ArrTesto620(i))
    Next
    Dopo si tratta di uscire dal ciclo, senza dover continuare per ogni elemento dell'array, una volta soddisfatta per la prima volta la ricerca.
    Ultima modifica di Phil_cattivocarattere; 16-10-2014 11:21 

  3. #3
    carminecrr non è in linea Novello
    Post
    34
    I codici auditor sono riportati in una tabella (ho 30 campi dove scrivo il codice, esempio campo1= AT1, campo2= AT5,), non è detto che sono consecutivi e che siamo sempre gli stessi per tutti. Posso avere anche auditor con solo 2 codici.

    Per le aziende il campo Testo620 viene richiamato da una casella combinata dove il codice è riferito a un singolo campo che può avere anche 3 o 4 codici separati da " - ".

    Il campo Testo657 viene fuori dall'aggiornamento di una casella combinata per la scelta dell'audior ha come origine una query unione dove io ho unito i vari campo1, campo2 ecc fino a 30, li ho uniti così [Campo1]&" - "&[Campo2] ecc.

    Quindi è impensabile di creare la combinazione di 30 campi.

    Pensavo che il modo migliore fosso quello di raggruppare i codici degli auditor nella casella Testo657 e quello dell'azienda in Testo620, compararli per vedere se tutto il contenuto di Testo620 e anche presente in Testo657.

    Non ho proprio idee.
    Grazie cmq

  4. #4
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,692
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    I codici auditor sono riportati in una tabella (ho 30 campi dove scrivo il codice, esempio campo1= AT1, campo2= AT5,), non è detto che sono consecutivi e che siamo sempre gli stessi per tutti. Posso avere anche auditor con solo 2 codici.
    Questo l'avevo immaginato
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Per le aziende il campo Testo620 viene richiamato da una casella combinata dove il codice è riferito a un singolo campo che può avere anche 3 o 4 codici separati da " - ".

    Il campo Testo657 viene fuori dall'aggiornamento di una casella combinata per la scelta dell'audior ha come origine una query unione dove io ho unito i vari campo1, campo2 ecc fino a 30, li ho uniti così [Campo1]&" - "&[Campo2] ecc.

    Quindi è impensabile di creare la combinazione di 30 campi.
    Non ho capito un granché se non il fatto che era quello che temevo.
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Pensavo che il modo migliore fosso quello di raggruppare i codici degli auditor nella casella Testo657 e quello dell'azienda in Testo620, compararli per vedere se tutto il contenuto di Testo620 e anche presente in Testo657.
    Allora vale quello che ho detto alla fine del post precedente:
    codice:
    Dim arrTesto620() as String
    Dim i as Integer
    ArrTesto620 = Split (Testo620, " - ")
    For i = 0 to UBound(ArrTesto620)
    InStr(1, Testo657, ArrTesto620(i))
    Next
    che continuo a considerare una soluzione "di ripiego" per una situazione strana.

  5. #5
    carminecrr non è in linea Novello
    Post
    34
    Ho provato però mi restituisce un errore di sintassi su

    InStr(1, Testo657, ArrTesto620(i))



    Ho scritto

    Private Sub CasellaCombinata65_AfterUpdate()
    Dim arrTesto620() As String
    Dim i As Integer
    arrTesto620 = Split(Testo620, " - ")
    For i = 0 To UBound(arrTesto620)
    InStr(1, Testo657, ArrTesto620(i))
    Next
    End Sub


    Non ho capito bene il codice oppure sbaglio

  6. #6
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,692
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Ho provato però mi restituisce un errore di sintassi su

    InStr(1, Testo657, ArrTesto620(i))

    Ho scritto

    Private Sub CasellaCombinata65_AfterUpdate()
    Dim arrTesto620() As String
    Dim i As Integer
    arrTesto620 = Split(Testo620, " - ")
    For i = 0 To UBound(arrTesto620)
    InStr(1, Testo657, ArrTesto620(i))
    Next
    End Sub


    Non ho capito bene il codice oppure sbaglio
    O dichiari Testo657 come variabile e gli assegni un valore o, presumento che sia un controllo nella stessa maschera, devi dire che prenda il valore di quel controllo: Me.Testo657.Value. Stessa cosa per Testo620
    L'avevo cucito in base al codice scritto all'inizio dove c'era
    codice:
    Dim Testo657 As String
    Dim Testo620 As String
    Dim Testo659 As Integer
    
    Testo657 = Me.Testo657
    Testo620 = Me.Testo620
    e tutto il proseguimento con IF e alla fine la msgbox
    codice:
    Private Sub CasellaCombinata65_AfterUpdate() 
    
    Dim Testo657 As String
    Dim Testo620 As String
    Dim Testo659 As Integer
    
    Testo657 = Me.Testo657
    Testo620 = Me.Testo620
    
    Dim arrTesto620() As String
    Dim i As Integer
    
    arrTesto620 = Split(Testo620, " - ")
    For i = 0 To UBound(arrTesto620)
    	Testo659 = InStr(1, Testo657, ArrTesto620(i))
    	If Testo659 then
    	Exit For
    	End If
    Next
    
    
    If Testo659 = 0 Then
    MsgBox """" & " L 'AUDITOR NON HA L'AREA TECNICA PER POTER CONDURRE DA SOLO L'AUDIT, SCEGLIERE UN AUDITOR IN POSSESSO DELL'AREA TECNICA:" & Chr(13) & Chr(10) & """" & Me.Testo620 & """"
    
    End If
    
    End Sub
    Lo sto ancora sistemando, attendere prego. Ora dovrebbe andare
    Ultima modifica di Phil_cattivocarattere; 16-10-2014 14:59 

  7. #7
    carminecrr non è in linea Novello
    Post
    34
    Si non avevo copiato tutto il codice, che posto tutto in questo messaggio, però mi restituisce un errore riferito a:

    InStr(1, Testo657, ArrTesto620(i))



    Codice provato:

    Private Sub CasellaCombinata65_AfterUpdate()
    Dim Testo657 As String
    Dim Testo620 As String
    Dim Testo659 As Integer

    Testo657 = Me.Testo657
    Testo620 = Me.Testo620
    Dim arrTesto620() As String
    Dim i As Integer
    arrTesto620 = Split(Testo620, " - ")
    For i = 0 To UBound(arrTesto620)
    InStr(1, Testo657, ArrTesto620(i))
    Next
    Testo659 = InStr(0, Testo657, Testo620, vbTextCompare)

    If Testo659 = 0 Then
    MsgBox """" & " L 'AUDITOR NON HA L'AREA TECNICA PER POTER CONDURRE DA SOLO L'AUDIT, SCEGLIERE UN AUDITOR IN POSSESSO DELL'AREA TECNICA:" & Chr(13) & Chr(10) & """" & Me.Testo620 & """"

    End If

    End Sub

  8. #8
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,692
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Si non avevo copiato tutto il codice, che posto tutto in questo messaggio, però mi restituisce un errore riferito a:

    InStr(1, Testo657, ArrTesto620(i))

    Codice provato:

    Private Sub CasellaCombinata65_AfterUpdate()
    ...
    Testo659 = InStr(0, Testo657, Testo620, vbTextCompare)
    L'ho riscritto completamente sopra, per intero. Cosa ci fa ancora
    codice:
    Testo659 = InStr(0, Testo657, Testo620, vbTextCompare)
    lì in mezzo? Riguardo tutto.
    Guardato. Quello che ti ho scritto è giusto, funziona, guarda il post precedente. Sistema la msgbox: servono davvero tutti quegli apici, doppi apici ecc?
    Ultima modifica di Phil_cattivocarattere; 16-10-2014 15:24 

  9. #9
    carminecrr non è in linea Novello
    Post
    34
    Scusa non mi usciva tutto il tuo messaggio in precedenza, veniva troncato dove hai scritto IF.

    Ora provo.
    Grazie Mille

  10. #10
    Phil_cattivocarattere non è in linea Scribacchino
    Luogo
    Verona-Mantova
    Post
    1,692
    Quote Originariamente inviato da carminecrr Visualizza il messaggio
    Scusa non mi usciva tutto il tuo messaggio in precedenza, veniva troncato dove hai scritto IF.
    Per conoscere i dettagli, digitare [Split] nella guida in linea di VBA Access (spesso in italiano) o fare click qui Split Function

+ Rispondi al Thread

Tag per questa discussione

Permessi di invio

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