2009-05-14 13 views
5

Wie kann ich Text in einem Modul in Access von einem anderen Modul im Zugriff suchen und ersetzen? Ich konnte das bei Google nicht finden.Ersetzen von Modultext in MS Access mit VBA

FYI, habe ich herausgefunden, wie man ein Modul programmatisch löschen:

Anruf DoCmd.DeleteObject (acModule, modBase64)

+0

Warum glauben Sie, müssen Sie das tun? Ich kann mir das nicht vorstellen, es sei denn, Sie erfinden das Rad der Access-Suche neu und ersetzen Dienstprogramme. Sicherlich ist es nichts, was in einer Produktionsanwendung nützlich ist, da Sie nur das Frontend ersetzen. Wenn Sie Ihre App nicht in Front-End/Back-End aufgeteilt haben, ist dies vielleicht der Grund, warum Sie denken, dass Sie dies tun müssen. –

+0

Das ist eine großartige Frage, ich brauchte die Antwort (tho versucht immer noch, es zum Laufen zu bringen. Diese Frage benötigt wirklich ein vba-Tag! – Smandoli

+0

Greg lieferte einen großartigen Grund (unten): Ich möchte komplexes Muster ausführen Suchanfragen – Smandoli

Antwort

2

Nach viel Sucherei ich diesen Code gefunden:

'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''' 
'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

Danke für diese Lösung. Meine Erfahrung, es zu arbeiten, ist, dass Sie alle Module in der VBA-IDE öffnen müssen, oder der Modules() Befehl wird mit Fehler 7961 brechen. – Smandoli

0

Schauen Sie sich die VBA-Objekt-Browser für die Access-Bibliothek. Unter dem Modul-Objekt können Sie den Modultext durchsuchen und Ersetzungen vornehmen. Hier ist ein einfaches Beispiel:

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 

Nach ChangeTextSub läuft, MyFirstSub

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

Es ist eine ziemlich einfache Suche lesen sollte, aber hoffentlich, dass kann dich in Schwung bringen.

2

Ich nehme an, Sie meinen, wie dies programmatisch zu tun ist (sonst ist es nur ctrl-h). Wenn dies nicht im Zusammenhang mit einem VBE-Add-In geschieht, ist es selten (wenn überhaupt) eine gute Idee. Selbst modifizierende Code wird oft von AV-Software gekennzeichnet, obwohl Zugriff Sie es tun, es ist nicht wirklich robust genug, um damit umzugehen, und kann zu Korruption Probleme usw. Darüber hinaus, wenn Sie mit selbst modifizierenden Code gehen Sie verhindern dass Sie jemals ein MDE oder sogar ein Projektpasswort verwenden können. Mit anderen Worten, Sie werden Ihren Code niemals schützen können. Es könnte besser sein, wenn Sie uns wissen lassen, welches Problem Sie mit selbst modifizierendem Code lösen wollen und ob eine zuverlässigere Lösung gefunden werden kann.

+0

Das Ziel ist es, Abschnitte des Codes zu löschen, bevor der Quellcode verteilt wird.Im Moment mache ich manuell eine Suche und lösche jedes Mal Ich möchte eine Quellcode-Verteilung machen. Ich möchte es automatisieren, um Zeit zu sparen. –

+0

Süße, ich mache so etwas selbst. Ich wollte dir einfach nicht helfen, dich selbst zu verletzen :) – Oorang

0

zusätzlich für die Funktion (Looping durch alle Linien)

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 

Genießen ^^

Verwandte Themen