Discussion:
Tabelle aufbereiten mit suchen/ersetzen
(zu alt für eine Antwort)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo,

ich muss aus einer Tabelle überflüssige Leerzeichen bzw. Absatzmarken
und/oder Tabstops entfernen. Mein Problem ist, dass es zum Beispiel vor oder
nach einem Tabstop mehrere zu entfernende Leerzeichen gibt. Daher müßte das
Makro bis zur Anweisung ActiveDokument.Range.select sich mehrmals wiederholen
oder so lange arbeiten bis nichts mehr zu ersetzen geht. Wie kann ich die
Wiederholung steuern?

Kann der Code noch verbessert werden, besonders nach
ActiveDokument.Range.select, da hier nur der Recorder aufgezeichnet hat?

Code:
Sub tabelle()
With ActiveDocument.Range.Find
.Text = "^t "
.Replacement.Text = "^t"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = " ^t"
.Replacement.Text = "^t"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = "^t^a"
.Replacement.Text = "^t"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = "^t:^t"
.Replacement.Text = ":"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = "^a^t"
.Replacement.Text = "^t"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = "^a "
.Replacement.Text = "^a"
.Execute Replace:=wdReplaceAll
End With

With ActiveDocument.Range.Find
.Text = " ^a"
.Replacement.Text = "^a"
.Execute Replace:=wdReplaceAll
End With

ActiveDocument.Range.Select

Selection.ConvertToTable Separator:=wdSeparateByTabs, NumColumns:=9, _
NumRows:=14, Format:=wdTableFormatNone, ApplyBorders:=True, ApplyShading _
:=True, ApplyFont:=True, ApplyColor:=True, ApplyHeadingRows:=True, _
ApplyLastRow:=False, ApplyFirstColumn:=True, ApplyLastColumn:=False, _
AutoFit:=False
Selection.Cells.HeightRule = wdRowHeightAuto
With Selection.Rows
.Alignment = wdAlignRowLeft
.AllowBreakAcrossPages = True
.SetLeftIndent LeftIndent:=CentimetersToPoints(0), RulerStyle:= _
wdAdjustNone
End With
Selection.Cells.AutoFit
End Sub

Danke für eure Hilfe!
Gruß Dietmar
Helmut Weber
vor 18 Jahren
Permalink
Hallo Dietmar,

Sub Macro8()
With ActiveDocument.Range.Find
.Text = " {1;}^9" ' deutsch! englisch = " {1,}^9" !!!
.Replacement.Text = "^9"
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
.Text = "^9 {1;}"
.Replacement.Text = "^9"
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With
End Sub

Also:
ein oder mehrere Leerzeichen vor Tab ersetzen mit Tab
ein oder mehrere Leerzeichen nach Tab ersetzen mit Tab.

"^a" ist wohl schon recht alt (Word 95)
Seit Word 97 ist es "^p", wenn ich mich recht erinnere.

Ultimativ: http://www.gmayor.com/replace_using_wildcards.htm

Achtung auf "deutsch! englisch" siehe oben.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Helmut,
danke für deine Hilfe. Es klappt wie immer!
Post by Helmut Weber
"^a" ist wohl schon recht alt (Word 95)
Seit Word 97 ist es "^p", wenn ich mich recht erinnere.
Es ist noch Word97; sorry , ich vergaß den Hinweis.

Ich habe den Code jetzt angepaßt und es läuft prima. Damit die Umwandlung in
eine Tabelle funktioniert, mußte ich ^13 durch ^a ersetzen.

Dabei hatte ich die Idee, ob es möglich wäre, den aufbereiteten Text direkt
in eine csv-Datei (die dann von php ausgelesen werden soll) zu verwandeln.
Spaltentrenner im Text ist ^9 und in der csv-Datei "," (Texttrenner="").
Würde so etwas mit Word97 gehen?

Gruß Dietmar
Helmut Weber
vor 18 Jahren
Permalink
Hallo Dietmar,
Post by Dietmar Feuerer
Dabei hatte ich die Idee, ob es möglich wäre, den aufbereiteten Text direkt
in eine csv-Datei (die dann von php ausgelesen werden soll) zu verwandeln.
Spaltentrenner im Text ist ^9 und in der csv-Datei "," (Texttrenner="").
sicher.
Ein bisschen mit Suchen und Ersetzen experimentieren.
Je nach Daten und abhängig von Suchen mit oder ohne
Wildcards (Platzhalterzeichen) kann es aber ein wenig kompliziert werden,
wenn auch in den Feldern Kommas vorkommen.

