drwalemc
Goto Top

Mit Makro Adresse nach Word kopieren

Hallo zusmmen

Ich habe ien Frage Bezüglich Makro. Ich habe den auftrage bekommen ein Makro zu schreiben das aus einer Excelliste eine Adresse in ein Worddokument su schrieben. Wenn man das Makro startet, sollte eine Maske erscheinen wo ich nach einer Adresse suchen kann und diese anschliessen in ein Worddokument kopiert wird. Ich bin leider kein Makro/VBS Guru. Ich bitte doch jemand mir einen kurzen Imput zu geben wie ich am besten beginnen soll, ond ob es vielleicht mögliche Vorlagen gibt.
Besten dank im voraus

Gruss drwalemc

Content-ID: 136027

Url: https://administrator.de/contentid/136027

Ausgedruckt am: 05.11.2024 um 18:11 Uhr

H41mSh1C0R
H41mSh1C0R 16.02.2010 um 08:55:08 Uhr
Goto Top
Hallo,

Wie stehen die Adressdaten in der Exceldatei? Zeilenweise?
Ist die Zielworddatei fix oder soll das variabel sein?

Ablauf:

- Erstelle ein Userform (inkl. Sucheditfeld + Button)
- falls die Worddatei fix ist, zur Schreibengenerierung machen sich Vorlagen/Templates gut, definieren an der Stelle wo die Adresse rein soll eine Textmarke Adresse
- Klicke auf Excel VBA Seite auf den Button in deinem Userform und fülle die Funktion mit Leben =)

was brauchst du alles:

- Verweis() -> um in der Spalte/Zeile zu suchen
- Wenn du die passende Spalte/Zeile ausgelesen hast schreibe alles was du brauchst in ein Feld oder einzel Variablen
- danach dokument öffnen

Documents.Open FileName:="E:\Testordner\test.doc"  

danach zu Textmarke/n springen

http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0036.shtml

danach Text einfügen
Selection.Font.Size = 12 
Selection.TypeText Text:="Hier kommt der kopierte Text rein!"   
Selection.TypeParagraph
Grüße
76109
76109 17.02.2010 um 00:19:15 Uhr
Goto Top
Hallo drwalemc!

Hier mal ein einfaches Beispiel mit Namenseingabe in einer InputBox im Word-Document.

Exceltabelle Test.xls mit folgendem Inhalt:
A B C D
1 Name Straße Plz Ort
2 Max Mustermann Musterstr. 1 47110 Musterstadt0
3 Jan Mustermann Musterstr. 2 47111 Musterstadt1
4 Tim Mustermann Musterstr. 3 47112 Musterstadt2

Eingabe z.B. des Namens "jan mustermann" in der InputBox in Word
Ausgabe an aktueller Cursorposition in Word:

Jan Mustermann

Musterstr. 2
47111 Musterstadt2

Quelltext in ein Modul in Word (Vorlage Normal) einfügen und Konstanten entsprechend anpassen:
Option Explicit

Const ExcelDatei = "X:\Test\Test.xls"  
Const ExcelTabelle = "Tabelle1"  

Const AdrName = "A"         'Excel-Spalte Namen  
Const AdrStr = "B"          'Excel-Spalte Straße  
Const AdrPlz = "C"          'Excel-Spalte Postleitzahl  
Const AdrOrt = "D"          'Excel-Spalte Ort  

Const xlWhole = 1           'Excel-Konstanten  
Const xlValues = -4163

Sub GetAddress()
    Dim Search As String, Text As String
    
    If CreateObject("Scripting.FileSystemObject").FileExists(ExcelDatei) = False Then  
        MsgBox "Die Excel-Datei wurde nicht gefunden!", vbExclamation, "Fehler"  
        Exit Sub
    End If

    Search = InputBox("Bitte einen Namen eingeben", "Suchen")  
    
    If Search = "" Then Exit Sub  
    
    Text = GetExcelDaten(Search)
    
    If Text = "" Then  
        MsgBox "Der Name wurde nicht gefunden!", vbInformation, "Suchergebnis"  
    Else
        Selection.TypeText Text
    End If
End Sub

