Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: Makro schreibt Makro ( oder das Forum )
erste ungelesene Seite | letzter Beitrag 
krang

AUP krang 09.01.2008
Frage oder das Forum
Hallo zusammen,

Ich würde gerne mit Microsoft Word (nein, Latex geht [noch] nicht, da mein ChemDraw und Latex nicht zusammenarbeiten) das Verfassen eines Textes in dem viele viele Einzelkomponenten von Bildern durchnummeriert sind vereinfachen.
Dazu war ich schon so klug, zunächst sämtliche dieser Bildbestandteile in word mit einem Platzhalter zu versehen. In geschweiften klammern ist dann sowohl unter den Bilder an der richtigen Stelle als auch im Text ein {Kürzel_Name} zu finden, natürlich eindeutig zugeordnet.
Weiterhin existiert in word/excel/whatyouwant einfach eine Liste aller verwendeter Klammern in der richtigen Reihenfolge. Ich würde gerne ganz am Ende nach dem Verfassen des Textes ein Makro drüber laufen lassen, dass mir diese Platzhalter mit aufsteigenden Nummern versieht. Ein einzelnes Makro kann ich mir ja prima schreiben, aber hunderte? Und die Makros/das große Makro jedesmal ändern, wenn ich doch noch was ändern muss? Dann bin ich ja beim von Hand nummerieren schneller. Jedenfalls müsste das einzelne Makro ja zB so aussehen:
 
Code:
Sub Makro1()
'
' Makro1 Makro
'
'
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = "{SL_Ancimi1}"
        .Replacement.Text = "3"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub


Jetzt die große Frage: Kann ich ein Script haben, dass mir automatisch ein großes Makro ausgiebt in dem in der von mir aufgezeichneten Reihenfolge die Stelle .Text="{bla} und .ReplacementText="trölf" anhand meiner Liste generiert, durchnummeriert und der Makrotext neu erzeugt wird pro Eintrag? Ich hoffe, die Frage war verständlich... Breites Grinsen

Hintergrund ist: Es ändert sich in so einem umfangreichen Text auch mal was, ein Bildchen fliegt raus, ein anderes soll dazu. Und ich habe keinen Bock, zwei Tage zum von Hand nummerieren oder gar ändern zu verbringen. Zumal der Text fertig formatiert abgegeben werden soll bevor Änderungswünsche an mich herangetragen werden. Ich weiss, es suckt mit word, aber auf Grund ChemDraw und MNova, die word-plugins besitzen, bin ich da mit Latex an anderer Stelle angeschissen.

Danke schonmal, google half mir bisher nicht viel...
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von krang am 13.03.2015 18:42]
13.03.2015 18:37:05  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Arcus

AUP Arcus 26.11.2007
Prinzipiell kannst du mit VBA-Makros auch weitere VBA-Makros schreiben; wenn ich dich richtig verstehe willst du aber eher soetwas (quick'n'dirty & ungetestet):

 
Code:
public sub replaceAll()
	dim searchStrings, _
		replacementStrings, _
		l as long
		
	set searchStrings = Array("suche1", "suche2")
	set replacementStrings = Array("ersetzen1", "ersetzen2")
	
	for l=0 to ubound(searchstrings)
		replaceIt searchStrings(l), replacementStrings(l)
	next l
end sub


private sub replaceIt(searchStr as string, replacementStr as string)
	Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = searchStr
        .Replacement.Text = replacementStr
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
end sub


- anstatt der Arrays für Such- und Ersetz-Strings kannst du natürlich auch direkt auf deine jeweilige Liste zugreifen.
15.03.2015 15:05:11  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
krang

AUP krang 09.01.2008
...
Ah, geil, ja das klingt super. An array konnte ich mich echt nicht erinnern. Mein letztes mal VB dürfte grob 16 Jahre her sein. Breites Grinsen

Wenn ich Dich richtig verstehe muss ich ja gerade noch meine Platzhalter unter
 
Code:
set searchStrings = Array("{bla1}","{bla2}", usw...)

eintragen, oder? Die Frage ist noch, ob ich ihm dann drunter mit den replacement einträgen einfach die zahlen von 1 bis x hinwerfen soll?!

Vielen Dank schonmal! <3

Wenn's dann tut: brauchst nen Benderupload? peinlich/erstaunt mit den Augen rollend

/e: Er markiert die Zeile
 
Code:
replaceIt searchStrings(l), replacementStrings(l)


