2012-04-12 4 views
15

Ho appena iniziato un lavoro con una nuova società in cui gli sviluppatori precedenti avevano creato molte attività automatizzate. Certamente, non c'è praticamente nessuna documentazione e non ho avuto la possibilità di lavorare con lo sviluppatore precedente, quindi ora sto cercando di setacciare tutti questi processi alla ricerca di uno che modifichi alcuni file specifici.Come cercare tra i file di codice VBA

Ho copiato tutti i proc memorizzati in SQL e ho usato uno strumento di ricerca e non ho trovato quello che stavo cercando, quindi ora mi chiedo se il processo di cui ho bisogno si trova in uno dei tanti database di Access che sono Usato. Con SQL Server, è stato facile scrivere un'app C# per creare script dei proc in modo da poterli cercare, ma con Access sembra che io sia limitato ad aprire ogni db individualmente per cercare tra i file di codice.

Esiste un modo per cercare in modo programmatico i file di codice VBA?

+2

Non ho idea se è lo stesso in Acess, ma ecco come lo farei in Excel: http://www.cpearson.com/Excel/vbe.aspx –

+2

Guardare attraverso questo progetto CodeProject per idee - http://www.codeproject.com/Articles/18029/SourceTools-xla. Guarda attraverso la funzione di salvataggio del progetto e come analizzano tutti i file sorgente da un progetto vba. – ja72

+0

@ ja72 Se quell'add-inn funzionerà per Access, o se posso modificarlo per farlo, allora ti darò un doppio hi-five se mai ci incontreremo. –

risposta

13

Se l'interesse è la ricerca di moduli di codice in un file di database di Access, è possibile utilizzare il modello di oggetti VBE. Questo esempio cerca una parola in tutti i moduli dello ActiveVBProject del database corrente. Se il database include più di un VBProject, è possibile enumerare la collezione VBProjects e cercare i progetti uno alla volta per nome:

For Each objComponent In Application.VBE.VBProjects(ProjName).VBComponents 

O se si preferisce fare riferimento al progetto in base al numero e non il nome, solo essere a conoscenza la numerazione inizia con 1 invece che 0.

Public Sub findWordInModules(ByVal pSearchWord As String) 
    'Dim objComponent As VBComponent 
    ' VBComponent requires reference to Microsoft Visual Basic 
    ' for Applications Extensibility; use late binding instead: 
    Dim objComponent As Object 
    Dim strMessage As String 
    Dim strModuleList As String 

    strModuleList = vbNullString 
    For Each objComponent In Application.VBE.ActiveVBProject.VBComponents 
     If objComponent.CodeModule.Find(pSearchWord, 1, 1, -1, -1) = True Then 
      strModuleList = strModuleList & "; " & objComponent.Name 
     End If 
    Next objComponent 
    strMessage = "Text '" & pSearchWord & "' found in " 
    If Len(strModuleList) > 0 Then 
     strMessage = strMessage & "modules: " & Mid(strModuleList, 3) 
    Else 
     strMessage = strMessage & "no modules" 
    End If 
    Debug.Print strMessage 
End Sub 

Review l'argomento della Guida di accesso per quel metodo Find; potresti preferire opzioni diverse da quelle che ho usato.

Se si desidera scegliere come target più file db e ricercare i moduli in ciascuno, è possibile automatizzarlo utilizzando il metodo OpenDatabase. Lascerò i dettagli di quella parte a te.

+0

Suppongo che potrei anche usare il modello di oggetti VBE per leggere semplicemente ogni riga di ogni modulo e scriverli in un file di testo, giusto? Sarebbe l'ideale quindi posso usare lo strumento di ricerca del testo che sono abituato a usare piuttosto che provare a crearne uno mio. –

+0

Sì, è possibile. Ma puoi usare Application.SaveAsText per salvare ogni modulo come un file di testo --- che dovrebbe richiedere meno sforzi di codifica. – HansUp

+0

+1 ben fatto. – brettdj

5

È consigliabile scaricare il numero gratuito MZ-Tools per VBA e utilizzare la funzione di ricerca/sostituzione.

Start Find Find Results

Modifica

MZ-Tools per VBA non è più disponibile. La versione a pagamento funziona con le nuove installazioni di ufficio.

+3

MZ-Tools è un ottimo add-in e l'ho usato tutto il tempo in cui ho sviluppato VB6, ma HansUp è correggi che sto cercando una soluzione che non mi imponga di aprire singoli file. –

3

Un'altra opzione, non menzionata in precedenza, consiste nel stampare il codice progetto, dal menu di scelta rapida, nell'editor VBA. I passaggi seguenti possono essere modificati, per soddisfare le applicazioni disponibili, ma il risultato è lo stesso: testo ricercabile.

Dall'editor VBA, fare clic con il pulsante destro del mouse sul nome del progetto e fare clic su Stampa dal menu di scelta rapida visualizzato. Assicurati che "Codice" sia selezionato e fai clic su "OK". La stampante può essere modificata, dal menu "Configurazione ...", disponibile nell'ultima finestra di dialogo.

Right Click "Print" Check Box "Code"

Su un lato nota - stand moduli solo, SQL, tavoli, ecc, sono disponibili per la stampa, dalla "Database Documenter", nel gruppo "Analizza", dei "Database Tools "scheda.

Molto utile, per l'ordinamento e la definizione di SQL sottostante, delle query di Access.

Database Documenter