Private Function GetExcelDaten(ByRef Search) As String
    Dim Wks As Object, Found As Object
    
    Set Wks = GetObject(ExcelDatei).Sheets(ExcelTabelle)
    
    Set Found = Wks.Columns(AdrName).Find(Search, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
    
    If Not Found Is Nothing Then
        With Wks.Rows(Found.Row)
            GetExcelDaten = .Columns(AdrName) & vbCrLf & vbCrLf & _
                            .Columns(AdrStr) & vbCrLf & _
                            .Columns(AdrPlz) & " " & .Columns(AdrOrt) & vbCrLf & vbCrLf  
        End With
    End If
    
    Application.DisplayAlerts = False
    GetObject(ExcelDatei).Close True
    Application.DisplayAlerts = True
End Function
An beliebiger Cursorposition in Word das Makro starten:
<Extras><Makro><Makros><GetAddress><Ausführen><Namen eingeben><OK>

Gruß Dieter

[edit] Die Prüfung der Pfadangabe der Excel-Datei noch hinzugefügt [/edit]
drwalemc
drwalemc 17.02.2010 um 09:32:38 Uhr
Goto Top
Hallo zusammen

Danke für die schnellen Antworten...

@Dieter

Habe das man mit deiner Anleitung getestet, ich kan auch nach einen namen Suchen danach erhalte ich aber einen Laufzeitfehler 5. Die Fehlerzeile ist die 33.

Set Wks = GetObject(ExcelDatei).Sheets(ExcelTabelle)

Ich kan leider nich nachvollziehen wiso das dieser fehler kommt....

Weist du zufällig wo ich einen Fehler gemacht habe???

Gruss dr.walemc
76109
76109 17.02.2010 um 10:16:40 Uhr
Goto Top
Hallo drwalemc!

Zitat von @drwalemc:
Habe das man mit deiner Anleitung getestet, ich kan auch nach einen namen Suchen danach erhalte ich aber einen Laufzeitfehler 5.
Die Fehlerzeile ist die 33.
Hast Du in Zeile 3 den Dateipfad der Excel-Datei und in Zeile 4 den Tabellennamen angepasst?

Gruß Dieter
drwalemc
drwalemc 17.02.2010 um 10:35:25 Uhr
Goto Top
Das habe ich...

Die Exceldatei liegt ind D:\Projekte\Makro\test.xls

Der Tabellenname ist bei mir gleich (also auch Tabelle1)

Gruss
76109
76109 17.02.2010 um 11:02:02 Uhr
Goto Top
Hallo drwalemc!

Dann sollte es eigentlich gehen?

Füge mal testweise vor Zeile 33 diesen Code ein:
    If CreateObject("Scripting.FileSystemObject").FileExists(ExcelDatei) Then  
        MsgBox "Datei existiert!"  
    Else
        MsgBox "Datei existiert leider nicht!"  
    End If
    
    Exit Function

Welche Meldung wird ausgegeben?

Gruß Dieter
drwalemc
drwalemc 17.02.2010 um 11:43:00 Uhr
Goto Top
Hallo Dieter

Ich bekomme die Meldeung das die Datei nicht existiert, aschliessend klicke ich auf okey...danach kommt das der Name nicht gefunden wurde....

Gruss Drwalemc
76109
76109 17.02.2010 um 12:06:47 Uhr
Goto Top
Hallo drwalemc!

Wenn Du die Meldung bekommst, dass die Datei nicht existiert, dann stimmt der Dateipfad nicht?

Möglicherweise ist es doch ein kleiner Schreibfehler in Deiner Pfadangabe? Projekte oder Makro vielleicht mit "c", sowas in der Artface-wink

Gruß Dieter
drwalemc
drwalemc 17.02.2010 um 13:25:41 Uhr
Goto Top
Hallo Dieter

Ich habe jetzt nocheinmal den Pfad für das Excel Dokument überprüft (relativ und absolut)...dieser stimmt

Weiter habe ich noch in den Officeeinstellungen die Makrosicherheit noch überprüft ist meiner Meinung nach auch korrekt....Die Worddatei habe ich noch ins gleiche Verzeichniss kopiert aber es funktioniert komischerweise nicht....

gibt es die möglichkeit dass ich die beiden dokumente dir zukommen lasse...

Gruss
76109
76109 17.02.2010 um 13:47:21 Uhr
Goto Top
Hallo drwalemc!

Ich glaube ich steht im Waldface-smile

Du hast vorhin geschrieben, dass die Meldung kommt "Die Datei existiert (leider) nicht!"

Die Meldung kommt, weil ein expliziter Test des Pfades ausgeführt wird und wenn dieser Test besagt, die Datei existiert in dem angegebenen Pfad nicht, dann ist sie entweder nicht vorhanden oder die Pfadangabe ist falsch. Eine andere Möglichkeit gibt es leider nicht. Das hat auch nichts mit den Makro-Sicherheitseinstellungen zu tun. Du bekommst ja eine Meldung, also wird das Makro bzw. der Pfad-Test auch ausgeführt.

Wenn die Meldung "Die Datei existiert (leider) nicht!" kommt, dann hat dies absolut nichts mit der Funktionalität des Makros zu tunface-wink

Gib mal im Startmenü unter Ausführen Deinen Pfad ein und bestätige mit OK. Wird die Datei geöffnet?

Steht in Zeile 3:
Const ExcelDatei = "D:\Projekte\Makro\test.xls"
genau so?

Gruß Dieter
drwalemc
drwalemc 19.02.2010 um 15:23:06 Uhr
Goto Top
Hallo Dieter

Besten Dank für deine Hilfe es klappt nun....

Die Adressen werden ja mit einem Grossen Zeilenabstand ins Word kopiert....Wird dieser Zeilenabstand auch im Makro definiert???

Gruss Dominique
76109
76109 19.02.2010 um 15:37:39 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
Besten Dank für deine Hilfe es klappt nun....
Und wieso klappt es jetzt auf einmalface-wink
Die Adressen werden ja mit einem Grossen Zeilenabstand ins Word kopiert....Wird dieser Zeilenabstand auch im Makro definiert???
Siehe in der Codezeile 44 bis 46, da sind Zeilenvorschübe mit 'vbCrLf' definiert. Zum entfernen '& vbCrLf' mit &-Zeichen löschen.

Den obigen Code habe ich das letztemal so geändert, dass jetzt zu Beginn erst eine Prüfung der Existenz der *.xls-Datei statfindet.

Gruß Dieter
drwalemc
drwalemc 19.02.2010 um 15:54:13 Uhr
Goto Top
Zitat von @76109:
Hallo Dominique!

> Zitat von @drwalemc:
> Besten Dank für deine Hilfe es klappt nun....
Und wieso klappt es jetzt auf einmalface-wink

Ich habe meine Excel Tabelle "unbewusst" unbenanntface-smile

> Die Adressen werden ja mit einem Grossen Zeilenabstand ins Word kopiert....Wird dieser Zeilenabstand auch im Makro
definiert???
Siehe in der Codezeile 44 bis 46, da sind Zeilenvorschübe mit 'vbCrLf' definiert. Zum entfernen '&
vbCrLf' mit &-Zeichen löschen.

Das ganze funz nun so wie ich möcht...was meinst du dazu? am ende soll das teil ja die Adresse in eine Rechnugsvorlage kopieren...sollte ich eine Bereich definiere wo das Makro die Adresse hinzukopieren hat oder würdes du mit dem Cursor arbeiten?


Den obigen Code habe ich das letztemal so geändert, dass jetzt zu Beginn erst eine Prüfung der Existenz der *.xls-Datei
statfindet.

Gruß Dieter
76109
76109 19.02.2010 um 16:06:22 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
Ich habe meine Excel Tabelle "unbewusst" unbenanntface-smile
Dazu sage ich jetzt mal besser nix dazuface-plain
Das ganze funz nun so wie ich möcht...was meinst du dazu? am ende soll das teil ja die Adresse in eine Rechnugsvorlage
kopieren...sollte ich eine Bereich definiere wo das Makro die Adresse hinzukopieren hat oder würdes du mit dem Cursor
arbeiten?
In Codezeile 31 befindet sich der einzige Code bezüglich Word und das kannst Du nach belieben ändern. Die Variable Text beinhalte die Adresse.

Gruß Dieter
drwalemc
drwalemc 19.02.2010 um 16:23:18 Uhr
Goto Top
Zitat von @76109:
Hallo Dominique!
Hallo Dieter face-smile

> Zitat von @drwalemc:
> Ich habe meine Excel Tabelle "unbewusst" unbenanntface-smile
Dazu sage ich jetzt mal besser nix dazuface-plain
> Das ganze funz nun so wie ich möcht...was meinst du dazu? am ende soll das teil ja die Adresse in eine Rechnugsvorlage
> kopieren...sollte ich eine Bereich definiere wo das Makro die Adresse hinzukopieren hat oder würdes du mit dem Cursor
> arbeiten?
In Codezeile 31 befindet sich der einzige Code bezüglich Word und das kannst Du nach belieben ändern. Die Variable Text
beinhalte die Adresse.
In der Variable "Text" ist ja nicht definiert das die Adresse zum Aktuellen Cursorort kopiert wird. Mach das Makro das automatisch wenn man dies nicht definiert?

Gruß Dieter
76109
76109 20.02.2010 um 11:19:42 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
In der Variable "Text" ist ja nicht definiert das die Adresse zum Aktuellen Cursorort kopiert wird. Mach das Makro das
automatisch wenn man dies nicht definiert?
Also, die Variable Text enthält nur Text inkl. Zeilenvorschub-Zeichen und steht zur Weiterverarbeitung bereit. D.h der Text ist zwar da, aber er tut nix. Is vergleichbar mit ner Flasche Bier. Du hast sie, is auch was drin, aber sie tut nix. Du kannst sie einfach nur rumstehen lassen oder sie aufmachen und trinken. Das ist mit all seinen Konsequenzen, alleine Dir überlassen und genauso ist es auch mit dem Makro-Code, man kann die Variable einfach vor sich hin vegitieren lassen oder mit einer Funktion wie z.B. Selection.TypeText etwas damit machenface-smile

Selection bedeutet so viel wie "hier steht der Cursor" und die Anweisung nach dem Punkt "TypeText" schreibt den Inhalt der Variablen an die aktuelle Cursorposition.

Die Möglichkeiten der Weiterverarbeitung der Variablen Text sind unbegrenztface-wink

Hier mal ne andere Variante, die wohl eher Deinen Vorstellungen entspricht:
In der Codezeile 14 wird die Position (Zeilennummer) angegeben, an der die Adresse eingefügt werden soll.

In der Codezeile 30 bis 41 steht der Code, der die Variable Text im Word-Dokument verarbeitet, wobei sich der Ablauf in etwa so gestaltet, dass wenn die Zeile noch nicht existiert, diese erzeugt wird. Was bildlich gesprochen soviel heißt wie, wenn ich mit den Cursor-Tasten nur bis Zeile 2 komme, dann drücke solange die Return-Taste, bis ich in der gewünschten Zeile bin und füge dann in dieser Zeile die Adresse (Text) ein oder überschreibe den aktuellen Inhalt, falls vorhanden.

Ein weiterer Unterschied ist, dass die Variable Text in Codezeile 53 bis 54 diesmal als Array (Datenfeld) ohne Zeilevorschub-Zeichen erstellt wird.

Beispiel für ein Array (Datenfeld):
Text = Array("Inhalt1", "", "Inhalt2", "Inhalt3")

Datenfelder:
Text(0) = "Inhalt1" Name
Text(1) = "" Leerzeile
Text(2) = "Inhalt2" Straße
Text(3) = "Inhalt3" Plz und Ort


D.h. hier wird anstelle eines Zeilenvorschubes ein Leer-Text mit den Zeichen "" eingefügt, was beim Einfügen ins Dokument einen Zeilenvorschub erzeugt.
Wenn die Leerzeile wegfallen soll, dann in Codezeile 53 ["",] entfernen

Hier der neue Quellcode:
Option Explicit

Const ExcelDatei = "D:\Projekte\Makro\test.xls"  
Const ExcelSheet = "Tabelle1"  

Const AdrName = "A"         'Excel-Spalte Namen  
Const AdrStr = "B"          'Excel-Spalte Straße  
Const AdrPlz = "C"          'Excel-Spalte Postleitzahl  
Const AdrOrt = "D"          'Excel-Spalte Ort  

Const xlWhole = 1           'Excel-Konstanten  
Const xlValues = -4163

Const Zeile1 = 4            'Adresse in dieser Zeile einfügen  

Sub GetAddress()
    Dim Search As String, Text As Variant, i As Long
    
    If CreateObject("Scripting.FileSystemObject").FileExists(ExcelDatei) = False Then  
        MsgBox "Die Excel-Datei wurde nicht gefunden!", vbExclamation, "Fehler"  
        Exit Sub
    End If
    
    Search = InputBox("Bitte einen Namen eingeben", "Suchen")  
    
    If Search = "" Then Exit Sub  
    
    Text = GetExcelDaten(Search)
    
    If IsArray(Text) Then
        With ActiveDocument
            For i = .Paragraphs.Count To Zeile1 - 1
                .Paragraphs.Add
            Next
            For i = 0 To UBound(Text)
                .Paragraphs(Zeile1 + i).Range.Text = Text(i) & vbCrLf
            Next
            For i = 0 To UBound(Text)
                .Paragraphs(Zeile1 + i).Alignment = wdAlignParagraphLeft  'Oder  wdAlignParagraphRight    
            Next
        End With
    Else
        MsgBox "Der Name wurde nicht gefunden!", vbInformation, "Suchergebnis"  
    End If
End Sub

Private Function GetExcelDaten(ByRef Search) As Variant
    Dim Wks As Object, Found As Object, Text As Variant
  
    Set Wks = GetObject(ExcelDatei).Sheets(ExcelSheet)
    
    Set Found = Wks.Columns(AdrName).Find(Search, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=False)
    
    If Not Found Is Nothing Then
        With Wks.Rows(Found.Row)
            GetExcelDaten = Array(.Columns(AdrName).Text, "", .Columns(AdrStr).Text, _  
                                  .Columns(AdrPlz).Text & " " & .Columns(AdrOrt).Text)  
        End With
    End If
    
    With Application
        .DisplayAlerts = False:  GetObject(ExcelDatei).Close True:  .DisplayAlerts = True
    End With
End Function

Hoffe, ich habe mich einigermaßen verständlich ausgedrückt?face-smile

Gruß Dieter

[edit] Text-Ausrichtung Links noch hinzugefügt (kann wegen des vbCrLf nicht in die Schleife Text einfügen mit rein) [/edit]
drwalemc
drwalemc 22.02.2010 um 11:03:09 Uhr
Goto Top
Hallo Dieter

Super so habe ich mir das forgestellt....Besten Dank

In dieser Zeile hasst du ja definiert wo das die Adresse hinkopiert werden soll...

Const Zeile1 = 4 'Adresse in dieser Zeile einfügen

Woher weist du das das "Zeile1" ist???

Gruss Dominique
76109
76109 22.02.2010 um 11:36:15 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
Super so habe ich mir das forgestellt....Besten Dank
Das habe ich mir fast gedachtface-wink
Woher weist du das das "Zeile1" ist???
Da habe ich geraten. Hätte auch 5 oder 6 nehmen könnenface-smile

Gruß Dieter

PS. Bitte nicht vergessen den Thread als gelöst zu markieren
drwalemc
drwalemc 22.02.2010 um 13:21:45 Uhr
Goto Top
hehe...okey ich meine im Word...das muss es ja irgendwo definiert sein das die \"Zeile1\" am linken Rand der Seite ist...

Gruss Dominique
76109
76109 22.02.2010 um 14:58:55 Uhr
Goto Top
Hallo Dominique!

Sorry, aber ich verstehe nur Bahnhof?

Also, wenn Dein Worddokument, wie bei mir, auch von oben nach unten zählt, dann weiß ich, dass nach Zeile 1 die 2 und danach die 3 und danach die Zeile 4 kommt. Ob Deine Zeilen allerdings links, mittig oder rechts ausgerichtet ist, weiß ich natürlich nichtface-wink

Den letzten Code habe ich jetzt noch so geändert, dass die Adresszeilen alle Links ausgerichtet sind.

Codezeile 36:
Links = wdAlignParagraphLeft
Rechts = wdAlignParagraphRight
Center = wdAlignParagraphCenter

Gruß Dieter
drwalemc
drwalemc 22.02.2010 um 15:04:42 Uhr
Goto Top
Hallo Dieter


Ich habe ja mehre Vorlagen im Word wo ich die Adresse hineinziehen möchte....Bei einer Vorlage sollte die Adresse aber eben Rechts erscheinen (also wie bei einem normalen Brief)...darum fragte ich woher du weist das Zeile 1 oben link ist....

Gruss Dominique
76109
76109 22.02.2010 um 15:21:22 Uhr
Goto Top
Hallo Dominique!

Mit anderen Worten, Du brauchst jetzt noch eine Auswahlmöglichkeit, damit der Text wahlweise Links oder Rechts ausgerichtet wird?

Entweder mit seperarter InputBox oder kombiniert mit der Adressabfrage z.B.: Eingabe = l;maria mustermann oder r;maria mustermann

Statt Semikolon kann's natürlich auch ein Punkt oder Komma sein?

Mach Du einen Vorschlag?

Gruß Dieter
76109
76109 22.02.2010 um 15:33:58 Uhr
Goto Top
Hallo nochmal!

Wie wäre es mit Eingabe: <maria mustermann oder >maria mustermann?

Gruß Dieter
drwalemc
drwalemc 22.02.2010 um 16:02:32 Uhr
Goto Top
Hallo Dieter

Also das man das bei jeder eingabe wähle kan ist nicht nötig, da es nur bei einer Vorlage nötig ist die Adresse auf der rechten Seite zu haben. Ich habe mich jetzt mal auf die Codezeile 36 konzentriert. Wenn ich das richtig verstehe wir dort definiert das die Adresse Links im Worddokument auf der 4ten Zeile zu erscheinen hat. Ich habe das ganze mal mit:

For i = 0 To UBound(Text)
.Paragraphs(Zeile1 + i).Alignment = wdAlignParagraphRight

Probiert, dan sollte die Adresse ja Rechts auf der 4ten Zeile erscheinen....aber eben sollte bekomme nämlich einen Laufzeitfehler 5941, der ja soviel heisst das etwas mit dem Worddokument nicht stimmt. Kan das sein weil eigentlich wird ja nur der Standort der Adresse geänder???

Gruss Dominique
76109
76109 22.02.2010 um 16:19:55 Uhr
Goto Top
Hallo Hallo Dominique!

Ups, die Reihenfolgen der Schleifen muss geändert werden. Erst Text rein und dann ausrichten.

Im letzten Code geändert (siehe oben).

Gruß Dieter
drwalemc
drwalemc 22.02.2010 um 16:28:42 Uhr
Goto Top
Hallo Dieter

Suuuppiii so ist es Perfekt...Du bist ja der Makroguruface-smile

Ich weis gar nicht wie ich mich bedanke soll....

Gruss Dominique
76109
76109 22.02.2010 um 16:36:43 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
Suuuppiii so ist es Perfekt...Du bist ja der Makroguruface-smile
Freut mich mich, wenn's funktioniertface-smile
Ich weis gar nicht wie ich mich bedanke soll....
Ein einfaches Danke genügt schonface-wink

Gruß Dieter
drwalemc
drwalemc 22.02.2010 um 17:04:42 Uhr
Goto Top
Zitat von @76109:
Hallo Dominique!

> Zitat von @drwalemc:
> Suuuppiii so ist es Perfekt...Du bist ja der Makroguruface-smile
Freut mich mich, wenn's funktioniertface-smile
> Ich weis gar nicht wie ich mich bedanke soll....
Ein einfaches Danke genügt schonface-wink
DANKEEE face-smile

Gruß Dieter
76109
76109 23.02.2010 um 10:59:07 Uhr
Goto Top
Hallo Dominique!

Zitat von @drwalemc:
DANKEEE face-smile
Gern geschehenface-smile

Gruß Dieter