Word-Tabelle und Zeilenumbrüche?

Binat

Grünschnabel
Huhu,
ich sitz hier grad rum und versuche eine Automatisierung zu programmieren, die es einem ermöglicht Daten von einer x-beliebigen Programmiersprache über VBA in ein Worddokument zu konvertieren.

Ist ja eigentlich auch grarnicht so schwer, wenn da das Wort "wenn" nicht wäre. Alles in allem ist das Programm recht einfach aufgebaut. Ich lasse mir von der einen Sprache eine *.csv Datei ausgeben mit 2 Datensätzen pro Reihe ... "%BEISPIEL%";"Hier ist ein\nZeilenumbruch!"

Ich lese das Zeilenweise ein, trenne mit Split(). Ersetze das "\n" durch ein chr(13), weil Word ja generell zwei Sonderzeichen für vbNewLin, vbCLrF sowie ein Sonderzeichen für chr(10) macht, anstatt einfach mal die Zeile zu beenden. Aber Carrige Return ist ja auch nichts böses ^^. Wenn ich nun im Worddokument nach %BEISPIEL% suche, kann ich problemlos dies durch folgenden Text ersetzen (natürlich durch alles andere auch):

Hier ist ein
Zeilenumbruch!

Nun habe ich aber eine Kopfzeile in meinem Worddokument. Genau diese soll nun automatisiert werden, so dass ich direkt über ein Skript ein Worddokument erstellen kann ohne lästiger Weise immer alles abzuschreiben. Mein ganzes schönes Programm funktioniert solang bis ich von ihm ein Zeilenumbruch fordere, denn meine Kopfzeile besteht aus einer, sehr einfach gehaltenen Tabelle. Also keine Verschachtelung oder ähnliches. Ganz plötzlich wirft er egal welche der 4 Methoden, die ich kenne um ein Absatz zu machen, nur ein Sonderzeichen aus. Warum? Irgendwo ist doch ein Fehler. Habt ihr eine alternativ Idee?

Code:
Private Function trennung(ersetzung As String) As String
Dim a As String 'String-Teilbereich 1
Dim b As String 'String-Teilbereich 2

'es wird nach "\n" gesucht um ein Zeilenumbruch einzufügen
Do
    If InStr(ersetzung, "\n") > 0 Then
            a = Left(ersetzung, (InStr(ersetzung, "\n") - 1))
            b = Right(ersetzung, (Len(ersetzung) - (InStr(ersetzung, "\n") + 1)))
            ersetzung = a & Chr(13) & b 
    End If

Loop Until (InStr(ersetzung, "\n") = 0)
   
  
 trennung = ersetzung
    
End Function

Mit lieben Grüßen Thomas
 
Ich habe Deine Funktion mal getestet läuft einwandfrei. Ich bekomme auch keine kryptischen Zeichen sondern genau das was du schilderst.

Aber leider verstehe ich Dein Problem mit der Wordtabelle nicht und in welchem Zusammenhang sie mit der von Dir geposteten Funktion steht.

Grüsse bb
 
DIESEN BEITRAG BITTE LÖSCHEN HAB MICH VERDRÜCKT BEIM KORRIGIEREN.. ^^ danke

Du kannst ja einfach mal ein Worddokument öffnen. Dort fügst du nun eine Tabelle ein. (Die Größe ist vollkommen egal) In irgendeine Zelle schreibst du nun %TEST% und bindest eine Datei ein die wie folgt lautet: "%TEST%";"Hier sollte ein \n Zeilenumbruch sein!" ein.

Das Ergebnis davon wird sein, dass du nicht das siehst:

Hier sollte ein
Zeilenumbruch sein!

sondern:

Hier sollte ein []ein Zeilenumbruch sein!

(das [] steht für das kleine Kästchen, was ich hier im Forum nicht einfügen kann)

Hier ist mal das vollständige Modul:
Code:
Option Explicit
Private temp As String
Private splitTemp() As String
Private werte() As String
Private platzhalterHTML() As String
Private x As Integer 'Zähler- und Hilfsvariable

Public Sub mainSub()

'Auslesen der Datei und Verarbeiten der Daten
leseDaten


#setzen Veränderungen des Textes durch Textvergleich mit platzhalterHTML [HTML--> Text zu Word-Text]
vergleicheDaten


End Sub


Private Sub leseDaten()

