speedy132
Goto Top

Excel Liste mit vba auslesen und drucken

Hallo miteinander,

Folgendes Problem:

Ich habe eine Mitarbeiterliste mit Unterweisungsplan. Jetzt möchte ich einzelne MA markieren evtl. durch ein X in einer Zelle und durch drücken auf einen Button sollen die Namen des MA nacheinander in ein Formular für Arbeitssicherheit oder Brandschutz an einer bestimmten Stelle eingefügt werden und sofort ausgedruckt werden. Also MA Max Muster wird mit einem X versehen und durch drücken auf den Button wird der Name evtl. noch Abteilung übernommen, im Formular an der entsprechenden Stelle eingetragen und sofort gedruckt. Danach der nächste MA usw. bis alle markierten ausgedruckt sind.

Habe bisher in Word einen Serienbrief erstellt und da die MA festgelegt. Aber es müsste doch auch in Excel möglich sein mittels vba dieses hinzubekommen.
Kann mir da jemand helfen….???

Herzlichen Dank

Content-Key: 264305

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

Printed on: April 16, 2024 at 06:04 o'clock

Mitglied: 114757
114757 Feb 23, 2015 at 15:28:52 (UTC)
Goto Top
Moin,
klar geht das alles, aber MS Access ist für solche Sachen (Reports) eigentlich wesentlich besser geeignet ...

Gruß jodel32
Member: speedy132
speedy132 Feb 23, 2015 at 15:42:26 (UTC)
Goto Top
Hi,

habe nur die Access runtime drauf. Also keine Möglichkeit mit Access zu arbeiten.
Member: colinardo
colinardo Feb 23, 2015 updated at 17:33:29 (UTC)
Goto Top
Hallo speedy132, Willkommen auf Administrator.de!
Hier ein einfaches Beispiel an dem du dir die Vorgehensweise ab schauen kannst: create_word_reports_from_excel_264305.zip (Das Beispiel besteht aus einer Excel-Datei und einer Word-Vorlage, beide Dateien in ein Verzeichnis entpacken und die Excel-Datei öffnen)
Im Beispiel wählst du die Mitarbeiter aus, und klickst dann auf einen Button um daraus die Reports in Word zu drucken. Dazu wird der Status der Zeile durch das "X" ausgewertet, dann ein Word Dokument anhand eines Vorlagendokuments erstellt, darin die Textmarken durch die Daten aus Excel ersetzt und zum Schluss ausgedruckt.
Das ganze erfolgt unsichtbar für den User, bei Bedarf z.B. für Debugzwecke kannst du dies sichtbar schalten (siehe Code)
Weitere Kommentare sind im Code hinterlegt.

Wird zusätzliche Hilfe benötigt, kann dies nach Absprache via PM gegen eine Aufwandsentschädigung erfolgen.

Viel Erfolg.
Grüße Uwe
Falls der Beitrag gefällt, seid so nett und unterstützt mich durch eine kleine Spende / If you like my contribution please support me and donate
Member: speedy132
speedy132 Feb 24, 2015 at 14:41:50 (UTC)
Goto Top
Hi,

super herzlichen Dank.

Hat soweit alles funktioniert und ich habe es in einigen Dokumenten schon umgesetzt.
Jetzt stehe ich allerdings vor einen weiteren Problem...

