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
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
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 136027
Url: https://administrator.de/contentid/136027
Ausgedruckt am: 05.11.2024 um 18:11 Uhr
29 Kommentare
Neuester Kommentar
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
danach zu Textmarke/n springen
http://www.vb-fun.de/cgi-bin/loadframe.pl?ID=vb/tipps/tip0036.shtml
danach Text einfügen
Grüße
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
Hallo drwalemc!
Hier mal ein einfaches Beispiel mit Namenseingabe in einer InputBox im Word-Document.
Exceltabelle Test.xls mit folgendem Inhalt:
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:
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]
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
<Extras><Makro><Makros><GetAddress><Ausführen><Namen eingeben><OK>
Gruß Dieter
[edit] Die Prüfung der Pfadangabe der Excel-Datei noch hinzugefügt [/edit]
Hallo drwalemc!
Gruß Dieter
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?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.
Gruß Dieter
Hallo drwalemc!
Dann sollte es eigentlich gehen?
Füge mal testweise vor Zeile 33 diesen Code ein:
Welche Meldung wird ausgegeben?
Gruß Dieter
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
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 Art
Gruß Dieter
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 Art
Gruß Dieter
Hallo drwalemc!
Ich glaube ich steht im Wald
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 tun
Gib mal im Startmenü unter Ausführen Deinen Pfad ein und bestätige mit OK. Wird die Datei geöffnet?
Steht in Zeile 3:
genau so?
Gruß Dieter
Ich glaube ich steht im Wald
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 tun
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" |
Gruß Dieter
Hallo Dominique!
Und wieso klappt es jetzt auf einmal
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
Und wieso klappt es jetzt auf einmal
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
Hallo Dominique!
Dazu sage ich jetzt mal besser nix dazu
Gruß Dieter
Dazu sage ich jetzt mal besser nix dazu
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.kopieren...sollte ich eine Bereich definiere wo das Makro die Adresse hinzukopieren hat oder würdes du mit dem Cursor
arbeiten?
Gruß Dieter
Hallo Dominique!
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 unbegrenzt
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:
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:
Hoffe, ich habe mich einigermaßen verständlich ausgedrückt?
Gruß Dieter
[edit] Text-Ausrichtung Links noch hinzugefügt (kann wegen des vbCrLf nicht in die Schleife Text einfügen mit rein) [/edit]
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 machenIn 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?
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 unbegrenzt
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?
Gruß Dieter
[edit] Text-Ausrichtung Links noch hinzugefügt (kann wegen des vbCrLf nicht in die Schleife Text einfügen mit rein) [/edit]
Hallo Dominique!
Das habe ich mir fast gedacht
Gruß Dieter
PS. Bitte nicht vergessen den Thread als gelöst zu markieren
Das habe ich mir fast gedacht
Woher weist du das das "Zeile1" ist???
Da habe ich geraten. Hätte auch 5 oder 6 nehmen könnenGruß Dieter
PS. Bitte nicht vergessen den Thread als gelöst zu markieren
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 nicht
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
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 nicht
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
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
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
Hallo nochmal!
Wie wäre es mit Eingabe: <maria mustermann oder >maria mustermann?
Gruß Dieter
Wie wäre es mit Eingabe: <maria mustermann oder >maria mustermann?
Gruß Dieter
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
Ups, die Reihenfolgen der Schleifen muss geändert werden. Erst Text rein und dann ausrichten.
Im letzten Code geändert (siehe oben).
Gruß Dieter
Hallo Dominique!
Freut mich mich, wenn's funktioniert
Gruß Dieter
Freut mich mich, wenn's funktioniert
Ich weis gar nicht wie ich mich bedanke soll....
Ein einfaches Danke genügt schonGruß Dieter