x = 0 'x wird 0 gesetzt damit bei Inkrementierung kein Fehler entsteht

Open "C:\test1.txt" For Input As #1 'öffnen einer SEQUIENTELLEN Datei auf dem Kanal 1
While Not EOF(1) 'auslesen der ganzen Datei [EOF(1) = EndOfFile von Kanal 1]    
    Line Input #1, temp 'auslesen von ganzer Zeile
    splitTemp() = Split(temp, """;""", 2) 'Refferenz = temp, Delimiter = "," Limit der Trennungen = 1
    splitTemp(0) = Right(splitTemp(0), (Len(splitTemp(0)) - 1)) 'entfernt das erste "
    splitTemp(1) = Left(splitTemp(1), (Len(splitTemp(1)) - 1)) 'entfernt das letzte "    x = x + 1
    ReDim Preserve werte(x) 'werte() wird neu gesetzt, die Daten aber gehalten    ReDim Preserve platzhalterHTML(1 To x) 'platzhalterHTML() wird neu gesetzt, die Daten aber gehalten    platzhalterHTML(x) = splitTemp(0) 'Übergabe des PlatzhaltersHTML [wird nachher zum Vergleichen genutzt]
    werte(x) = splitTemp(1) 'Übergabe des Wertes
         
Wend
Close #1

End Sub

Private Sub vergleicheDaten()


    
    For x = 1 To UBound(platzhalterHTML)
        
           ersetzePlatzhalter platzhalterHTML(x), werte(x)
        
    Next x
    


End Sub


Private Sub ersetzePlatzhalter(platzhalter As String, ersetzung As String)
    
    'ActiveDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader 'öffnet Kopfzeile
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = platzhalter 'Parameter für zu ändernten Wert
        .Replacement.Text = trennung(ersetzung) 'Übergabe in die Korrekturfunktion
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
   'ActiveDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument 'schließt Kopfzeile
    
End Sub

Private Function trennung(ersetzung As String) As String
Dim a As String 'String-Teilbereich 1
Dim b As String 'String-Teilbereich 2

'es wird nach "\n" gesucht um ein Zeilenumbruch einzufügen
Do
    If InStr(ersetzung, "\n") > 0 Then
            a = Left(ersetzung, (InStr(ersetzung, "\n") - 1))
            b = Right(ersetzung, (Len(ersetzung) - (InStr(ersetzung, "\n") + 1)))
            ersetzung = a & Chr(13) & b 
    End If

Loop Until (InStr(ersetzung, "\n") = 0)
   
  
 trennung = ersetzung
    
End Function

Mit lieben Grüßen Thomas
 
Zuletzt bearbeitet:
Du kannst ja einfach mal ein Worddokument öffnen. Dort fügst du nun eine Tabelle ein. (Die Größe ist vollkommen egal) In irgendeine Zelle schreibst du nun %TEST% und bindest eine Datei ein die wie folgt lautet: "%TEST%";"Hier sollte ein \n Zeilenumbruch sein!" ein.

Das Ergebnis davon wird sein, dass du nicht das siehst:

Hier sollte ein
Zeilenumbruch sein!

sondern:

Hier sollte ein []ein Zeilenumbruch sein!

(das [] steht für das kleine Kästchen, was ich hier im Forum nicht einfügen kann)

Hier ist mal das vollständige Modul:
Code:
Option Explicit
Private temp As String
Private splitTemp() As String
Private werte() As String
Private platzhalterHTML() As String
Private x As Integer 'Zähler- und Hilfsvariable

Public Sub mainSub()

'Auslesen der Datei und Verarbeiten der Daten
leseDaten


#setzen Veränderungen des Textes durch Textvergleich mit platzhalterHTML [HTML--> Text zu Word-Text]
vergleicheDaten


End Sub


Private Sub leseDaten()

x = 0 'x wird 0 gesetzt damit bei Inkrementierung kein Fehler entsteht