Ich habe jetzt eine Vorlage erstellt in der ich die Textmarken mehrmals ansteuern möchte, da ich 5 Unterweisungsdokumente hintereinander in die richtige Reihenfolge gesetzt habe.
Die Tabellenzellen für den MA, Abteilung, Vorgesetzten habe ich mit einer Textmarke gesetzt (erst Textmarke erstellt und dann mit Querverweis Verweistyp Textmarke positioniert). Dabei kommen die Textmarken ja 5 mal vor.
Durch den Button in Excel steuer ich über vba ja den Zugriff auf das Dokument und den Ausdruck. Die Textmarken werden aber nicht gefüllt, bzw. nur die letzte Textmarke im Dokument...
Member: colinardo
colinardo Feb 24, 2015 updated at 15:14:03 (UTC)
Goto Top
Bei diesem Beispiel werden die Textmarken nach dem Befüllen entfernt, deswegen das Verhalten. Es gibt ja zwei Arten von Textmarken (Position und Range). Entweder du setzt das Bookmark erneut wie z.B. hiermit
Dim rngBM As Range, strBookmark As String
'Name des Bookmarks  
strBookmark = "NamederTextmarke"  
'Range des Bookmarks speichern  
Set rngBM = Bookmarks(strBookmark).Range
'Text des Bookmarks setzen  
rngBM.Text = "BlaBla"  
'Bookmark neu mit gleichem Namen erstellen  
Bookmarks.Add strBookmark, rngBM
oder du nutzt stattdessen Formularfelder, welche sich mit der .Formfields() Collection ansprechen lassen. Diese lassen sich ebenfalls über Feldfunktionen verknüpfen.
FormFields("NameDesFeldes").Result = "Daten"
Grüße Uwe
Member: speedy132
speedy132 Feb 24, 2015 at 15:30:56 (UTC)
Goto Top
Danke für die schnelle Antwort,

allerdings bekomme ich das damit überhaupt nicht hin. Weiss nicht wie ich das in dem bestehenden Code einbauen soll. Funktioniert nicht.....
Member: colinardo
colinardo Feb 24, 2015 updated at 15:39:31 (UTC)
Goto Top
Zitat von @speedy132:
allerdings bekomme ich das damit überhaupt nicht hin. Weiss nicht wie ich das in dem bestehenden Code einbauen soll.
Funktioniert nicht.....
ok, na dann mal wieder zu Fuß face-confused

Hier der Ausschnitt aus dem Code ... / Zeilen 8 bis 11
'.....  
'...  
For Each cell In rngSelection
    If LCase(cell.Value) = "x" Then  
        'Neues Dokument von der Vorlage erstellen  
        Set objDoc = objWord.Documents.Add(REPORT_TEMPLATE)
        'Textmarken durch Daten der Spalten in Excel ersetzen  
        strBMName = "Name"  
        Set rngBM = objDoc.Bookmarks(strBMName).Range
        rngBM.Text = .Range("A" & cell.Row).Value  
        objDoc.Bookmarks.Add strBMName, rngBM
        ' ... usw für die anderen Bookmarks  
        
        'Dokument drucken  
        objDoc.PrintOut
        'Dokument nicht speichern und schließen  
        objDoc.Close False
    End If
Next
'....  
'...  
Member: speedy132
speedy132 Feb 24, 2015 at 16:07:11 (UTC)
Goto Top
also habe entsprechend daas ganze 4 mal in den code eingebaut für die 4 Textmarken.
Diese werden jetzt auch gefüllt, allerdings werden die Textmarken jetzt beim 2.ten Aufruf in Word doppelt beschrieben und beim 3.ten Aufruf 3xbeschrieben etc.
Ich denke da müsste irgendwo im Code etwas geschlossen werden...

strBMName = "Name"
Set rngBM = objDoc.Bookmarks(strBMName).Range
rngBM.Text = .Range("A" & cell.Row).Value
objDoc.Bookmarks.Add strBMName, rngBM

strBMOberAbteilung = "OberAbteilung"
Set rngBM = objDoc.Bookmarks(strBMOberAbteilung).Range
rngBM.Text = .Range("B" & cell.Row).Value
objDoc.Bookmarks.Add strBMOberAbteilung, rngBM

strBMVorgesetzter = "Vorgesetzter"
Set rngBM = objDoc.Bookmarks(strBMVorgesetzter).Range
rngBM.Text = .Range("D" & cell.Row).Value
objDoc.Bookmarks.Add strBMVorgesetzter, rngBM

