Discussion:
[VBA] Suchen und ersetzen im gesamten VBA-Projekt per VBA
(zu alt für eine Antwort)
Jörg Eisenträger
2005-09-05 18:01:55 UTC
Permalink
Hallo,

ich möchte zur Laufzeit per Code in allen Modulen eines VB-Projektes
alle Vorkommen eines Strings durch einen anderen String ersetzen.

Genauer: Es soll im Code überall der Parameter "MeinWert" durch den
Namen der Public Function getMeinWert ersetzt werden.

Sicher schon oft gefragt, hab aber nichts gefunden. Könnt Ihr helfen?

Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
klaus.schmitz
2005-09-05 22:31:36 UTC
Permalink
Hallo Jörg,

ich würde das von Hand machen mit Suchen Ersetzen
das geht doch eigentlich ganz schnell.

MfG
Klaus
Jörg Eisenträger
2005-09-06 18:53:19 UTC
Permalink
Hi Klaus,
Post by klaus.schmitz
ich würde das von Hand machen mit Suchen Ersetzen
das geht doch eigentlich ganz schnell.
Naja, im Einzelfall schon. Nur war der falsche alte String schon im Code
von über 100 Dateien drin. Da wollte ich das nicht manuell machen.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Stefan Onken
2005-09-06 16:32:58 UTC
Permalink
hallo Jörg,
ich denke, diese Seite wird dir weiterhelfen:
http://www.jumper.ch/Artikel/215.htm

mE musst du alle (Klassen)Module durchschleifen (auf obiger Seite Punkt
10), den Code jedes Moduls einlesen (Stichwort CountOfLines und
Lines()), mittels InStr() prüfen und über ReplaceLine ggfls ersetzen.

Gruß
stefan
Post by Jörg Eisenträger
Hallo,
ich möchte zur Laufzeit per Code in allen Modulen eines VB-Projektes
alle Vorkommen eines Strings durch einen anderen String ersetzen.
Genauer: Es soll im Code überall der Parameter "MeinWert" durch den
Namen der Public Function getMeinWert ersetzt werden.
Sicher schon oft gefragt, hab aber nichts gefunden. Könnt Ihr helfen?
Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
--
Immer auf dem aktuellen Stand mit den Newsgroups von freenet.de:
http://newsgroups.freenet.de
Jörg Eisenträger
2005-09-06 18:47:00 UTC
Permalink
Hallo Stefan,
Post by Stefan Onken
Post by Jörg Eisenträger
ich möchte zur Laufzeit per Code in allen Modulen eines VB-Projektes
alle Vorkommen eines Strings durch einen anderen String ersetzen.
mE musst du alle (Klassen)Module durchschleifen (auf obiger Seite Punkt
10), den Code jedes Moduls einlesen (Stichwort CountOfLines und
Lines()), mittels InStr() prüfen und über ReplaceLine ggfls ersetzen.
Wie es scheint, habe ich es genau so gemacht. :-)

Ich danke Dir trotzdem.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Jörg Eisenträger
2005-09-06 18:43:42 UTC
Permalink
Post by Jörg Eisenträger
ich möchte zur Laufzeit per Code in allen Modulen eines VB-Projektes
alle Vorkommen eines Strings durch einen anderen String ersetzen.
Sicher schon oft gefragt, hab aber nichts gefunden. Könnt Ihr helfen?
Durch Experimentieren mit diversen zusammengesuchten Codeschnipseln habe
ich die Lösung jetzt selbst gefunden:

Option Explicit
Sub ReplaceTextInVBA()

Dim sLine, SearchString, ReplaceString As String
Dim i, k As Long
Dim VBE As Variant 'Hier weiß ich nur den richtigen Typ nicht.

SearchString = "AlterText"
ReplaceString = "NeuerText"

