2009-05-14 4 views
5

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

FYI, я понял, как удалить модуль Programatically:

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

+0

Почему вы думаете, нужно это сделать? Я не могу представить себе необходимость в этом, за исключением случаев, когда вы повторно изобретаете колесо поиска Access и заменяете утилиты. Разумеется, это не то, что может быть использовано в производственном приложении, поскольку вы просто заменяете передний конец. Если вы не разделили свое приложение на передний/задний конец, то это, пожалуй, причина, по которой вы думаете, что вам нужно это сделать. –

+0

Это отличный вопрос, в котором я нуждался в ответе (все еще пытаюсь заставить его работать. Этот вопрос ДЕЙСТВИТЕЛЬНО НУЖЕН тег vba! – Smandoli

+0

Что касается комментария Дэвида, Грег предоставил великолепную причину (ниже). Я хочу запустить сложный шаблон – Smandoli

ответ

2

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

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

Спасибо за это решение. Мой опыт, пытаясь заставить его работать, состоит в том, что у вас должны быть все модули, открытые в среде VBA IDE, или команда Modules() будет прерываться с ошибкой 7961. – Smandoli

0

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

В Module1

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

В 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 

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

2

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

+0

Целью этого является удаление разделов кода до распространения исходного кода. Сейчас я вручную выполняю поиск и удаляю каждый раз Я хочу сделать дистрибутив исходного кода. Я хочу автоматизировать его, чтобы сэкономить время. –

+0

Сладкий, я сам что-то делаю. Я просто не хотел помогать тебе причинять себе боль :) – Oorang

0

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

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 

Enjoy ^^

Смежные вопросы