Und mit CSV-Dateien (comma seperated values)
gibt es immer wieder Problemchen, wenn Fragen
der Lokalisierung mitspielen (Deutsch wieder Semikolon).
--
Gruss
Helmut Weber, MVP WordVBA
"red.sys" & chr(64) & "t-online.de"
Word 2002, Windows 2000 (german versions)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Helmut,
der csv-Texttrenner bereitet mir ein Problem. Gibt es eine Möglichkeit das
"-Zeichen zu ersetzen. Auf deinem Link ist das "-Zeichen nicht aufgeführt.

Die doppelten "-Zeichen werden beanstandet.
With ActiveDocument.Range.Find
.Text = "^13"
.Replacement.Text = ""^a""
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With

Gruß Dietmar
Helmut Weber
vor 18 Jahren
Permalink
Hallo Dietmar,

zum Beispiel so, hier bei mir:

With ActiveDocument.Range.Find
.Text = "^13"
.Replacement.Text = """^p"""
' jeweils drei Anführungen, ^p bei mir
.MatchWildcards = True
.Execute Replace:=wdReplaceAll
End With

Aber eine Absatzmarke in Anführungen einzuschließen,
ist wohl keine so überzeugende Idee.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Thomas Gahler
vor 18 Jahren
Permalink
Hallo Helmut
Hallo Dietmar,
Post by Helmut Weber
.Replacement.Text = """^p"""
' jeweils drei Anführungen, ^p bei mir
Oder mit Chr$() arbeiten

- .Replacement.Text = chr$(34) & "^p" & chr$(34)
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Helmut Weber
vor 18 Jahren
Permalink
Hallo Thomas,
Hallo Dietmar,

mir gefallen die drei Anführungszeichen
hintereinander auch nicht. Ich dachte für
mittlere Kenntnisse ist es das Richtige.

Ich ersetze übrigens meistens gar nichts,
weil da häufig Automatismen wie Autokorrektur
aktiviert werden, was dann eventuell zu Endlosschleifen
oder wenigstens zu unerwarteten Ergebnissen führt.

Gerade bei Anführungszeichen ("Smart quotes")

Sondern ich definiere den Text des Range neu, etwa so:

Sub Macro8()
Dim rDcm As Range
Set rDcm = ActiveDocument.Range

With rDcm.Find
.Text = "x"
While .Execute
rDcm.Text = Chr(34) & "x" & Chr(34)
rDcm.Start = rDcm.End
rDcm.End = ActiveDocument.Range.End
Wend
End With
End Sub

Macht aus:
xxxxxx
"x""x""x""x""x""x"

Der Einschluss von Absatzmarken funktioniert
sowieso nicht richtig, weil man die letzte
Absatzmarke nur auf Kosten des Entstehens einer
neuen Absatzmarke einschließen kann, und so weiter ...

Ich finde auch, man sollte Suchen und Ersetzen,
wenn man es perfekt machen will, so schreiben,
dass man das Makro ein zweites Mal ausführen kann,
ohne dass was Unerwünschtes passiert.

Sicher, ziemlich theoretisch und perfektionistisch.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Helmut, hallo Thomas,
Post by Helmut Weber
mir gefallen die drei Anführungszeichen
hintereinander auch nicht. Ich dachte für
mittlere Kenntnisse ist es das Richtige.
danke, dass du mich schon so hoch einstufst, aber ich besitze eher geringere
Kenntnisse. Darum bin ich glücklich, dass ich hier immer perfekten Rat
erhalte.

Das Geheimnis mit den Anführungszeichen und der Absatzmarke ist darin
begründet, dass ich in der csv-Datei als Texttrenner Anführungszeichen
verwende, also "text". Wenn ich zum Schluss die Word-Tabelle in Text umwandle
und als Trennungszeichen das Komma verwende, kann ich nur das Komma und die
Absatzmarke nutzen, um jeweils davor und danach ein Anführungszeichen
einzufügen.
Wordtext:
1,FC Jura 05 II,2,2,0,0,9:4,+5,6
2,ASV Undorf,2,2,0,0,7:2,+5,6
3,ASV Batzhausen,2,2,0,0,6:2,+4,6

csv-Text:
"1","FC Jura 05 II","2","2","0","0","9:4","+5","6"
"2","ASV Undorf","2","2","0","0","7:2","+5","6"
"3","ASV Batzhausen","2","2","0","0","6:2","+4","6"