Open "C:\test1.txt" For Input As #1 'öffnen einer SEQUIENTELLEN Datei auf dem Kanal 1
While Not EOF(1) 'auslesen der ganzen Datei [EOF(1) = EndOfFile von Kanal 1]    
    Line Input #1, temp 'auslesen von ganzer Zeile
    splitTemp() = Split(temp, """;""", 2) 'Refferenz = temp, Delimiter = "," Limit der Trennungen = 1
    splitTemp(0) = Right(splitTemp(0), (Len(splitTemp(0)) - 1)) 'entfernt das erste "
    splitTemp(1) = Left(splitTemp(1), (Len(splitTemp(1)) - 1)) 'entfernt das letzte "
    x = x + 1
    ReDim Preserve werte(x) 'werte() wird neu gesetzt, die Daten aber gehalten    
    ReDim Preserve platzhalterHTML(1 To x) 'platzhalterHTML() wird neu gesetzt, die Daten aber gehalten    
    platzhalterHTML(x) = splitTemp(0) 'Übergabe des PlatzhaltersHTML [wird nachher zum Vergleichen genutzt]
    werte(x) = splitTemp(1) 'Übergabe des Wertes
         
Wend
Close #1

End Sub

Private Sub vergleicheDaten()


    
    For x = 1 To UBound(platzhalterHTML)
        
           ersetzePlatzhalter platzhalterHTML(x), werte(x)
        
    Next x
    


End Sub


Private Sub ersetzePlatzhalter(platzhalter As String, ersetzung As String)
    
    'ActiveDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader 'öffnet Kopfzeile
    Selection.Find.ClearFormatting
    Selection.Find.Replacement.ClearFormatting
    With Selection.Find
        .Text = platzhalter 'Parameter für zu ändernten Wert
        .Replacement.Text = trennung(ersetzung) 'Übergabe in die Korrekturfunktion
        .Forward = True
        .Wrap = wdFindContinue
        .Format = False
        .MatchCase = False
        .MatchWholeWord = False
        .MatchWildcards = False
        .MatchSoundsLike = False
        .MatchAllWordForms = False
    End With
    Selection.Find.Execute Replace:=wdReplaceAll
   'ActiveDocument.ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument 'schließt Kopfzeile
    
End Sub

Private Function trennung(ersetzung As String) As String
Dim a As String 'String-Teilbereich 1
Dim b As String 'String-Teilbereich 2

'es wird nach "\n" gesucht um ein Zeilenumbruch einzufügen
Do
    If InStr(ersetzung, "\n") > 0 Then
            a = Left(ersetzung, (InStr(ersetzung, "\n") - 1))
            b = Right(ersetzung, (Len(ersetzung) - (InStr(ersetzung, "\n") + 1)))
            ersetzung = a & Chr(13) & b 
    End If

Loop Until (InStr(ersetzung, "\n") = 0)
   
  
 trennung = ersetzung
    
End Function

Achja einfach zum Testen mal das Öffnen und Schließen des Headers auskommentieren, weil wie ich nach weiteren Tests gemerkt habe, ist das ein Tabellen und nicht Header spezifisches Problem

Mit lieben Grüßen Thomas
 
Zuletzt bearbeitet:
Ok jetzt habe ich dein Problem verstanden.

Versuch mal folgendes :

Statt chr(13) erstetzt du das \n mit einem vblf / oder vbCr

dann sollte es funktionieren


Ich kann es leider nicht testen. Habe auf meinem Homesystem kein word kein vb kein microsoft ^^


Grüsse bb
 
Ich denke das Ergebnis ist recht deutlich und klar ... ^^

ob ich nun chr(10) oder vbLf sowie chr(13) oder vbCr schreibe, dass interessiert ihn nicht. Ich versteh es einfach nicht. Finde aber auch kein ordentliche Informationsquelle, wie ich Wordtabellen behandeln soll/muss.

Gruße Thomas
 
Leider hilft mir dein Mitgefühl nur seelisch, leider nicht virtuell ....

... aber ich bin ja kreativ. Textfeld ist mein neuer werdenter Freund. Problem nur er öffnet sich mir nicht. Weiß jmd eine Möglichkeit wie ich mit meiner Suche nach bestimmten Wörtern über ein Makro auch in Textfeldern suche kann?

Ich brauch eigentlich nur den Befehl für Textfeld öffnen und Textfeld schließen.

Grüße Thomas
 
Hier ist eine ... mit allen 3 Fällen ... zum erstmaligen Testen sollte aber wie gesagt, der Aufruf vom Header deaktiviert werden, weil man dann schön sehen kann, dass der Wechsel mit dem Zeilenumbruch sehr schön funktioniert.

Gruß Thomas
 

Anhänge

Zurück