Rechnungen mit aus Excelzeile nur mit Seriendruck?
jobo
- software
Hallo,
in einer Exceltabelle sollen die Rechnungsdaten vorhanden sein. Die Rechnung dann wiederum im Wordformat. Mit der Seriendruckfunktion kann man das zumindest drucken. Die Rechnung sollte natürlich aber eigentlich auch gespeichert werden. Und die relevanten Positionen (Ust. und brutto) ausgerechnet werden (das macht die Exceltabelle ja schon).
Wie geht es am effizientesten, ohne zuviel Copy und Paste? Einmal was rüberkopieren würde ja vielleicht noch gehen, wenn man dafür der Userin das gewurschtel mit der Zeilenauswahl für den Seriendruck spart. Aber in der Exceltabelle steht ja alles nebeneinander, und die Rechnungsnummer wäre eigentlich auch schön, die an einem single-point-of-change zu haben.
Für Tipps dankbar,
Gruß
jobo
Hallo,
am usabilsten wäre ja eigentlich eine makrogesteuerte Schweinerei, mit einem Button am Ende jeder Excelzeile (kriegt man den mit copy und paste rüber?) oder einem einzigen in der Tabelle (dann müsste die fragliche Zeile markiert sein), welches dann das passende Worddokument aufruft und die Zellen in die Vorlage einfügt (das würde ja theoretisch dann auch mit Suchen/Ersetzen gehen). Oder ist es (VBA-technisch) einfacher, die Rechnung statt in Word (so ist sie jetzt vorhanden und wird halt händisch bestückt) in Excel zu basteln?
Gruß
jobo
Hallo,
Hallo,
am usabilsten wäre ja eigentlich eine makrogesteuerte Schweinerei, mit einem Button am Ende jeder Excelzeile (kriegt man den mit copy und paste rüber?) oder einem einzigen in der Tabelle (dann müsste die fragliche Zeile markiert sein), welches dann das passende Worddokument aufruft und die Zellen in die Vorlage einfügt (das würde ja theoretisch dann auch mit Suchen/Ersetzen gehen). Oder ist es (VBA-technisch) einfacher, die Rechnung statt in Word (so ist sie jetzt vorhanden und wird halt händisch bestückt) in Excel zu basteln?
Work in Progress sieht jetzt so aus:
Private Sub drucky_Click()
' MsgBox ActiveCell.Row
'MsgBox "aaa" & Cells(ActiveCell.Row, 2).Value
Dim appWord As Object
Dim docTest As Object
Const wdMyReplaceAll = 2
Dim ColName As String
Dim Find As String
Dim MyReplace As String
Dim Name As String
Dim Rechnnr As String
Dim SaveAs As String
' ist wohl Konstant der Einlesepfad
Dim Pfad As String
Pfad = ActiveWorkbook.Path & "\"
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")
Set objSelection = objWord.Selection
'docTest.SaveAs (CreateObject("WScript.Shell").Specialfolders("Desktop") & "\test3")
For i = 2 To ActiveSheet.UsedRange.Columns.Count
ColName = Cells(1, i).Value
Find = "{" & ColName & "}"
MyReplace = Cells(ActiveCell.Row, i).Value
If ColName = "netto" Or ColName = "brutto" Or ColName = "Steuer" Then
MyReplace = Format(MyReplace, "#,##0.00")
End If
If ColName = "Name" Then
Name = MyReplace
End If
If ColName = "Rechnnr." Then
Rechnnr = Replace(MyReplace, "/", "-")
End If
objSelection.Find.Text = Find
objSelection.Find.Forward = True
objSelection.Find.MatchWholeWord = True
objSelection.Find.Replacement.Text = MyReplace
objSelection.Find.Execute , , , , , , , , , , wdReplaceAll
Next
SaveAs = Pfad & Rechnnr & "_" & Name
objDoc.SaveAs (SaveAs)
End Sub
Gruß
jobo
Hallo,
Oder ist es (VBA-technisch) einfacher, die Rechnung statt in Word (so ist sie jetzt vorhanden und wird halt händisch bestückt) in Excel zu basteln?
Du hast geringere Komplexität, weil Du nur eine Anwendung automatisierst.
Work in Progress
ohne Fehlerbehandlung :-)
[code lang=vba]
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")
Schlechte Idee.
a) Nutze eine Dokumentvorlage.
b) Verwende eine sinnvolle Verzeichnisstruktur
c) Benenne die Dokumentvorlage sinnvoll.
Set objSelection = objWord.Selection
???
Lerne mit Range-Objekten umzugehen.
SaveAs = Pfad & Rechnnr & "_" & Name
Es ist ganz bestimmt keine besonders gute Idee, die Rechnungen im gleichen Verzeichnis wie die "Anwendung" abzulegen, siehe b).
Du musst *zwingend* den Dateinamen kontextgerecht behandeln. In Dateinamen sind bestimmte Zeichen nicht zugelassen. Sorge dafür, dass diese nicht verwendet werden.
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
Hallo,
Oder ist es (VBA-technisch) einfacher, die Rechnung statt in Word (so ist sie jetzt vorhanden und wird halt händisch bestückt) in Excel zu basteln?
Du hast geringere Komplexität, weil Du nur eine Anwendung automatisierst.
Work in Progress
ohne Fehlerbehandlung :-)
Wie geht Fehlerbehandlung (;-///)???
[code lang=vba]
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")Schlechte Idee.
a) Nutze eine Dokumentvorlage.
Na ich dachte, das mache ich der Userin einfacher, wenn es ein .doc ist, damit sie selbst {Spaltenname} einsetzen könnte, wenn sie wollte, es also anpassen kann. Kaum steht da .dot kommen schon wieder fragen.
b) Verwende eine sinnvolle Verzeichnisstruktur
Ja, Aufteilen Anwendung, Daten, Ausgabe.
c) Benenne die Dokumentvorlage sinnvoll.
Es gibt nur eine Userin und eine Vorlage (;-). Besser wäre "Rechnungsvorlage", stimmt schon.
Set objSelection = objWord.Selection
???
Lerne mit Range-Objekten umzugehen.
Ja in Excel kann ich das irgendwie. Mir war und ist nicht klar, wie ich in Word einfach sagen kann: kompletten Text durchlaufen. Das reicht mir hier ja schon.
SaveAs = Pfad & Rechnnr & "_" & Name
Es ist ganz bestimmt keine besonders gute Idee, die Rechnungen im gleichen Verzeichnis wie die "Anwendung" abzulegen, siehe b).
Du musst *zwingend* den Dateinamen kontextgerecht behandeln.
So sieht die momentan aus:
If ColName = "Rechnnr." Then
Rechnnr = Replace(MyReplace, "/", "-")
End If
(;-)
In Dateinamen sind bestimmte Zeichen nicht zugelassen. Sorge dafür, dass diese nicht verwendet werden.
da wäre dann noch der "" und vermutlich sonstwelcher kryptischer Krempel, den Windows nicht haben möchte.
Dank und Gruß
Robert aka jobo
Hallo,
ohne Fehlerbehandlung :-)
Wie geht Fehlerbehandlung (;-///)???
On Error ...
On Error Resume Next ' Mache mit der nächsten Anweisung weiter
' Prüfe, ob das Err-Objekt nicht etwa was enthält
' Prüfe, ob Deine Objektvariable etwas enthält ...
On Error GoTo <Error-Handling-Bereich> ...
siehe VBA-Hilfe zu On Error.
[code lang=vba]
Set objWord = CreateObject("Word.Application")
objWord.Visible = True
Sehr optimistisch. Das Erzeugen des Objektes kann fehlschlagen
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")
Sehr optimistisch. Das Öffnen einer Datei kann fehlschlagen.
a) Nutze eine Dokumentvorlage.
Na ich dachte, das mache ich der Userin einfacher, wenn es ein .doc ist, damit sie selbst {Spaltenname} einsetzen könnte, wenn sie wollte, es also anpassen kann. Kaum steht da .dot kommen schon wieder fragen.
Ach: Datei -> Öffnen -> Vorlagen-Datei auswählen ist viel zu schwierig?
Ja, auf Vorlagendateien doppelklicken hat nicht den gewünschten Effekt. Ich finde es traurig, welche Vernachlässigung Vorlagendateien erfahren.
b) Verwende eine sinnvolle Verzeichnisstruktur
Ja, Aufteilen Anwendung, Daten, Ausgabe.
c) Benenne die Dokumentvorlage sinnvoll.
Es gibt nur eine Userin und eine Vorlage (;-). Besser wäre "Rechnungsvorlage", stimmt schon.
Set objSelection = objWord.Selection
???
Lerne mit Range-Objekten umzugehen.
Ja in Excel kann ich das irgendwie. Mir war und ist nicht klar, wie ich in Word einfach sagen kann: kompletten Text durchlaufen. Das reicht mir hier ja schon.
Du musst *zwingend* den Dateinamen kontextgerecht behandeln.
If ColName = "Rechnnr." Then
Rechnnr = Replace(MyReplace, "/", "-")
Schreibe Dir eine vernünftige Funktion. Füge diese in Deine allgemeine Schnippselsammlung ein.
In Dateinamen sind bestimmte Zeichen nicht zugelassen. Sorge dafür, dass diese nicht verwendet werden.
da wäre dann noch der "" und vermutlich sonstwelcher kryptischer Krempel, den Windows nicht haben möchte.
http://msdn.microsoft.com/en-us/library/aa365247(v=vs.85).aspx
Freundliche Grüße
Vinzenz
Hallo Vinzenz,
ohne Fehlerbehandlung :-)
Wie geht Fehlerbehandlung (;-///)???On Error ...
On Error Resume Next ' Mache mit der nächsten Anweisung weiter
' Prüfe, ob das Err-Objekt nicht etwa was enthält
' Prüfe, ob Deine Objektvariable etwas enthält ...On Error GoTo <Error-Handling-Bereich> ...
siehe VBA-Hilfe zu On Error.
Coming soon...;
Sehr optimistisch. Das Erzeugen des Objektes kann fehlschlagen
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")
Sehr optimistisch. Das Öffnen einer Datei kann fehlschlagen.
a) Nutze eine Dokumentvorlage.
Na ich dachte, das mache ich der Userin einfacher, wenn es ein .doc ist, damit sie selbst {Spaltenname} einsetzen könnte, wenn sie wollte, es also anpassen kann. Kaum steht da .dot kommen schon wieder fragen.
Ach: Datei -> Öffnen -> Vorlagen-Datei auswählen ist viel zu schwierig?
Naja, ehrlich gesagt: ja. Draufklicken ist besser. Was der Bauer nicht kennt, das isst er nicht. Was die Userin nicht kennt, das ...
Ja, auf Vorlagendateien doppelklicken hat nicht den gewünschten Effekt. Ich finde es traurig, welche Vernachlässigung Vorlagendateien erfahren.
Da magst Du sicher recht haben.
Lerne mit Range-Objekten umzugehen.
Ja in Excel kann ich das irgendwie. Mir war und ist nicht klar, wie ich in Word einfach sagen kann: kompletten Text durchlaufen. Das reicht mir hier ja schon.
Was wäre denn hier richtiger?
Du musst *zwingend* den Dateinamen kontextgerecht behandeln.
If ColName = "Rechnnr." Then
Rechnnr = Replace(MyReplace, "/", "-")Schreibe Dir eine vernünftige Funktion. Füge diese in Deine allgemeine Schnippselsammlung ein.
(;-) - irgendwie bin ich mit dem Funktionsding da noch auf Kriegsfuss, weil das nicht genauso geht wie in Javascript oder PHP, aber ich werds schon hinbekommen. Der Rückgabewert muss immer so wie die Funktion heißen, gelle?
In Dateinamen sind bestimmte Zeichen nicht zugelassen. Sorge dafür, dass diese nicht verwendet werden.
da wäre dann noch der "" und vermutlich sonstwelcher kryptischer Krempel, den Windows nicht haben möchte.
http://msdn.microsoft.com/en-us/library/aa365247%28v=vs.85%29.aspx
* < (less than)
* > (greater than)
* : (colon)
* " (double quote)
* / (forward slash)
* \ (backslash)
* | (vertical bar or pipe)
* ? (question mark)
* * (asterisk)
In PHP kann ich ein Array übergeben, beim "zu ersetzenden" Parameter. Gibt es dazu eine Analogie bei VBA oder replace ich schön eins nach dem anderen? (;-)
Dank und Gruß
Robert aka jobo
Hallo Vinzenz,
Hallo,
ohne Fehlerbehandlung :-)
Wie geht Fehlerbehandlung (;-///)???On Error ...
On Error Resume Next ' Mache mit der nächsten Anweisung weiter
' Prüfe, ob das Err-Objekt nicht etwa was enthält
' Prüfe, ob Deine Objektvariable etwas enthält ...On Error GoTo <Error-Handling-Bereich> ...
siehe VBA-Hilfe zu On Error.
Habe ich dann mal so abgekupfert, oder ist das an den falschen Stellen?
'...
Set objWord = CreateObject("Word.Application")
On Error GoTo Fehler
objWord.Visible = True
Set objDoc = objWord.Documents.Open(Pfad & "Vorlage.doc")
On Error GoTo Fehler
'... am Ende dann
Fehler:
Set objWord = Nothing
Set objDoc = Nothing
MsgBox "FehlerNr.: " & Err.Number & vbNewLine & vbNewLine _
& "Beschreibung: " & Err.Description _
, vbCritical, "Fehler"
Schreibe Dir eine vernünftige Funktion. Füge diese in Deine allgemeine Schnippselsammlung ein.
So in etwa?
Public Function AllowedFilenameString(FileNamePartInSpe As String)
Dim NotAllowedList As Variant ' Liste der Primteiler
NotAllowedList = Array("<", ">", ":", """", "/", "\", "|", "?", "*")
For Each NotAllowedSign In NotAllowedList
FileNamePartInSpe = Replace(FileNamePartInSpe, NotAllowedSign, "-")
Next NotAllowedSign
AllowedFilenameString = FileNamePartInSpe
End Function
Private Sub TestAllowedFilenameFunction()
Dim TestString As String
TestString = """a/b/\*$%:|?<>$"
MsgBox (TestString)
Dim myReturnString As String
myReturnString = AllowedFilenameString(TestString)
MsgBox (myReturnString)
End Sub
Dank und Gruß
Robert aka jobo
Hello,
man kann auch direkt in Word-Tabellen rechnen.
Und mit ein wenig VBA kann das auch ganz komfotabel werden...
Liebe Grüße aus dem schönen Oberharz
Tom vom Berg