Excel OLE - Printer festlegen



  • Hi,

    um bei Excel über OLE den akt. Druckernamen zu bekommen kann man mit

    AnsiString sRetVal = vExcel.OlePropertyGet("ActivePrinter");
    

    einen String erhalten, der wie folgt aussehen kann:

    Kyocera Mita FS-1020D KX auf Ne01:

    also Druckername und ein "auf Ne0815:".

    Problem ist, das verschiedene Drucker nicht nur auf Ne01 sein können. Man also beim Setzten des Druckernamens in Excel auch schön danebenhauen kann:

    vExcel.OlePropertySet("ActivePrinter", sPrinterName.c_str());
    

    Kennt jemand eine Möglichkeit, einen Printer auf andere Art und Weise bei Excel einzustellen. Vielleicht dass man eine Liste mit den verfügbaren Printern zurückbekommt, oder einen Printer über einen Index setzen kann? Diverse russische, chinesische und spanische Seiten brachten kein Ergebnis.

    MfG F98.



  • Standardfrage: wie würde das entsprechende Excel-Makro aussehen?



  • Das zugehörige Makro sieht so aus:

    Sub Makro1()
    '
    ' Makro1 Makro
    '
    
    '
        Application.ActivePrinter = "PDFCreator auf Ne00:"
        ActiveWindow.SelectedSheets.PrintOut Copies:=1, ActivePrinter:= _
            "PDFCreator auf Ne00:", Collate:=True
    End Sub
    

    Er setzt also eben den komischen zusammengefrickelten Namen für den ActivePrinter. Je nachdem, was man zuvor in der Druckerliste ausgewählt hat. 🙂 Es wird also genau der Punkt geschickt übersprungen, den ich wissen wollte.



  • Hmm.

    Kannst du diesen Satz vielleicht noch mal etwas erläutern?

    F98 schrieb:

    Problem ist, das verschiedene Drucker nicht nur auf Ne01 sein können. Man also beim Setzten des Druckernamens in Excel auch schön danebenhauen kann

    Du hast den PC und du hast den Druckernamen, die Kombination sollte die gewünschte Ressource doch hinreichend genau beschreiben!?



  • Ich muß weiter ausholen.

    Ich bin gerade dabei eine Klasse zu schreiben, die OLE-Zugriffe auf Excel kapselt. Die Funktionen für die ActivePrinter-Property sehen so aus:

    AnsiString  __fastcall TMLExcel::GetActivePrinter()
    {
         AnsiString sRetVal = "n/a";
    
         if (Connected)
         {
            try
            {S
               sRetVal = vExcel.OlePropertyGet("ActivePrinter");
            }
            catch ( ... )
            {
            }
         }
    
         return sRetVal;
    }
    
    void __fastcall TMLExcel::SetActivePrinter(AnsiString sPrinterName)
    {
         if (Connected)
         {
            try
            {
               vExcel.OlePropertySet("ActivePrinter", sPrinterName.c_str());
            }
            catch ( ... )
            {
            }
         }
    }
    

    Prinzipiell wäre es ja kein Problem, sich über das BCB-Printer() Objekt die verfügbaren/eingestellten Drucker zu holen. Dort bekommt man aber nur die Druckernamen als solche zurück, nicht aber dieses omynöse Ne00, Ne01 usw. welches auf jedem Rechner irgendwie anders zu jedem x-bel Drucker zugeordnet sein kann. Erschwehrend kommt noch dieses "auf" zwischendrin dazu, da z.B. auf englischen Rechnern dieses "auf" garantiert nicht mit in den String rein kommt. 🙂

    Auf meinem Rechner kann also der Kyocera an Ne00 hängen und auf dem vom Arbeitskollegen an Ne01, das weiß ich aber nicht und wie ich das rausbekomme weiß ich auch nicht. Sackgasse.

    Das freche Zuweisen des ActivePrinters über einen Index funktioniert auch nicht:

    vExcel.OlePropertySet("ActivePrinter", 1); // produziert eine Exception
    

    (Aus der Idee, den PrintDialog vom BCB zu benutzen und dann dort den Index vom akt. ausgewählten Drucker abzufragen, wurde also auch nichts.)

    Ebenfalls habe ich deswegen, wie schon oben beschrieben, nach einer Alternative (Inet, C++ Forum) gesucht, wie man den Drucker in Excel einfacher zuweisen kann. Entweder weisen die direkt den Druckernamen mit einem Ne00: hinten dran zu oder die Versuche über den DruckerIndex sind mit dem selben Resultat abgestorben wie meine.

    Bleibt mir also nur noch eine Variante: Irgendwas systemseitiges (API?) was mir die fertigen Strings (verfügbare Drucker) a la "Kyocera auf Ne00" usw. ausliest und zurückgibt.

    Vorschläge?



  • *ping*


Anmelden zum Antworten