Die geschilderten Nebeneffekte sind nicht so schlimm, da ich im Code die
Standardanführungszeichen aktiviere bzw. deaktiviere.
.AutoFormatAsYouTypeReplaceQuotes = False

Danke für die Hilfe und
schöne Grüße aus der Oberpfalz
Dietmar
Thomas Gahler
vor 18 Jahren
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
Das Geheimnis mit den Anführungszeichen und der Absatzmarke ist darin
begründet, dass ich in der csv-Datei als Texttrenner Anführungszeichen
verwende, also "text". [...]
Hast du dir schon mal überlegt deine .csv-Datei mittels Open zu öffen und
mit LineInput einzulesen. Dann kannst du alles in einen gaaaaz langen Sting
packen und diesen String dann modifizieren. Denn String am Stük auf das
Dokument schmeissen und mittels .ConvertTextToTable umwandeln. (ist
wahscheinlich fixer als suchen/ersetzen)
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Helmut Weber
vor 18 Jahren
Permalink
Hallo Thomas,
hallo Dietmar,
Post by Thomas Gahler
Hast du dir schon mal überlegt deine .csv-Datei
mittels Open zu öffen und mit LineInput einzulesen.
Dann kannst du alles in einen gaaaaz langen Sting
packen und diesen String dann modifizieren.
das ist sicher am schnellsten, wenn man's kann.
Man muss nur gut aufpassen, was man tut.
Nun ja, man muss immer gut aufpassen. :-)

Ich hab mal für Demo-Zwecke was gestrickt,
was Kommas in Anführungen einschließt,
und gemäß meiner Forderung auch mehrmals
ausgeführt werden kann, ohne das Ergebnis zu ändern,
falls da nicht verstreute Kommas und Anführungen
sich irgendwo herumtreiben.

Cursor in Absatz stellen.

Sub Macro8()
Dim sTmp As String
Dim rTmp As Range
Set rTmp = Selection.Paragraphs(1).Range
rTmp.End = rTmp.End - 1 ' Absatzmarke weg
sTmp = rTmp.Text
sTmp = Replace(sTmp, ",", Chr(34) & "," & Chr(34))
sTmp = Chr(34) & sTmp & Chr(34) ' vorne und hinten
' nun mehrfache Ausführung behandeln
While InStr(sTmp, Chr(34) & Chr(34))
sTmp = Replace(sTmp, Chr(34) & Chr(34), Chr(34))
Wend
If sTmp <> Chr(34) Then ' wegen lerer Absätze
rTmp.Text = sTmp
End If

End Sub

Viel Spaß beim Knobeln.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Helmut und Thomas,
Post by Helmut Weber
Post by Thomas Gahler
Hast du dir schon mal überlegt deine .csv-Datei
mittels Open zu öffen und mit LineInput einzulesen.
Dann kannst du alles in einen gaaaaz langen Sting
packen und diesen String dann modifizieren.
Dann müßte neben den neuen Tabelleninhalt entweder die Tabellenüberschrift
neu eingelesen werden oder erst ab der 2. Zeile überschrieben werden. csv
kennt aber keine Textmarken oder Absatzmarken.
Die Struktur der Überschrift ist: Platz ^a^t^aVerein^a^t^a....^a^t^aPunkte^a
Dann müßte ^a^t^a durch ^t zusätzlich ersetzt werden.
Post by Helmut Weber
Ich hab mal für Demo-Zwecke was gestrickt,
was Kommas in Anführungen einschließt,
und gemäß meiner Forderung auch mehrmals
ausgeführt werden kann, ohne das Ergebnis zu ändern,
falls da nicht verstreute Kommas und Anführungen
weitere Kommas oder Absatzmarken gibt es nicht.
Post by Helmut Weber
sTmp = Replace(sTmp, ",", Chr(34) & "," & Chr(34))
Word97 kennt kein "replace"; Fehlermeldung lautet:
Sub oder Funktion nicht definiert.
Post by Helmut Weber
.Replacement.Text = chr$(34) & "^p" & chr$(34)
bei Word97 läuft es mit "^a"

