Open Excel via lisp problem

Open Excel via lisp problem

C.Utzinger
Collaborator Collaborator
1,815 Views
4 Replies
Message 1 of 5

Open Excel via lisp problem

C.Utzinger
Collaborator
Collaborator

HI

I need a little help...

I have a routine wich opens an Excel template and write some data in to it.

First i had the Lee Mac Open-Routine (LM:open), but this one does not work properly with Office 2016.

Now I have the following Routine, but this one changes the print-area of the template and drives me crazy.

Can somebody help me?

 

(defun OpenExcel (ExcelFile$ SheetName$ Visible / Sheet$ Sheets@ Worksheet)
  (if (= (type ExcelFile$) 'STR)
    (if (findfile ExcelFile$)
      (setq *ExcelFile$ ExcelFile$)
      (progn
        (alert (strcat "Excel file " ExcelFile$ " not found."))
        (exit)
      );progn
    );if
    (setq *ExcelFile$ "")
  );if
  (gc)
  (if (setq *ExcelApp% (vlax-get-object "Excel.Application"))
    (progn
      (vlax-release-object *ExcelApp%)(gc)
    );progn
  );if
  (setq *ExcelApp% (vlax-get-or-create-object "Excel.Application"))
  (if ExcelFile$
    (if (findfile ExcelFile$)
      (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Open ExcelFile$)
      (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
    );if
    (vlax-invoke-method (vlax-get-property *ExcelApp% 'WorkBooks) 'Add)
  );if
  (if Visible
    (vla-put-visible *ExcelApp% :vlax-true)
  );if
  (if (= (type SheetName$) 'STR)
    (progn
      (vlax-for Sheet$ (vlax-get-property *ExcelApp% "Sheets")
        (setq Sheets@ (append Sheets@ (list (vlax-get-property Sheet$ "Name"))))
      );vlax-for
      (if (member SheetName$ Sheets@)
        (vlax-for Worksheet (vlax-get-property *ExcelApp% "Sheets")
          (if (= (vlax-get-property Worksheet "Name") SheetName$)
            (vlax-invoke-method Worksheet "Activate")
          );if
        );vlax-for
        (vlax-put-property (vlax-invoke-method (vlax-get-property *ExcelApp% "Sheets") "Add") "Name" SheetName$)
      );if
    );progn
  );if
  (princ)
);defun OpenExcel

   

 

0 Likes
Accepted solutions (1)
1,816 Views
4 Replies
Replies (4)
Message 2 of 5

cadffm
Consultant
Consultant

1. no code part for filling data to excel,

2. no template file,

 

3. no issue = no solution ?

 

I think the problem is in point 1. or/and point 2.

Only open a new file based on a template will not show a problem.

 

Add a working example and we will test and see, ok?

Sebastian

Message 3 of 5

C.Utzinger
Collaborator
Collaborator

HI

Thanks for your reply.

Attached you have all what you need I think.

There is an old version wich works perfect with older Office-versions like 2010, but not with 2016.

And there is the new one wich works with Office 2016, but then i have the problem with the print-area.

 

The Excel part it is a little mess I know. The hole Routine is a little mess :(...

 

Thank you in advance...

 

0 Likes
Message 4 of 5

cadffm
Consultant
Consultant
Accepted solution

Und wieder zahlt es sich aus helfen zu wollen, sprich: Wieder was gelernt (wofür auch immer).

Wenn ich es richtig recherchiert habe betrifft es nur die nicht-englischen Sprachversionen,

dabei wird der Plotbereich beim öffnen über die COM-Schnittstelle ignoriert.

 

Also ein generelles Verhalten beim öffnen über die COM-Schnittstelle eines deutschen Excels.

Problem: Der Druckbereich der Seiteneinrichtung in der Tabelle steht auf "" anstatt auf "PRINT_AREA" (oder vielleicht würde auch DRUCKBEREICH gehen, aber nur im deutschen, also ist PRINT_AREA vorzuziehen?)

 

 

Für jede Tabelle müßte man daher explizit den Druckbereich erneut angeben, zuvor wäre zu prüfen ob

es einen entsprechenden Namensbereich gibt (nur für Sonderfällen, nicht relevant für deine Standardvorlagen).

 

Dies müßte man für jeden Sheet machen und vorher testen ob der Namensbereich *PRINT_AREA vorhanden ist.

 

[-[an der Stelle bleibe ich mal Oberflächlich / bin kein Exceljunkie, ggf. sind noch mehr Punkte in der Seiteneinrichtung anzupassen; Titelzeilen? Wiederholzeilen? - Ich habe nicht nachgesehen, dies sollte nur auf mögliche weitere Dinge bezüglich der Seiteneinrichtung aufmerksam machen ]-]

 

Wenn ich es in der Kürze richtig geblickt habe:

In den Namen (setq Names (vlax-get-property (vlax-get-property *ExcelApp% "ACTIVESHEET") 'Names))

Wirst du zumindest in deinem Fall "'COMAX-LISTE'!PRINT_AREA" finden, also Sheetname+PRINT_AREA,

dann würde ich PrintArea von Sheetname auf PRINT_AREA setzen.

 

 

Also kurz:

In deinem Fall (verwendung der eigneen Vorlage/Datei): Druckbereich existiert, der einzige Sheet ist aktuell,

also kannst du blindlinks

(vlax-put-property  (vlax-get-property
                (vlax-get-property *ExcelApp% "ACTIVESHEET")
                        'PageSetup
                     )
                     'PrintArea "Print_Area"
)

setzen.

Um das ganze dann allgemeingültiger zu gestalten mußt du noch einmal genauer nachsehen,

alle Sheets durchlaufen für den Fall die Vorlage hat mehrere, dann den entsprechenden Druckbereich setzen in den Seiteneinrichtungen der Sheets.

 

So, na toll, [EDIT - zu früh abgeschickt 😉 ]

jetzt müßte ich meine Eigene Excel-Routine ebenfalls anpassen, denn ich gehe denselben Weg.

Allerdings liegt nie etwas außerhalb meines gewünschten Druckbereiches und in diesen Fällen

ändert sich der Druckbereich auch nicht (der Grund dafür warum mir deine Öffnen-Routine, wie auch meine eigene, keine Probleme in der erstellten Exceldatei verursachte).

 

Jetzt wo ich darum weiß...muss ich leider ändern, geht nicht anders, LOL.

Danke und aus.

Sebastian

0 Likes
Message 5 of 5

C.Utzinger
Collaborator
Collaborator

Hey vielen, vielen Dank!!!

 

Endlich funktioniert es wieder.

 

Das mit dem Excel ist zu viel für mich :)...

 

Schöne Grüsse

0 Likes