'Textmarken durch Daten der Spalten in Excel ersetzen
strBMGeburtsdatum = "Geburtsdatum"
Set rngBM = objDoc.Bookmarks(strBMGeburtsdatum).Range
rngBM.Text = .Range("E" & cell.Row).Value
objDoc.Bookmarks.Add strBMGeburtsdatum, rngBM
Member: colinardo
colinardo Feb 24, 2015 updated at 16:14:07 (UTC)
Goto Top
Zitat von @speedy132:
also habe entsprechend daas ganze 4 mal in den code eingebaut für die 4 Textmarken.
Diese werden jetzt auch gefüllt, allerdings werden die Textmarken jetzt beim 2.ten Aufruf in Word doppelt beschrieben
Ich weiß hier ja gar nicht was du genau machen willst bzw. vorhast. Und warum du ein Dokument mehrfach öffnest. In meinem Codebeispiel werden keine Dokumente gespeichert sondern nur zum Drucken befüllt und dann verworfen !!
Du lieferst einfach zu wenig Infos was du wie angepasst hast.

Für mehr Support siehe den Hinweis in meinem ersten Post.

Grüße Uwe
Member: speedy132
speedy132 Feb 24, 2015 at 16:22:23 (UTC)
Goto Top
Eigentlich eine ganz einfache Geschichte...
Ich habe mehrere Word-Dokumente (Unterweiungspläne Brandschutz, Erste Hilfe etc.) in denen sollen an bestimmten Stellen die Daten aus Excel eingefügt werden.
Name, Abteilung, Vorgesetzter, Geburtsdatum.

In Word habe ich Textmarken erstellt und diese in den Tabellenzellen mit Hilfe des Querverweise zugeordnet.

Abteilung: {REF OberAbteilung}
Name: {REF Name}

In Excel habe ich eine Mitarbeiterliste und dort soll durch drücken auf den Button die Daten in die entsprechenden Textmarken in Word gesetzt werden und das Dokument wird dann ausgedruckt.

funktioniert ja auch fast, bis auf das jetzt bei den Textmarken die Daten dann 2x bzw 3x drin stehen.
Member: speedy132
speedy132 Feb 24, 2015 at 16:23:21 (UTC)
Goto Top
Die Word Dokumente habe ich zu einem Dokument zusammengefasst...
Member: colinardo
colinardo Feb 24, 2015 updated at 17:11:46 (UTC)
Goto Top
In Word habe ich Textmarken erstellt und diese in den Tabellenzellen mit Hilfe des Querverweise zugeordnet.
bis auf das jetzt bei den Textmarken die Daten dann 2x bzw 3x drin stehen
D.h du möchtest jetzt alle Mitarbeiter in ein einzelnes Dokument einfügen ?? Dann muss das nämlich anders aufgebaut werden und kann so in der Art nicht funktionieren.
Für diesen Fall hier noch ein Beispiel: create_report_all_in_one_template_264305.zip

In deinem Eingangspost war ich davon ausgegangen das für jeden Mitarbeiter ein extra Dokument erstellt wird.
Zitat von @speedy132:
im Formular an der entsprechenden Stelle eingetragen und sofort gedruckt. Danach der nächste MA usw. bis alle markierten ausgedruckt sind.

Und normalerweise werden Textmarken eine Position zugewiesen und nicht nur einfach erstellt, damit ließe sich das Verhalten erklären, wenn du alle an der selben stelle erstellt hast... Sieh dir einfach mein Demo-Dokument mal an und lass dir unter Einfügen > Texmarken die Markenpositionen anzeigen.
Member: speedy132
speedy132 Feb 25, 2015 at 07:29:05 (UTC)
Goto Top
Ist schon richtig, für jeden Mitarbeiter einen einzelnen Ausdruck bzw. ein extra Dokument.
Die Lösung ist ja schon greifbar nahe, du bist echt gut...

Also nochmal zur Erklärung.

