WCM Forum

WCM Forum (http://www.wcm.at/forum/index.php)
-   Software (http://www.wcm.at/forum/forumdisplay.php?f=5)
-   -   Word: VB "suchen & ersetzen" für Fortgeschrittene (http://www.wcm.at/forum/showthread.php?t=139590)

Kasparov 17.07.2004 11:16

Word: VB "suchen & ersetzen" für Fortgeschrittene
 
Liebe Gemeinde,

nomen est omen: ich würde gerne einen sehr langen Text mit englischer Schachnotation in deutsche umwandeln, z.B. "21.Qh4 Ne3" in "21.Dh4 Se3".

Also ein Makro: suche nach .Q und ersetze mit .D
so weit, so gut.

Dabei zwei Probleme:

1. Was mache ich mit solchen Sachen wie dem zweiten Teil (Ne3)? Da kann ich nicht einfach "finde N" und "ersetze mit S" sagen, denn wenn z.B. ein Spieler namens "Nemo" oder woswasi auch im Text steht, wäre der nach Makro ein "Semo" und das ist ja auch unschön.

2. Manchmal kommt im Text auch "21. Ka3" (also mit Abstand) vor, genau so wie Kommentare "Satz aus. Karl meint ..." wobei wieder die Suche nach ". K" nix bringt.

Fazit:

Am besten wäre wohl:
ersetze alle N<a bis h><1 bis 8> durch S<a bis h><1 bis 8> (Springer)
ersetze alle B<a bis h><1 bis 8> durch L<a bis h><1 bis 8> (Läufer)
ersetze alle R<a bis h><1 bis 8> durch T<a bis h><1 bis 8> (Turm)
ersetze alle Q<a bis h><1 bis 8> durch T<a bis h><1 bis 8> (Dame)

Nur wie gehts?

Besten Dank im Voraus an alle Visual Basic Experten!!! :)

reemrev 17.07.2004 13:14

Welche Version verwendest du (4,5,6)?

Ich würde mit Split den Text(=Notation) in einzlen Wörter teilen (das Leerzeichen trennt) und danach alle Wörter(=den Array) mit Länge 3 nach deinem Muster umwandeln, eventuell auch 4erNotationen einbeziehen (Tae8). Vielleicht vorher überprüfen, ob der erste Teil ein Großbuchsatbe, der letzte Teil des Wortes eine Zahl ist(ASCII)...

Array = Split(Schachnotation, " ") ' Leerzeichen als Trennzeichen

Kasparov 17.07.2004 17:33

@reemrev:
Word 2002 SP3

Kapier nicht ganz, was du meinst :confused: (bin kein Programmierer). Denke nur dass die Suche nach Wörtern mit 3 Buchstaben nicht funkt da es ja neben der eigentlichen Notation noch eine Menge Kommentare gibt, z.B.:

41.Rf4 Ke5 42.Ra4 Qf3 43.Kh2 Qf2 44.Kh1 Rh4 45.Rh4 Qh4 0-1. Nautiluschess - patc, ICS blitz, 2001.

Wie gesagt, ich hab nicht wirklich Ahnung von Programmieren, aber in der Schule - vor laaaanger laaaaaaaanger Zeit - hab ich mal ein Jahr lang Basic "gelernt". Da kann ich mich dunkel daran erinnern, bestimmte Ausdrücke als Variablen markiert zu haben.

Geht das nicht auch so?:

Für alle a, b, c, d, e, f, g, h setze die Variable X
Für alle 1, 2, 3, 4, 5, 6, 7, 8 setze die Variable Y

Dann suche nach Kombination NXY und ersetze mit SXY (Springer)
Dann suche nach Kombination BXY und ersetze mit LXY (Läufer)
Dann suche nach Kombination RXY und ersetze mit TXY (Turm)
Dann suche nach Kombination QXY und ersetze mit DXY (Dame)

reemrev 17.07.2004 17:59

Ups, dachte du machst in VisualBasic, hab' das Word übersehen.
Klar kann man so machen, was passiert aber wenn 2 gleiche Figuren auf ein Feld gestellt werden könnten? Dann hat man einen zusätzlichen Buchstaben in der Notation zb: Tae8, Sed4. Die würden nicht gefunden werden.

Kasparov 17.07.2004 18:06

@ reemrev:

stimmt, das gilt auch für geschlagene Figuren (z.B. Rxe4), aber das könnte man sicher nach dem selben Schema lösen.

Wenn du sagst das ginge so, kannst mir auch verraten, wie genau? Wie gesagt hab ich null Ahnung und müsst demnach ganz genau wissen, was ich dem editor reinklopfen soll ;)

reemrev 17.07.2004 18:06

Fällt mir was ein: alle Wörter mit den entsprechenden Großbuchstaben werden geändert, wenn sie eine Zahl enthalten (die >0 und <9 ist). Hab' aber noch nie ein Makro in Word geschrieben...

Kasparov 17.07.2004 19:33

aso, jedenfalls trotzdem danke. :bier:
vielleicht sollte ich besser mal bei "Programmieren" statt hier bei Software nachfragen.

powerman 18.07.2004 07:15

hi,
für vba den hilfeassistenten verwenden = f1 oder rechts oben die frage eingeben oder makro öffen...

flinx 18.07.2004 11:49

Quick & Dirty & ohne Gewehr:
Musst du noch für die anderen Figuren erweitern und den Fall eines Leerraumes einbauen.

Code:

Sub Suchen()
    ActiveDocument.Select
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "[1-9].R???[K,Q,R,N,B,S,L,T,D]"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    While Selection.Find.Execute   
    Selection.Text = Replace(Selection.Text, "R", "T", 1, 1)
    Wend
    ActiveDocument.Select
    Selection.Find.ClearFormatting
    With Selection.Find
        .Text = "[1-9].[K,Q,R,N,B,S,L,T,D]???R"
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchAllWordForms = False
        .MatchSoundsLike = False
        .MatchWildcards = True
    End With
    While Selection.Find.Execute
    Selection.Text = StrReverse(Replace(StrReverse(Selection.Text), "R", "T", 1, 1))
    Wend
End Sub

Edit:
[1-9].R?[1-9]?[K,Q,R,N,B,S,L,T,D] bzw.
[1-9].[K,Q,R,N,B,S,L,T,D]?[1-9]?R
wäre ev. etwas genauer. :)