und meint: "Argumenttyp ByRef unverträglich" Mata halt...

/e2: Wenn ich die beiden Variablen anders deklariere funktioniert es auch nicht traurig
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von krang am 16.03.2015 11:31]
16.03.2015 10:02:56  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
krang

AUP krang 09.01.2008
Pfeil
Nach viel viel google, so läufts:

 
Code:
Sub replaceAll()
      Dim searchStrings As Variant
      Dim replacementStrings As Variant
      Dim MyRange As Range
      Dim i As Long
      Dim pos As Long
        
    searchStrings = Array("{SL_EpiD}", "{SL_EpiHWE}", "{EpiAld}", [VIELE EINTRÄGE} "{AuxiBEtH2}")
    replacementStrings = Array(1, [GLEICHE ANZAHL AN ZAHLEN])
    
    Set MyRange = ActiveDocument.Range
    pos = MyRange.Start
    For i = LBound(searchStrings) To UBound(searchStrings)
        MyRange.Start = pos
        With MyRange.Find
            .Text = searchStrings(i)
            .Replacement.Text = replacementStrings(i)
            .Forward = True
            .Execute Replace:=wdReplaceAll
        End With
    Next
End Sub


Es gibt, glaube ich, irgendwie auch die Möglichkeit, die Einträge eines arrays zu zählen. Mit dem Eintrag könnte man dann ja das zweite Array füllen, aber erstmal tuts so. <3
17.03.2015 10:54:32  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Arcus

AUP Arcus 26.11.2007
Sorry, hab gar nicht mehr hier rein gesehen :-/

Im quick & dirty war tatsächlich ein fehler (arrays sind in vba keine objekte...) - so geht's
 
Code:
Public Sub replaceAll()
    Dim searchStrings, _
        replacementStrings, _
        l As Long
        
    searchStrings = Array("suche1", "suche2")
    replacementStrings = Array("ersetzen1", "ersetzen2")
    
    For l = 0 To UBound(searchStrings)
        replaceIt searchStrings(l), replacementStrings(l)
    Next l
End Sub


Private Sub replaceIt(ByVal searchStr As String, ByVal replacementStr As String)
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = searchStr
        .Replacement.Text = replacementStr
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
End Sub




Wenn du die Begriffe nur durch zahlen ersetzen willst kannst du die replaceAll Funktion folgendermaßen vereinfachen:
 
Code:
Public Sub replaceAllByNumbers()
    Dim searchStrings, _
        l As Long
        
    searchStrings = Array("suche1", "suche2")
    
    For l = 0 To UBound(searchStrings)
        replaceIt searchStrings(l), (l + 1)
    Next l
End Sub

l wird ohnehin numerisch hochgezählt - du musst nur eins addieren, da bei 0 begonnen wird
[Dieser Beitrag wurde 2 mal editiert; zum letzten Mal von Arcus am 11.05.2015 20:38]
11.05.2015 20:34:13  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
krang

AUP krang 09.01.2008
...
ah das is super sonst muss ich nach ner Änderungen zählen und von Hand Zahlen hinzu fügen oder raus nehmen.
Vielen lieben Dank nochmals
11.05.2015 20:41:53  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
krang

AUP krang 09.01.2008
...
Zusatzbemerkung:
Das Script läuft so dreimal so schnell durch, da er nicht zwei Arrays einander zuordnen muss sondern einfach hochzählt. Jops, funktioniert prima, nochmals vielen Dank!
13.05.2015 10:30:11  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Arcus

AUP Arcus 26.11.2007
 
Zitat von krang

Zusatzbemerkung:
Das Script läuft so dreimal so schnell durch, da er nicht zwei Arrays einander zuordnen muss sondern einfach hochzählt. Jops, funktioniert prima, nochmals vielen Dank!


Bin mir nicht ganz sicher, ob das auch in Word existiert (gerade nur mobil unterwegs): in Excel kannst du über Application.screenupdating die (wer hätte es gedacht?) Anzeige-Aktualisierung de-/aktivieren. Das ist in der Regel der massive Zeitfresser und beschleunigt so manches Makro enorm. Du müsstest selbiges vor der for-Schleife also nur auf false und hinterher wieder auf true setzen.
13.05.2015 18:02:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: Makro schreibt Makro ( oder das Forum )


mods.de - Forum » Webdesign & Coding » 

Hop to:  

| tech | impressum