Заменить текст модуля в MS Access с помощью VBA - PullRequest
5 голосов
/ 15 мая 2009

Как выполнить поиск и замену текста в модуле Access из другого модуля в Access? Я не мог найти это в Google.

К вашему сведению, я понял, как программно удалить модуль:

Вызов DoCmd.DeleteObject (acModule, modBase64)

Ответы [ 4 ]

2 голосов
/ 18 мая 2009

Полагаю, вы имеете в виду, как это сделать программно (иначе это просто ctrl-h). Если это не делается в контексте надстройки VBE, это редко (если вообще) хорошая идея. Самомодифицирующийся код часто помечается программным обеспечением AV, хотя доступ будет позволять сделать это, он недостаточно надежен для обработки и может привести к проблемам с коррупцией и т. Д. Кроме того, если вы идете с самоизменением код, который вы не позволяете себе использовать MDE или даже пароль проекта. Другими словами, вы никогда не сможете защитить свой код. Возможно, будет лучше, если вы сообщите нам, какую проблему вы пытаетесь решить с помощью самоизменяющегося кода, и посмотрите, можно ли найти более надежное решение.

2 голосов
/ 18 мая 2009

После долгих поисков я нашел этот код:

''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
'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 голосов
/ 19 марта 2010

дополнительно для функции (цикл по всем строкам)

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

Наслаждайтесь ^^

0 голосов
/ 15 мая 2009

Проверьте браузер объектов VBA для библиотеки Access. Под объектом модуля вы можете искать текст модуля, а также делать замены. Вот простой пример:

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

После запуска ChangeTextSub MyFirstSub должен прочитать

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

Это довольно простой поиск, но, надеюсь, он поможет вам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...