For i = 1 To ThisWorkbook.VBProject.VBE.CodePanes.Count
Set VBE = ThisWorkbook.VBProject.VBE.CodePanes(i).CodeModule
With VBE
For k = 1 To .CountOfLines
sLine = .Lines(k, 1)
If InStr(sLine, SearchString) > 0 Then
sLine = Replace(sLine, SearchString, ReplaceString)
.ReplaceLine k, sLine
End If
Next k
End With
Next i

End Sub


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Melanie Breden
2005-09-06 19:04:23 UTC
Permalink
Hallo Jörg,
Post by Jörg Eisenträger
Durch Experimentieren mit diversen zusammengesuchten Codeschnipseln habe
Dim VBE As Variant 'Hier weiß ich nur den richtigen Typ nicht.
SearchString = "AlterText"
ReplaceString = "NeuerText"
For i = 1 To ThisWorkbook.VBProject.VBE.CodePanes.Count
Set VBE = ThisWorkbook.VBProject.VBE.CodePanes(i).CodeModule
den richtigen Typ der Variable VBE findest du mit einem Blick auf das
Lokalfenster heraus, während du den Code mit F8 bis zur Set-Anweisung durchläufst:

Ausdruck Typ
VBE Variant/Object/CodeModule

Allerdings kannst du die Variable nur direkt vom Typ "CodeModule" deklarieren,
wenn ein Verweis auf die entsprechende Bibliothek gesetzt ist:
"Microsoft Visual Basic for Applications Extensibility 5.3"

Ohne Verweis kannst du die Variable mit dem nächst niedrigeren
Typ "Object" deklarieren.


Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Jörg Eisenträger
2005-09-06 19:20:04 UTC
Permalink
Hallo Melanie,
Post by Melanie Breden
den richtigen Typ der Variable VBE findest du mit einem Blick auf das
Ausdruck Typ
VBE Variant/Object/CodeModule
Wieder was gelernt. Danke.
Post by Melanie Breden
Allerdings kannst du die Variable nur direkt vom Typ "CodeModule" deklarieren,
"Microsoft Visual Basic for Applications Extensibility 5.3"
Nun, dann ist Variant vielleicht doch nicht so schlecht, weil ich nicht
weiß, was meine User alles so an Verweisen gesammelt oder nicht
gesammelt haben.