Ein Dokument mit 5 Seiten.
Seite 1 Brandschutz:
eine Tabelle mit 2 spalten.
Spalte 1: Abteilung
Spalte 2: Textmarke {REF OberAbteilung}
nächste Zeile
Spalte 1: Name
Spalte 2: Textmarke {REF Name}

Seite 2 Erste Hilfe:
wieder die Tabelle mit 2 Spalten
Spalte 1: Abteilung
Spalte 2: Textmarke {REF OberAbteilung}
nächste Zeile
Spalte 1: Name
Spalte 2: Textmarke {REF Name}

Seite 3 Energie:
wieder die Tabelle

Seite 4 Arbeitssicherheit:
wieder die Tabelle

Die Textmarken sollen jetzt mit den Daten des MA aus Excel gefüllt werden
Abteilung: Verwaltung
Name: Max Muster

Durch den Button möchte ich das die Textmarken in Word mit dem MA gefüllt werden (alle 5 Seiten mit einem MA), dann ausgedruckt werden und anschließend der nächste markierte MA usw.
Member: colinardo
colinardo Feb 25, 2015 updated at 08:41:39 (UTC)
Goto Top
OK das ist mal eine vernünftige Erklärung, warum nicht gleich so face-smile
Ohne viel Worte zu verlieren ,sieh dir dazu diese Demo an ...(Druckfunktion etc. habe ich zur Demo mal auskommentiert, so dass du dir die Reports ansehen kannst)
excel_create_word_report_with_links_264305.zip

Grüße Uwe
Member: speedy132
speedy132 Feb 25, 2015 at 10:09:57 (UTC)
Goto Top
herzlichen Dank,

aber irgendwie bin ich zu blöd dafür....

Also ich habe das Array angepasst:
arrBookmarks = Array("txtName", "txtAbteilung", "txtVorgesetzter", "txtGeburtsdatum")

arrSpalten = Array("A", "B", "D", "E") - Dort sind die notwendigen Daten enthalten

Habe das angepasst Set rngSelection = .Range("F3:F" & .Cells(Rows.Count, 4).End(xlUp).Row)

Soweit gut...

Jetzt in word:
Habe dort die 4 Textmarken erstellt
txtAbteilung
txtVorgesetzter
txtVorgesetzter
txtGeburtsdatum

Dannn diese Textmarken über Querverweis den entsprechenden Positionen zugeordnet.

Abteilung {REF txtAbteilung}
etc.

Sowohl auf Seite 1 als auch in Seite 2 etc.

Beim ausführen kommt es jetzt zu einer Fehlermeldung "Anwednungs- oder objektdefinierter Fehler"

Ich glaube der Fehler liegt in Word bei den Textmarken. Wie hast du die in Word die Verknüpfung auf die obigen Felder hinbekommen?
Wie hast du [txtName] angelegt? einfach geschrieben oder ist das über ein Feld erstellt ????
Member: colinardo
Solution colinardo Feb 25, 2015 updated at 11:12:52 (UTC)
Goto Top
Wie hast du [txtName] angelegt? einfach geschrieben oder ist das über ein Feld erstellt ????
Den Text [txtName] markiert, dann auf den Tab Einfügen > Textmarke einen Namen vergeben, feddich!

Der Text im Dokument ist beliebig, dient nur der Darstellung...
Member: speedy132
speedy132 Feb 25, 2015 at 11:12:32 (UTC)
Goto Top
Du bist echt i.O....

Super und herzlichen Dank für die Unterstützung.

Auf allen 5 Seiten steht jetzt der Mitarbeiter mit Abteilung und Vorgesetzten....

Ich denke somit ist mein Problem gelöst face-smile


DANKE
Member: speedy132
speedy132 Feb 25, 2015 at 12:44:05 (UTC)
Goto Top
ich hätte dazu noch eine Frage...

