jobo: Rechnungen mit aus Excelzeile nur mit Seriendruck?

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

  1. 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

    1. 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

      1. 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

        1. 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

          1. 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

            1. 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

            2. 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

  2. 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

    --
     ☻_
    /▌
    / \ Nur selber lernen macht schlau
    http://bergpost.annerschbarrich.de