Usare vba per cercare e recuperare dati da una tabella

di
Anonimizzato10419
il
6 risposte

Usare vba per cercare e recuperare dati da una tabella

Ciao, chiedevo un suggerimento, io ho un database formato da una tabella che contiene migliaia di record, incrementati giornalmente, contenente alcuni campi tra cui numero di telefono, nominativo e indirizzo. Ogni tanto mi inviano un file in formato excel contenente una lista di numeri e mi si chiede di verificare se nel database ci sono ed eventualmente di recuperare alcune informazioni. Dato che i file contengono centinaia di numeri, di farli a mano non se ne parla. Ho creato un modulo in vba che apre il file excel, con un ciclo legge i numeri e li trasforma nel formato presente in tabella. poi con il comando Docmd apro la tabella dopodichè, ed è questo quello che mi manca, dovrei posizionarmi sul record contenente il numero letto dal file excel ed inserito in una variabile (per questo ho provato ad usare docmd.findrecord ma non so se si posiziona sul record giusto, non ho riscontro) e poi recuperare in una variabile il contenuto di un altro campo relativo al record trovato. inoltre se non trova il record dovrebbe dirmelo. Io non so come fare, voi potete aiutarmi?
Grazie,

6 Risposte

  • Re: Usare vba per cercare e recuperare dati da una tabella

    Io non so usare il Visual Basic, ma proverei a risolvere il problema così:
    1) Tu hai Tabella1 con i campi che hai descritto, quindi crea Tabella2 con gli stessi campi
    2) Trova una maniera di Esportare i dati del file Excel nella Tabella2, credo che ci siano i comandi giusti per farlo, ma banalmente potresti selezionare tutti i campi dal foglio Excel (attento a selezionare le intere celle che devono interamente diventare di colore nero), quindi Copia
    3) Apri Tabella2, Seleziona una intera riga (con tutte le celle che devono diventare nere), quindi Incolla (ovviamente tutto deve essere coerente con il significato di ogni campo)
    4) Ora non mi è chiaro quando dici che sei riuscito con una routine a riadattare il numero telefonico nel formato da te prescelto: OK, scegli di procedere prima o dopo, in ogni caso hai detto che questo funziona. Il mio obiettivo è quello di avere il numero telefonico in Tabella1 e Tabella2 nello stesso formato.
    5)
    1. Nel caso vuoi sapere se tra i nuovi numeri in Tabella2 ci sono numeri che non appaiono in Tabella1, crea una "query di ricerca dati non corrispondenti" sul campo numero telefonico.
    2. Nel caso vuoi recuperare altri dati a parità di numero telefonico, crea una query di selezione importando entrambe Tabella1 e Tabella2 congiungendo i due campi numero telefonico.
    6) Una volta terminato qualsiasi tipo di ricerca, potrai anche cancellare tutti i record di Tabella2.
  • Re: Usare vba per cercare e recuperare dati da una tabella

    Ribadisco che non so usare Visual Basic, ma abbastanza bene le macro. Credo di intuire che la funzione FindRecord non è adatta al tuo problema. Se a FindRecord associ il valore 02455455 (numero telefonico), Access si posizionerà al record 2455455esimo, ma non è quello che tu desideri.
    Un problema simile è capitato a me e l'ho risolto con una macro contenente l'istruzione ImpostaValore, ma ciò si può fare soltanto fra valori provenienti da maschere o report. Curiosamente la stessa guida in linea, all'argomento "ImpostaValore" dice, nelle ultime righe, che non esiste un analogo comando in Visual Basic.
  • Re: Usare vba per cercare e recuperare dati da una tabella

    Intanto ti ringrazio per la dritta, proverò con il sistema che mi hai segnalato, mi chiedo però se è possibile, per esempio, inserire il codice di una query all'interno del vba per effettuare una ricerca nella tabella dove il parametro da ricercare sia quello contenuto nella variabile e la ricerca venga effettuata nel campo "telefonico". Per quanto riguarda l'adeguamento del numero, in tabella il formato è: tre cifre per il prefisso e 10 cifre per il numero, con una serie di zeri a riempimento per arrivare a 10. Se devo cercare il numero 02345678, devo trasformarlo in 0020000345678. Il numero 036256745 diventerà 3620000056745. Ma questo riesco a farlo, è tutto il seguito che mi blocca... Trovare il record e poi estrarre i valori di altri campi di quel record in altrettante variabili.

    Grazie,
  • Re: Usare vba per cercare e recuperare dati da una tabella

    Sicuramente esisteranno istruzioni Visual Basic che sfruttino le variabili nel modo che tu desideri, risolvendo molto elegantemente al tuo problema. Ti suggerisco di contattare Alex al proposito, ma immagino pure che avrebbe bisogno di guardare le istruzioni che tu hai costruito fino al punto in cui non ti quadra più, ed elencargli per bene tutti i campi che interagiscono agli scopi che ti prefiggi.

    Ad ogni modo, penso che il problema si possa risolvere così: prova a creare una nuova tabella X con relativa maschera X avente gli stessi campi della tua tabella primordiale (che chiamerei Indirizzario) Nome, Cognome, Indirizzo, Telefono… Crea anche una analoga maschera Indirizzario.
    Una volta che sei riuscito a formattare il telefono come dici tu (es. 0020000345678), potresti memorizzarlo nel campo X.Telefono. Fin qui mi pare che tu sia riuscito a farlo, ma il valore lo hai messo in una variabile K. Io la variabile K non la so usare, ma andare a richiamare il valore memorizzato in X.Telefono sì.

    Ora tu vorresti:
    1. aprire automaticamente la maschera Indirizzario
    2. posizionarti automaticamente al record avente il telefono = 0020000345678 che in questo momento è memorizzato in X.Telefono
    3. prelevare automaticamente i valori dei campi Indirizzario.Nome, Indirizzario.Cognome, Indirizzario.Indirizzo e memorizzarli da qualche parte. Tu immagino usi altre variabili, ma perché non memorizzarli proprio in X.Nome, X.Cognome e X.Indirizzo?
    Allora crea una macro con le seguenti azioni:

    ApriMaschera: X
    ApriMaschera: Indirizzario
    VaiAControllo: Telefono
    TrovaRecord
    .....Trova: =[Maschere]![X]![Telefono]
    VaiAControllo: Nome (forse questa azione è superflua)
    ImpostaValore
    .....Elemento: [Maschere]![Indirizzario]![Nome]
    .....Espressione: [Maschere]![X]![Nome]
    VaiAControllo: Cognome (forse superflua)
    ImpostaValore
    .....Elemento: [Maschere]![Indirizzario]![Cognome]
    .....Espressione: [Maschere]![X]![Cognome]
    VaiAControllo: Indirizzo (forse superflua)
    ImpostaValore
    .....Elemento: [Maschere]![Indirizzario]![Indirizzo]
    .....Espressione: [Maschere]![X]![Indirizzo]

    L'idea è un po' rudimentale, ma funziona.
    Esiste un tasto in Access che permette di trasformare una macro in un modulo di Visual Basic. Utilizzalo e, dopo la traduzione, forse potresti sostituire i campi di X con le variabili che avevi progettato.
  • Re: Usare vba per cercare e recuperare dati da una tabella

    Salve.
    Si concordo con Osvaldo, nell'importare in una nuova Tabella il file di Excel, basta fare - pulsante destro sul vuoto della finestra Tabelle ---> Import ---> scegli il file e tipo ?File di excel'... Segui la creazione guidata.
    Poi crei una Query, sfruttando la composizione guidta scegliendo 'Query ricerca duplicati', i campi tra cui fare il confronto per trovarli, sarà naturalmente quello del 'Numero-Tel'.
    Saluti.
  • Re: Usare vba per cercare e recuperare dati da una tabella

    Grazie ai vostri suggerimenti e ad averci picchiato la testa per un paio di giorni, ci sono riuscito. In particolare mi è stata utile la dritta sulla compilazione delle macro in codice vba che mi ha fornito lo spunto e l'indicazione di usare le maschere.
    Vi posto il codice del modulo come l'ho realizzato, qualora dovesse servire da spunto a qualcuno:
    Per iniziare ho creato un oggetto di tipo excel ed ho aperto il file da analizzare:

    Dim xlapp As Object
    nome = InputBox("digita il nome del file da elaborare")
    Set xlapp = CreateObject("excel.Application")
    xlapp.workbooks.Open ("C:\Documents and Settings\19034935\Desktop\" & nome & ".xls")
    xlapp.Visible = True

    Poi ho creato la variabile dove memorizzare il numero telefonico e la procedura per trasformarlo nel formato presente nella tabella access:

    Dim num As Variant
    num = "a"
    x = 2
    Do While num <> ""
    num = xlapp.range("B" & x).Text
    If num = "" Then
    Exit Do
    End If
    If Mid(num, 1, 1) <> "0" Then
    num = "0" + num
    End If
    If Mid(num, 2, 1) = "2" Then
    num = "0" + num
    End If
    If Mid(num, 2, 2) <> "02" And Mid(num, 2, 2) <> "11" And Mid(num, 2, 2) <> "15" And Mid(num, 2, 2) <> "30" And Mid(num, 2, 2) <> "31" And Mid(num, 2, 2) <> "35" And Mid(num, 2, 2) <> "39" Then
    num = Mid(num, 2, 12)
    End If
    Do While Len(num) < 13
    num = Mid(num, 1, 3) + "0" + Mid(num, 4, 10)
    Loop

    A questo punto, avevo creato una maschera collegata alla tabella di access, la faccio aprire in sola lettura e senza visualizzarla:

    DoCmd.OpenForm "RIENTRI", acNormal, , , acFormReadOnly, acHidden

    Per evitare di cercare il numero in tutti i campi del database, cosa che porterebbe via parecchio tempo per ogni interrogazione, sposto il focus sul campo della maschera che contiene i numeri telefonici:

    Forms!RIENTRI!NUMERO.SetFocus

    A questo punto posso ricercare all'interno della maschera il record dove il campo contenente il telefonico corrisponde al valore prelevato da excel ed inserito nella variabile num:

    DoCmd.FindRecord num, acStart, False, , False, acCurrent, True (acCurrent serve proprio per limitare la ricerca al campo su cui è stato impostato il focus)

    Una volta trovato il record recupero il valore del campo che mi interessa in un'altra variabile. Ovviamente inserisco un controllo per il caso che il record restituito sia vuoto oppure la maschera resti posizionata sul primo record perchè non ha trovato la corrispondenza:

    Dim Cam As String
    If IsNull(Forms!RIENTRI!NUMERO) = True Or Forms!RIENTRI!NUMERO <> num Then
    Cam = "NUMERO NON TROVATO"
    Else
    If IsNull(Forms!RIENTRI!INDIRIZZO) = True Then
    Cam = "indirizzo non dichiarato"
    Else
    Cam = Forms!RIENTRI!INDIRIZZO
    End If
    End If

    Fatto questo, chiudo la maschera, riporto il valore dell'indirizzo nel foglio excel e riparto con il numero successivo:

    DoCmd.Close acForm, "RIENTRI", acSaveNo
    xlapp.range("P" & x).Activate
    xlapp.activecell.formulaR1C1 = Cam
    x = x + 1
    Loop
    MsgBox "Fine elaborazione"

    Spero vi possa servire, grazie ancora,
Devi accedere o registrarti per scrivere nel forum
6 risposte