(defun c:GetExcel() ;;; / excelDatNam WorkBookName sheetName vlaobjs msx wbook sheet selection selZellen) (setq excelDatNam (getfiled "Excel-Datei wählen" (getvar "dwgprefix") "xls" 8)) (setq sheetName (getstring t "\nSheetName: ")) (if (not vlax-dump-object) (vl-load-com) ) ;;; In der Funktion xls wird die TypeLibrary von Excel inmportiert und somit kann man die ;;; Methoden, Konstanten und Eigenschaften (Properties) so verwenden wie in VBA (setq vlaobjs(xls excelDatNam sheetName)) ;;; Variablen die verwendet werden ;;; msx = VLAObjekt "Microsoft Excel" ;;; wbook = VLAObjekt "Workbook Translation der Datei Translation.xls" ;;; sheet = VLAObjekt "ActiveSheet 'Translation' im wbook" ;;; ;;; Funktionen die zur Verfügung gestellt werden ;;; msxc- = Zugriff auf die MS-Excel Konstanten ;;; msxp- = Zugriff auf die MS-Excel Eigenschaften ;;; msxm- = Zugriff auf die MS-Excel Methoden (setq msx(nth 0 vlaobjs) wbook(nth 1 vlaobjs) sheet(nth 2 vlaobjs) ) ;;; Collection-Objekt as Range "Cells" mit den Zellen des Bereichs "A1:D4" auffüllen ;;; Hierzu verwende ich die MSExcel-Methode sheet.Range("A1:D4") ;;; ;;; (setq cells(msxp-get-range sheet "A1:D4")) ;;; (setq cells(msxp-get-range sheet "A1:D4")) ;;; ;;; Ein Collection-Objekt kann mit (vlax-for ) durchlaufen werden ;;; leider hab ich keine Möglichkeit gefunden wie man eine (Vlax-for .... )-Schleife frühzeitig verlassen kann ;;; Es werden also alle Zellen in der Auflistung durchlaufen ;;; ;;; (vlax-for i cells ;;; Variable i entspricht jeder einzelnen Zelle des Bereichs "Cells" ;;; (progn ;;; (if (/= "" (setq wert(vlax-variant-value (msxp-get-FormulaR1C1 i)))) ;;; Wenn Inhalt in Zelle "i" ungleich "" dann Inhalt in Wert speichern ;;; (progn ;;; (setq adrLocal(vlax-get i 'AddressLocal)) ;;; ZellenAdresse Bsp. $B$3 auslesen ;;; (if Zellen ;;; (setq Zellen(append Zellen (list adrLocal wert))) ;;; (setq Zellen(list adrLocal wert)) ;;; ) ;;; ) ;;; ) ;;; ) ;;; ) ;;; Zellen = ("$A$1" "Plan View" "$B$1" "Draufsicht / Grundriss" "$C$1" "????" "$D$1" "blablabla" ... "$D$4" "???") ;;; Um auf die aktuell selektierten Zellen zuzugreifen würd ich es mal mit ;;; (msxp-get-rangeSelection (vlax-get msx 'activewindow)) (setq selection(msxp-get-rangeselection (vlax-get msx 'activewindow)) selZellen nil ) (vlax-for item selection (setq selZellen(append selZellen (list (vlax-variant-value (msxp-get-FormulaR1C1 item))))) ) ) ;;; Funktion "adrloc" ersetzt z.B. "$A$1" mit "A1" (defun adrloc(adresslocal) (vl-string-subst "" "$" (vl-string-subst "" "$" adresslocal)) ) ;;; In der Funktion xls wird die TypeLibrary von Excel inmportiert und somit kann man die ;;; Methoden, Konstanten und Eigenschaften (Properties) so verwenden wie in VBA ;;; VLA-Objekte die erzeugt werden ;;; msx = VLAObjekt "Microsoft Excel" Funktioniert bei allen Versionen ab Excel.8 ;;; wbook = VLAObjekt "Workbook Translation der Datei Translation.xls" ;;; sheet = VLAObjekt "ActiveSheet 'Translation' im wbook" ;;; ;;; Funktionen die zur Verfügung gestellt werden ;;; msxc- = Zugriff auf die MS-Excel Konstanten ;;; msxp- = Zugriff auf die MS-Excel Eigenschaften ;;; msxm- = Zugriff auf die MS-Excel Methoden ;;; ;;; über das "Apropos"-Fenster kann man sich die Konstanten, Methoden und Eigenscaften anzeigen lassen ;;; Aber erst nachdem MS-Excel einmal initialisiert wurde ;;; Filter ;;; Konstanten = msxc- ;;; Methoden = msxm- ;;; Properties = msxp- (defun xls(xlsName actSheetName / xlCurVer XlSheet XlTypeLib xlHlpDir xlTblFileName msx wbook sheets sheet actsheet) ;;; Auslesen der Werte "CurVer", "CLSID", "Typelib", "HelpDir" zur aktuell verwendeten Excel-Version ;;; XlTlbFileName = "//EXCEL.EXE" (setq XlCurVer(vl-registry-read "HKEY_CLASSES_ROOT\\Excel.Application\\CurVer") XlSheet(vl-registry-read "HKEY_CLASSES_ROOT\\Excel.Sheet\\CLSID") XlTypeLib(vl-registry-read (strcat "HKEY_CLASSES_ROOT\\CLSID\\" XlSheet "\\Typelib")) XlHlpDir(vl-registry-read (strcat "HKEY_CLASSES_ROOT\\Typelib\\" XlTypelib "\\1.0\\HELPDIR")) XlTlbFileName(strcat XlHlpDir "EXCEL.EXE") wbookName(strcat (vl-filename-base xlsName) ".xls") ) ;;; Import der Microsoft EXCEL Typelibrary. (IF (EQUAL nil msxc-xlClosed) ;;; Überprüfung auf vorhandensein einer MS-Excel-Konstanten (VLAX-IMPORT-TYPE-LIBRARY :TLB-FILENAME XlTlbFileName :METHODS-PREFIX "msxm-" :PROPERTIES-PREFIX "msxp-" :CONSTANTS-PREFIX "msxc-" ) ) ;;; Eine Verbindung zu Microsoft Excel herstellen ;;; msx = VLAObjekt "Microsoft Excel" (SETQ msx (VLAX-GET-OBJECT XlCurVer)) (IF (EQUAL nil msx) (PROGN ;;; Excel läuft nicht, also starte es. (SETQ msx (VLAX-CREATE-OBJECT XlCurVer)) ;;; Excel einblenden (VLA-PUT-VISIBLE msx :VLAX-TRUE) ) ) ;;; Wenn Excel gestartet war bzw. gestartet werden konnte ;;; können die WorkBooks, das aktuelle WorkBook und die aktuelle Tabelle ermittelt werden (IF (/= nil msx) (PROGN ;;; Das Auflistungs-Objekt der geöffneten XLS-Dokumente abrufen (setq wbook nil wbks(vlax-get msx 'workbooks) ;;; Variable wbks = VLAObjekt ) (vlax-for item wbks (progn (setq wbkName(vla-get-name item) ;;; WorkBookName abrufen wbkPfad(vla-get-path item) ;;; WorkBookPfad abrufen ) (if (= wbkName wbookName) ;;; WorkBookName z.B. Translation.xls (setq wbook item) ;;; Variable wbook = VLAObjekt ) ) ) (if (not wbook) ;;; Datei war noch nicht offen ? (setq wbook(msxm-open wbks xlsName)) ;;; Also Datei öffnen ) (if (not wbook) ;;; Datei konnte immer noch nicht göffnet oder gefunden werden (progn (alert (strcat "Die Datei \"" wbookName "\" konnte nicht geladen werden\n\nDas Programm wird beendet")) (exit) ) ) ;;; Das Auflistungs-Objekt der Tabellen (Sheets) aus der Datei wbook abrufen (setq sheet nil sheets(vlax-get wbook 'sheets) ) (vlax-for item sheets (progn (setq sheetName(vla-get-name item)) ;;; SheetName abrufen (if (= sheetName actSheetName) ;;; SheetName z.B. "Übersetzungen" (setq sheet item) ;;; Variable sheet = VLAObjekt ) ) ) (msxm-activate sheet) ;;; Die Tabelle "actSheetName" aktivieren (list msx wbook sheet) ;;; RetVal Liste (VLAObjekt "MSExcel-Application" VLAObjekt "MSExcel-WorkBook" VLAObjekt "MSExcel-Sheet") ) ) ) ;|«Visual LISP© Format Options» (72 2 4 2 nil "Ende von " 60 6 2 1 1 nil T nil T) ;*** KEINEN Text unterhalb des Kommentars hinzufügen! ***|;