Bis demnächst.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Melanie Breden
2005-09-06 20:00:14 UTC
Permalink
Hallo Jörg,
Post by Jörg Eisenträger
Wieder was gelernt. Danke.
Bittesehr :-)
Post by Jörg Eisenträger
Post by Melanie Breden
Allerdings kannst du die Variable nur direkt vom Typ "CodeModule" deklarieren,
"Microsoft Visual Basic for Applications Extensibility 5.3"
Nun, dann ist Variant vielleicht doch nicht so schlecht, weil ich nicht
weiß, was meine User alles so an Verweisen gesammelt oder nicht
gesammelt haben.
Bei Variant kannst du nie zu 100% sicher sein, was Excel sich aussucht :-(
Post by Jörg Eisenträger
Ohne Verweis kannst du die Variable mit dem nächst niedrigeren
Typ "Object" deklarieren.
Mit freundlichen Grüssen
Melanie Breden
--
- Microsoft MVP für Excel -
Microsoft Excel - Die ExpertenTipps http://tinyurl.com/cmned
Das Excel-VBA Codebook http://excel.codebooks.de
Excel-Auftragsprogrammierung
Jörg Eisenträger
2005-09-08 18:12:48 UTC
Permalink
Post by Jörg Eisenträger
Durch Experimentieren mit diversen zusammengesuchten Codeschnipseln habe
Zu früh gefreut. Das Suchen und Ersetzen wird nur ausgeführt, wenn
mindestens eins der Module im VBA-Editor geöffnet ist.

Wenn ich den folgenden Code in die personl.xls kopiere und dann auf eine
andere geöffnete Datei anwenden will, passiert nichts. Ich muss erst in
den VBA-Edior gehen, dort ein Modul des Projekts der geöffneten Datei
öffnen und das Makro dann starten. Dann funktioniert es.


Hallo Ihr da draußen,

habt Ihr eine Erklärung? Lösung?
Post by Jörg Eisenträger
Option Explicit
Sub ReplaceTextInVBA()
Dim sLine, SearchString, ReplaceString As String
Dim i, k As Long
Dim VBE As Object
SearchString = "AlterText"
ReplaceString = "NeuerText"
For i = 1 To ActiveWorkbook.VBProject.VBE.CodePanes.Count
Set VBE = ActiveWorkbook.VBProject.VBE.CodePanes(i).CodeModule
With VBE
For k = 1 To .CountOfLines
sLine = .Lines(k, 1)
If InStr(sLine, SearchString) > 0 Then
sLine = Replace(sLine, SearchString, ReplaceString)
.ReplaceLine k, sLine
End If
Next k
End With
Next i
End Sub
Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Stefan Onken
2005-09-12 17:09:54 UTC
Permalink
hallo Jörg,
ich habe den Code mal ausprobiert. Dazu habe ich den Code in Mappe1
kopiert, und dann in Mappe2 ein kleines Makro angelegt, das "AlterText"
enthält.

Durch ReplaceTextInVBA wird dieses AlterText auch gefunden und ersetzt,
aber: auch das AlterText in ReplaceTextInVBA wird ersetzt, obwohl der
Code nicht in einem Modul des ActiveWorkbook ist! Dh, durch die Zuweisung
VBProject.VBE.CodePanes werden alle VBProjekte durchsucht, nicht nur das
des ActiveWorkbook.
Evtl kommt daher das Nicht-funktionieren.

Probiers stattdessen zB so:

For Each VBComp In ActiveWorkbook.VBProject.VBComponents
With VBComp.codemodule
For k = 1 To .CountOfLines
sLine = .Lines(k, 1)

usw

Gruß
stefan

, das Jörg Eisenträger schrieb in der newsgroup
Post by Jörg Eisenträger
Post by Jörg Eisenträger
Durch Experimentieren mit diversen zusammengesuchten Codeschnipseln
habe
Zu früh gefreut. Das Suchen und Ersetzen wird nur ausgeführt, wenn
mindestens eins der Module im VBA-Editor geöffnet ist.
Wenn ich den folgenden Code in die personl.xls kopiere und dann auf eine
andere geöffnete Datei anwenden will, passiert nichts. Ich muss erst in
den VBA-Edior gehen, dort ein Modul des Projekts der geöffneten Datei
öffnen und das Makro dann starten. Dann funktioniert es.
Hallo Ihr da draußen,
habt Ihr eine Erklärung? Lösung?
Post by Jörg Eisenträger
Option Explicit
Sub ReplaceTextInVBA()
Dim sLine, SearchString, ReplaceString As String
Dim i, k As Long
Dim VBE As Object
SearchString = "AlterText"
ReplaceString = "NeuerText"
For i = 1 To ActiveWorkbook.VBProject.VBE.CodePanes.Count
Set VBE = ActiveWorkbook.VBProject.VBE.CodePanes(i).CodeModule
With VBE
For k = 1 To .CountOfLines
sLine = .Lines(k, 1)
If InStr(sLine, SearchString) > 0 Then
sLine = Replace(sLine, SearchString,
ReplaceString)
Post by Jörg Eisenträger
.ReplaceLine k, sLine
End If
Next k
End With
Next i
End Sub
Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
--
Immer auf dem aktuellen Stand mit den Newsgroups von freenet.de:
http://newsgroups.freenet.de
Jörg Eisenträger
2005-09-12 21:26:33 UTC
Permalink
Post by Stefan Onken
For Each VBComp In ActiveWorkbook.VBProject.VBComponents
With VBComp.codemodule
For k = 1 To .CountOfLines
sLine = .Lines(k, 1)
usw
Ja, so geht es. Danke, Stefan.


Gruß
Jörg
--
LPs auf CD brennen - so geht's: http://www.joergei.de/
E-Mail-Adresse existiert, wird aber nicht gelesen.
Loading...