2009-05-14 17 views
5

Come faccio a fare una ricerca e sostituzione di testo all'interno di un modulo in Access da un altro modulo di accesso? Non sono riuscito a trovarlo su Google.Sostituire il modulo di testo in MS Access utilizzando VBA

FYI, ho capito come eliminare un modulo programatically:

chiamata DoCmd.DeleteObject (acModule, modBase64)

+0

Perché pensi bisogno di fare questo? Non riesco a concepire un bisogno per questo, tranne se stai reinventando la ruota della ricerca di Access e sostituisci le utilità. Certamente, non è qualcosa che è di qualche utilità in un'applicazione di produzione, dal momento che basta sostituire il front-end. Se non hai diviso la tua app in front-end/back-end, è forse questa la ragione per cui pensi di doverlo fare. –

+0

Questa è una grande domanda che mi serviva la risposta (tho ancora cercando di farlo funzionare. Questa domanda davvero ha bisogno di un tag di VBA! – Smandoli

+0

Per quanto riguarda il commento di David, Greg ha fornito una splendida ragione (in basso). Voglio correre modello complesso ricerche orientate verso l'interno – Smandoli

risposta

2

Dopo un sacco di ricerche ho trovato questo codice:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
'Function to Search for a String in a Code Module. It will return True if it is found and 
'False if it is not. It has an optional parameter (NewString) that will allow you to 
'replace the found text with the NewString. If NewString is not included in the call 
'to the function, the function will only find the string not replace it. 
' 
'Created by Joe Kendall 02/07/2003 
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 

Public Function SearchOrReplace(ByVal ModuleName As String, ByVal StringToFind As String, _ 
     Optional ByVal NewString, Optional ByVal FindWholeWord = False, _ 
     Optional ByVal MatchCase = False, Optional ByVal PatternSearch = False) As Boolean 

    Dim mdl As Module 
    Dim lSLine As Long 
    Dim lELine As Long 
    Dim lSCol As Long 
    Dim lECol As Long 
    Dim sLine As String 
    Dim lLineLen As Long 
    Dim lBefore As Long 
    Dim lAfter As Long 
    Dim sLeft As String 
    Dim sRight As String 
    Dim sNewLine As String 

    Set mdl = Modules(ModuleName) 

    If mdl.Find(StringToFind, lSLine, lSCol, lELine, lECol, FindWholeWord, _ 
      MatchCase, PatternSearch) = True Then 
     If IsMissing(NewString) = False Then 
      ' Store text of line containing string. 
      sLine = mdl.Lines(lSLine, Abs(lELine - lSLine) + 1) 
      ' Determine length of line. 
      lLineLen = Len(sLine) 
      ' Determine number of characters preceding search text. 
      lBefore = lSCol - 1 
      ' Determine number of characters following search text. 
      lAfter = lLineLen - CInt(lECol - 1) 
      ' Store characters to left of search text. 
      sLeft = Left$(sLine, lBefore) 
      ' Store characters to right of search text. 
      sRight = Right$(sLine, lAfter) 
      ' Construct string with replacement text. 
      sNewLine = sLeft & NewString & sRight 
      ' Replace original line. 
      mdl.ReplaceLine lSLine, sNewLine 
     End If 
     SearchOrReplace = True 
    Else 
     SearchOrReplace = False 
    End If 

    Set mdl = Nothing 
End Function 
+0

Grazie per questa soluzione. La mia esperienza cercando di farlo funzionare è che è necessario disporre di tutti i moduli aperti nell'IDE VBA, oppure i moduli() comando rompere con l'errore 7961. – Smandoli

0

Scopri i browser degli oggetti VBA per la libreria di accesso. Sotto l'oggetto Modulo è possibile cercare il testo del modulo e effettuare sostituzioni. Ecco un semplice esempio:

In Module1

Sub MyFirstSub() 
    MsgBox "This is a test" 
End Sub 

In Module2

Sub ChangeTextSub() 
    Dim i As Integer 

    With Application.Modules("Module1") 
     For i = 1 To .CountOfLines 
      If InStr(.Lines(i, 1), "This is a Test") > 0 Then 
       .ReplaceLine i, "Msgbox ""It worked!""" 
      End If 
     Next i 
    End With 
End Sub 

Dopo l'esecuzione ChangeTextSub, MyFirstSub dovrebbe leggere

Sub MyFirstSub() 
MsgBox "It worked!" 
End Sub 

Si tratta di una ricerca piuttosto semplice, ma si spera che puoi farti andare.

2

Presumo si intende come fare questo programatically (altrimenti è solo ctrl-h). A meno che ciò non venga fatto nel contesto di un componente aggiuntivo VBE, è raramente (se mai) una buona idea. codice di autoregolamentazione modifica è spesso contrassegnato da un software AV una anche se l'accesso sarà permetterà lo si fa, non è davvero abbastanza robusto per gestire la cosa, e può portare a problemi di corruzione, ecc Inoltre, se si va con il codice automodificante ti impedisce te stesso da sempre in grado di utilizzare un MDE o anche una password di progetto. In altre parole, non sarai mai in grado di proteggere il tuo codice. Sarebbe meglio se si facci sapere quale problema si sta cercando di risolvere con sé il codice che modifica e vedere se una soluzione più affidabile potrebbe essere trovato.

+0

L'obiettivo è eliminare sezioni di codice prima che il codice sorgente venga distribuito. In questo momento sto facendo manualmente una ricerca e cancellato ogni volta Voglio fare una distribuzione del codice sorgente, voglio automatizzarlo per risparmiare tempo –

+0

Dolce, io stesso faccio questo genere di cose, non volevo aiutarti a farti male :) – Oorang

0

aggiuntivo per la funzione (scorrendo tutte le linee)

Public Function ReplaceWithLine(modulename As String, StringToFind As String, NewString As String) 
    Dim mdl As Module 
    Set mdl = Modules(modulename) 

    For x = 0 To mdl.CountOfLines 
    Call SearchOrReplace(modulename, StringToFind, NewString) 
    Next x 

    Set mdl = Nothing 
End Function 

Godetevi ^^

Problemi correlati