Gruß Dietmar
Thomas Gahler
vor 18 Jahren
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
Post by Helmut Weber
Post by Thomas Gahler
Hast du dir schon mal überlegt deine .csv-Datei
mittels Open zu öffen und mit LineInput einzulesen.
Dann kannst du alles in einen gaaaaz langen Sting
packen und diesen String dann modifizieren.
Dann müßte neben den neuen Tabelleninhalt entweder die Tabellenüberschrift
neu eingelesen werden oder erst ab der 2. Zeile überschrieben werden. csv
kennt aber keine Textmarken oder Absatzmarken.
Es geht mir ja nur um die Frage ob du schon mal darüber nach gedacht hast.
Denn mittels String-bearbeitung hast du viel weniger Probleme als mit
Suchen/Ersetzen.

Ob dann noch die Überschrift auch noch erzeugt werden muss und andere
Sacehn, dass ist dann sekundär. Also so bleibt nur die Frage:
- willst du weg vom Suchen/Ersetzen oder dort bleiben.
Post by Dietmar Feuerer
Post by Helmut Weber
sTmp = Replace(sTmp, ",", Chr(34) & "," & Chr(34))
Sub oder Funktion nicht definiert.
Ist ja schnell gebaut ;-)))



Public Function funcZeichenErsetzen( _
ByVal CTextBasis As String, _
ByVal cTextSuche As String, _
ByVal cTextErsatz As String)
Dim iPosition As Integer

'Funktion zum Ersetzen eine Zeichenkette innerhalb einer Zeichenfolge
'durch ein andere Zeichenkette.
If UCase$(cTextSuche) = UCase$(cTextErsatz) Then
ElseIf Not (InStr(1, cTextErsatz, cTextSuche, vbTextCompare) = 0) Then
Else
If Not Len(Trim$(CTextBasis)) = 0 Then
Do While InStr(CTextBasis, cTextSuche) <> 0
iPosition = InStr(CTextBasis, cTextSuche)
CTextBasis = Mid$(CTextBasis, 1, iPosition - 1) & _
cTextErsatz & Mid$(CTextBasis, iPosition + Len(cTextSuche))
Loop
End If
End If
funcZeichenErsetzen = CTextBasis
End Function
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Thomas,
Post by Thomas Gahler
Hast du dir schon mal überlegt deine .csv-Datei
mittels Open zu öffen und mit LineInput einzulesen.
die Vorgehensweise sieht anders aus: Ich kopiere die Fussballtabelle im
Internet und füge sie in Word ein. Dann nutze ich das Makro und das Ergebnis
kopiere ich in die csv-Datei. Ich bin mir daher nicht schlüssig, ob dein
Vorschlag bei diesem Ablauf funktionieren kann.

Wenn es aber möglich ist, mittels Open + LinInput nach dem Auslesen den
Inhalt der csv-Datei mit dem neuen Tabellenstand zu ersetzen und als Ergebnis
eine fertige csv-Datei herauskommt, wäre es eine super Lösung, da sich ein
String mit php einfach bearbeiten läßt. Das übersteigt aber meine
Fähigkeiten!!!

Danke für die funktion! So einfach ist das für mich nicht!

Gruß Dietmar
Helmut Weber
vor 18 Jahren
Permalink
Hallo Dietmar,

mal was ganz anderes

man könnte auch zum Beispiel von
http://sport.msn.de/msn/fussball/1bundesliga/tabellen.html?pkq=bundesliga%20tabelle&ocid=gmgosena010

eine Tabelle gleich in ein Excel-Sheet kopieren.
Funktioniert tadellos.

Bei http://www.bundesliga.de/en/liga/index.php
ist die Tabelle nicht sauber aufgebaut.

Wenn in Ligen, wie in meiner ehemaligen,
gut meinende Amateure was zusammengebastelt haben,
wird's schwierig.
--
Gruß

Helmut Weber, MVP WordVBA

"red.sys" & chr$(64) & "t-online.de"
Win XP, Office 2003 (US-Versions)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Helmut,

die Bundesligatabelle ist einwandfrei; meine Tabelle ist leider nicht so
sauber gearbeitet, es beginnt schon damit, dass das Torverhältnis in drei
Spalten geschrieben wird, dann unzählige Leerzeichen usw. Du findest sie
unter
http://ergebnisse.bfv.de/ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=3687&filterType=vereine&geschlecht_id=1&altersklasse_id=10&spielklasse_id=0&bezirk_id=99&kreis_id=0&spieltyp_id=1&vereinsname=hohenfels&reset=1