Kasparov 18.07.2004 16:27

danke danke danke
 
@flinx:

hat zwar so nicht gefunkt, aber ohne deine Hilfe wär ich da in 1000 Jahren nicht draufgekommen. DANKE !!!! :D :cool: :lol:

Hab das mal geändert in:

Sub Schach()
ActiveDocument.Select
Selection.Find.ClearFormatting
With Selection.Find
.Text = "[R,Q,N,B]?[1-8]"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
While Selection.Find.Execute
Selection.Text = Replace(Selection.Text, "R", "T", 1, 1)
Selection.Text = Replace(Selection.Text, "Q", "D", 1, 1)
Selection.Text = Replace(Selection.Text, "N", "S", 1, 1)
Selection.Text = Replace(Selection.Text, "B", "L", 1, 1)
Wend
ActiveDocument.Select
Selection.Find.ClearFormatting
With Selection.Find
.Text = "[R,Q,N,B]??[1-8]"
.Forward = True
.Wrap = wdFindContinue
.Format = False
.MatchCase = False
.MatchWholeWord = False
.MatchAllWordForms = False
.MatchSoundsLike = False
.MatchWildcards = True
End With
While Selection.Find.Execute
Selection.Text = Replace(Selection.Text, "R", "T", 1, 1)
Selection.Text = Replace(Selection.Text, "Q", "D", 1, 1)
Selection.Text = Replace(Selection.Text, "N", "S", 1, 1)
Selection.Text = Replace(Selection.Text, "B", "L", 1, 1)
Wend
End Sub


... und das funkt erstklassig!
Einziger Nachteil: es ist irre langsam - woran liegt das?
Und außerdem: kann man auch gleichzeitig nach zwei Texten suchen:
.Text = "[R,Q,N,B]?[1-8]" UND
.Text = "[R,Q,N,B]??[1-8]"
... ist ja sonst das gleiche. Oder brauch ich da die ganze Wurst ein zweites Mal?

Nochmals vielen Dank!!!


Alle Zeitangaben in WEZ +2. Es ist jetzt 13:28 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
© 2009 FSL Verlag