Wenn ich jetzt in Excel die Liste durchgehe muss ich ja bei jedem MA ein X eintragen.
Wie geht es, dass beim drücken der linken Maustaste in dieser Spalte ein x automatisch erscheint???
Member: colinardo
colinardo Feb 25, 2015 updated at 13:40:23 (UTC)
Goto Top
Zitat von @speedy132:
Wie geht es, dass beim drücken der linken Maustaste in dieser Spalte ein x automatisch erscheint???
indem du folgenden Code in den Codeabschnitt des Arbeitsblattes einfügst (Rechtsklick auf den Tab des Arbeitsblattes > Code anzeigen). Der Range bei dem das passieren soll, ist natürlich in Zeile 2 an deine Spalte anzupassen ...
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    If Not Application.Intersect(Range("D3:D10000"), Target) Is Nothing Then  
        If Target.Cells(1).Value = "" Then  
            Target.Cells(1).Value = "X"  
        ElseIf Target.Cells(1).Value = "X" Then  
            Target.Cells(1).Value = ""  
        End If
     End If
End Sub
Grüße Uwe
Member: speedy132
speedy132 Feb 25, 2015 at 13:13:32 (UTC)
Goto Top
soweit gut...
hat geklappt...

wenn ich jetzt in der Spalte einen Bereich markiere um mit der Entf-Taste die gesetzten X zu löschen dann kommt es zu einem Fehler.
Da müsste wohl noch ein Zusatz rein....
Member: colinardo
colinardo Feb 25, 2015 at 13:41:09 (UTC)
Goto Top
Sorry, korrigiert ... war gerade abgelenkt ....
Member: speedy132
speedy132 Feb 25, 2015 at 13:50:58 (UTC)
Goto Top
OK, Danke aber wo ist die Korrektur?
Member: colinardo
Solution colinardo Feb 25, 2015 updated at 14:31:03 (UTC)
Goto Top
Zitat von @speedy132:

OK, Danke aber wo ist die Korrektur?
im letzten Post geändert face-wink müssen das hier ja nicht bis zum Exzess mit Code zuschütten ....
Member: speedy132
speedy132 Feb 25, 2015 at 14:31:19 (UTC)
Goto Top
super, herzlichen Dank
Member: speedy132
speedy132 Feb 26, 2015 at 10:46:36 (UTC)
Goto Top
Ich habe da noch eine andere Sache....

wie kann ich Excel dazu bringen, das wenn ich die Kalenderwoche eines Datums ermittel, er mir dann automatisch den Zeitraum dieser Kalenderwoche angibt.

Beispiel:

Zelle A1 = heute() (aktuelles Datum)
Zelle A2 = Kalenderwoche (A1) - 9
Jetzt möchte ich darunter die Angabe haben:
Zelle A3: 23.02 - 27.02.2015

Was muss ich in A3 scheiben?
Member: colinardo
Solution colinardo Feb 26, 2015 updated at 13:54:27 (UTC)
Goto Top
Zitat von @speedy132:
Ich habe da noch eine andere Sache....
Eigentlich gehört das dann auch in einen neuen Thread... face-confused
=TAG(A1-WOCHENTAG(A1;3))&"."&MONAT(A1-WOCHENTAG(A1;3))&"."&JAHR(A1-WOCHENTAG(A1;3))&" - "& TAG(A1-WOCHENTAG(A1;3)+4)&"."&MONAT(A1-WOCHENTAG(A1;3)+4)&"."&JAHR(A1-WOCHENTAG(A1;3)+4)
Kürzer kannst du es dir machen, indem du die wiederkehrenden Elemente entweder in eine zwischenzelle oder einen Namen mit den Formeln definierst.
Member: speedy132
speedy132 Feb 27, 2015 at 07:58:21 (UTC)
Goto Top
Hallo Uwe,

ich habe einen neuen Thread gestartet. Da hat mir Eisbein schon einen Hilfestellung gegeben, aber evtl weisst du da noch etwas besseres bzw. eine andere Lösung.

Kannst du da mal schauen:
Excel Liste mit Datenüberprüfung anlegen und anschließend selektieren ????

Herzlichen Dank