LG Dietmar
Robert M. Franz (RMF)
vor 18 Jahren
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
die Bundesligatabelle ist einwandfrei; meine Tabelle ist leider nicht so
sauber gearbeitet, es beginnt schon damit, dass das Torverhältnis in drei
Spalten geschrieben wird, dann unzählige Leerzeichen usw. Du findest sie
unter
http://ergebnisse.bfv.de/ligaPublicErgebnisse.do?reqCode=edit&showErgebnisse=1&liga_id=3687&filterType=vereine&geschlecht_id=1&altersklasse_id=10&spielklasse_id=0&bezirk_id=99&kreis_id=0&spieltyp_id=1&vereinsname=hohenfels&reset=1
für einmal "schade", hat der Webdesigner keine Frames benutzt (nur weil
es dann für Deine Aufgabe einfacher wäre :-)).

Was ich als nicht-VBAler hier noch in die Runde werfen würde: öffne die
Datei direkt in Word (das geht über die UI, indem man direkt in den
Datei-Öffnen-Dialog die komplette URL eintippt). Hantieren wie gewohnt,
als DOC speichern, fertig. Das öffnen ist so sicher auch per VBA zu
machen ...

Gruss
Robert
--
/"\ ASCII Ribbon Campaign | MS
\ / | MVP
X Against HTML | for
/ \ in e-mail & news | Word
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Robert,
Post by Robert M. Franz (RMF)
Was ich als nicht-VBAler hier noch in die Runde werfen würde: öffne die
Datei direkt in Word (das geht über die UI, indem man direkt in den
Datei-Öffnen-Dialog die komplette URL eintippt). Hantieren wie gewohnt,
als DOC speichern, fertig. Das öffnen ist so sicher auch per VBA zu
machen ...
dann erhalte ich aber den Source-Code der ganzen Seite; da ist die Tabelle
kopieren und in Word einfügen einfacher und schneller.

Gruß,
Dietmar
Robert M. Franz (RMF)
vor 18 Jahren
Permalink
Post by Dietmar Feuerer
dann erhalte ich aber den Source-Code der ganzen Seite; da ist die Tabelle
kopieren und in Word einfügen einfacher und schneller.
Word stellt Dir das HTML-Dokument dar, nix Source-Code (ist ja auch kein
HTML-Editor). Darin kannst Du programmatisch hantieren wie in einem
normalen DOC, würde ich sagen.

Gruss
Robert
--
/"\ ASCII Ribbon Campaign | MS
\ / | MVP
X Against HTML | for
/ \ in e-mail & news | Word
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Robert,
Post by Robert M. Franz (RMF)
Word stellt Dir das HTML-Dokument dar, nix Source-Code (ist ja auch kein
HTML-Editor)
Word stellt es nicht wie ein HTML-Editor farblich unterschieden dar, aber
inhaltlich ist es deckungsgleich. Wenn ich die URL in Datei öffnen kopiere,
erhalte ich folgenden Code:
<html>
<head>
<title>bfv.de : home</title>
<meta http-equiv="content-type" content="text/html;charset=iso-8859-1">
<meta http-equiv="expires" content="0">
<META NAME="title" CONTENT="bfv.de">

Dasselbe Ergebnis erhalte ich, wenn ich mit der rechten Maus auf
"Seitenquelltext anzeigen" gehe. Vielleicht muß ich die URL anders öffnen?

Gruß Dietmar
Thomas Gahler
vor 18 Jahren
Permalink
Hallo Dietmar
Post by Dietmar Feuerer
Vielleicht muß ich die URL anders öffnen?
Schalte mal Extras / Optionen / Allgemein / Konvertierung beim öffnen
bestätigen ein, dann kannst du als 'HTML-Dokument' auswählen und es sollte
schöner kommen.
Vielleicht noch Ansicht / Weblayout aktivieren


Aber hast du nicht noch ein Word97? Kann sein dass es dort noch nciht so gut
rüber kommt.
--
Thomas Gahler
MVP für WordVBA
Co-Autor von »Microsoft Word-Programmierung.
Das Handbuch« (MS Press)


- Windows XP (SP2), Office XP (SP3)
Dietmar Feuerer
vor 18 Jahren
Permalink
Hallo Thomas, hallo Robert,
Post by Thomas Gahler
Schalte mal Extras / Optionen / Allgemein / Konvertierung beim öffnen
Das Häkchen fehlte.

Aber es geht trotzdem nicht, da die html-Datei zu verschachtelte Tabellen
enthält.
Danke für euer Bemühen.

Gruß Dietmar

Loading...