Hot News:

Mit Unterstützung durch:

  Foren auf CAD.de (alle Foren)
  Lisp
  Excel API Aufruf erzeugen

Antwort erstellen  Neues Thema erstellen
CAD.de Login | Logout | Profil | Profil bearbeiten | Registrieren | Voreinstellungen | Hilfe | Suchen

Anzeige:

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen nächster neuer Beitrag | nächster älterer Beitrag
  
Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für Autodesk Produkte
Autor Thema:  Excel API Aufruf erzeugen (227 mal gelesen)
archi.archi
Mitglied



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 66
Registriert: 08.10.2010

AMD Ryzen 5 3600 6-Core
NVIDIA GeForce GTX 1050 Ti
Win 10 64bit
AutoCAD 2023
Revit 2023

erstellt am: 16. Sep. 2022 10:13    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Forumer,

über die Excel-Api möchte ich durch eine kleinen Anpassung der (defun GetExcel) aus getexcel.lsp von Terry Miller den max. verwendeten Zellbereich (also MaxRanges) einer Tabelle ermitteln.

mit VBA einfach:

Code:
letztezelle = ActiveSheet.Range("A1").SpecialCells(xlCellTypeLastCell).Address(False, False)

mit Lisp komme ich leider bei der richtigen Zusammenstellung dieses Api-Aufrufes nicht weiter:

Code:
(setq MaxRanges (vlax-get-property (vlax-get-property (vlax-get-property
          (vlax-get-property *ExcelApp% "ActiveSheet") "Range" "A1") "SpecialCells(xlCellTypeLastCell)") "Address(False, False)")
);setq

Fehler: ActiveX-Server hat einen Fehler zurückgegeben: Typenkonflikt

Wer kann mir einen sachdienlichen Hinweis geben?

Beste Grüße

archi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Meldin
Mitglied



Sehen Sie sich das Profil von Meldin an!   Senden Sie eine Private Message an Meldin  Schreiben Sie einen Gästebucheintrag für Meldin

Beiträge: 380
Registriert: 15.07.2011

ACA2020
Windows10

erstellt am: 16. Sep. 2022 11:44    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

So was ?
Code:
(setq RangeAdresse
    (vlax-get-property
      (vlax-get-property xlsSheet "UsedRange")
      "Address"
      1
      1
      0
    )
      )

------------------
Gruß Wolfgang

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archi.archi
Mitglied



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 66
Registriert: 08.10.2010

AMD Ryzen 5 3600 6-Core
NVIDIA GeForce GTX 1050 Ti
Win 10 64bit
AutoCAD 2023
Revit 2023

erstellt am: 16. Sep. 2022 12:26    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Wolfgang,

vielen Dank für den Hinweis auf "UsedRange".

Mittlerweile bin ich über
https://ww3.cad.de/foren/ubb/Forum145/HTML/004829.shtml#000001
auch schon in diese Richtung geleitet worden.

Das Einlesen großer Datenmengen aus Excel mit vlax ist scheinbar langsam. Daher muss der einzulesende Bereich begrenzt werden.

So sieht die Anpassung von (defun GetExcel) jetzt aus und ermöglicht das Einlesen nur der "verwendeten" Zellen:

Code:

;VBA: bereich = blatt.UsedRange
(setq UsedRange
  (vlax-get-property
    (vlax-get-property *ExcelApp% "ActiveSheet")
    "UsedRange"
    );end vlax-get-property
);setq
(setq MaxRow# (vlax-get-property (vlax-get-property UsedRange "Rows") "Count"))
(setq MaxColumn# (vlax-get-property (vlax-get-property UsedRange "Columns") "Count"))

Bis zum nächsten Problem.   

Beste Grüße

archi

[Diese Nachricht wurde von archi.archi am 16. Sep. 2022 editiert.]

[Diese Nachricht wurde von archi.archi am 16. Sep. 2022 editiert.]

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Meldin
Mitglied



Sehen Sie sich das Profil von Meldin an!   Senden Sie eine Private Message an Meldin  Schreiben Sie einen Gästebucheintrag für Meldin

Beiträge: 380
Registriert: 15.07.2011

ACA2020
Windows10

erstellt am: 16. Sep. 2022 12:38    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

Zitat:
Original erstellt von archi.archi:

Das Einlesen großer Datenmengen aus Excel mit vlax ist scheinbar langsam.


wenn du immer darauf zugreifst ja sehr langsam.
wenn du dir aus dem UsedRange den Value(2) schnappst hast du alles sofort

------------------
Gruß Wolfgang

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archi.archi
Mitglied



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 66
Registriert: 08.10.2010

AMD Ryzen 5 3600 6-Core
NVIDIA GeForce GTX 1050 Ti
Win 10 64bit
AutoCAD 2023
Revit 2023

erstellt am: 16. Sep. 2022 13:00    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Wolfgang,

als Gelegenheits-Programmierer habe ich https://www.autolisp-exchange.com/LISP/GetExcel.lsp verwendet und angepasst.

Die Funktion kommt mir irgendwie langsam vor (Einlesen bis "Y99" ist schon fast eine Zumutung), daher wollte ich unbedingt UsedRange ermitteln und verwenden.

Für den Zweck, Planköpfe bzw. Beschrifter über Excel zu manipulieren, wird es aber reichen, da die Anzahl der Blöcke+Attribute i.A. begrenzt ist.

UsedRange Value(2) werde ich dann bei größeren Datenmengen ausprobieren.

Beste Grüße

archi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

archi.archi
Mitglied



Sehen Sie sich das Profil von archi.archi an!   Senden Sie eine Private Message an archi.archi  Schreiben Sie einen Gästebucheintrag für archi.archi

Beiträge: 66
Registriert: 08.10.2010

AMD Ryzen 5 3600 6-Core
NVIDIA GeForce GTX 1050 Ti
Win 10 64bit
AutoCAD 2023
Revit 2023

erstellt am: 22. Sep. 2022 15:07    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities

Hallo Wolfgang,

doch nochmal zum Thema Geschwindigkeit:
UsedRange mit 1-Rutsch-Einlesen ist sehr schnell.
Ich manipuliere nur Block-Attribute (also String), da geht es ohne Datentypen.

In (defun GetExcel) von Terry werden scheinbar die Excel-Datentypen zugordnet (also universell für alle möglichen Daten, nicht nur Attribute):

Code:

    (repeat MaxRow#
      (setq Data@ nil)
      (setq Column# 1)
      (repeat MaxColumn#
        (setq Range$ (strcat (Number2Alpha Column#)(itoa Row#)))
        (setq ExcelRange^ (vlax-get-property *ExcelApp% "Range" Range$))
        (setq ExcelVariant^ (vlax-get-property ExcelRange^ 'Value))
        (setq ExcelValue (vlax-variant-value ExcelVariant^))
        (setq ExcelValue
          (cond
            ((= (type ExcelValue) 'INT) (itoa ExcelValue))
            ((= (type ExcelValue) 'REAL) (rtosr ExcelValue))
            ((= (type ExcelValue) 'STR) (vl-string-trim " " ExcelValue))
            ((/= (type ExcelValue) 'STR) "")

          );cond
        );setq
        (setq Data@ (append Data@ (list ExcelValue)))
        (setq Column# (1+ Column#))
      );repeat
      (setq ReturnList@ (append ReturnList@ (list Data@)))
      (setq Row# (1+ Row#))
    );repeat

Die Listen werden spalten- und zeilenweise eingelesen. Das ist im Vergleich zum 1-Rutsch sehr langsam.

Geht das irgendwie schneller, oder muss der Excel-Datentyp immer sofort ausgewertet werden?

Beste Grüße

archi

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP



Fachkraft / Spezialist im Bereich Geoinformationssysteme / Geodatenmanagement (w/m/d)

Das Ingenieurbüro E. Schulz GmbH ist ein inhabergeführtes Unternehmen und seit über 20 Jahren tätig. Wir begleiten den gesamten Ablauf einer Baumaßnahme. Beginnend bei der fachlichen Beratung über Entwurfs- und Ausführungsplanung bis hin zu Bauleitung, Prüfung und Baustellendokumentation. Unsere Fachbereiche erstrecken sich über das gesamte Spektrum öffentlicher und privater Maßnahmen im Tief-, Straßen- und Hochbau....

Anzeige ansehenGeowissenschaften
Meldin
Mitglied



Sehen Sie sich das Profil von Meldin an!   Senden Sie eine Private Message an Meldin  Schreiben Sie einen Gästebucheintrag für Meldin

Beiträge: 380
Registriert: 15.07.2011

ACA2020
Windows10

erstellt am: 23. Sep. 2022 09:41    Editieren oder löschen Sie diesen Beitrag!  <-- editieren / zitieren -->   Antwort mit Zitat in Fett Antwort mit kursivem Zitat    Unities abgeben: 1 Unity (wenig hilfreich, aber dennoch)2 Unities3 Unities4 Unities5 Unities6 Unities7 Unities8 Unities9 Unities10 Unities Nur für archi.archi 10 Unities + Antwort hilfreich

Hallo,
also der Code von Terry Miller ist ja in sich ein schlüssiges Prog. das dir eine Excel-Tabelle in Acad (Lisp) liefert, daher würde ich für ein spezielles vorhaben einen solchen code nicht verwenden, da dieser funktioniert wie er funktionieren soll, und sich auf das ganze bezieht.
Die frage an sich ist wie dein such vorhaben ist? Also wie kommst du in Excel an deinen Wert, wenn du in die Tabelle schaust?
Einen direkten Zugriff, könntest du auch so gestalten.
Code:
(setq ExcelUsedRange
    (vlax-variant-value
      (vlax-get-property
(vlax-get-property
  xlsSheet
  "UsedRange"
)
"VALUE2"
      )
    )
      )
(setq Wert_aus_Excel
      (vlax-variant-value
(vlax-safearray-get-element
  ExcelUsedRange
  1 ;ExcelZeile
  1 ;ExcelSpalte
)
      )
)
Da wir zuvor schon auf UsedRange gekommen sind, musst du so nur aufpassen, dass wenn der UsedRange nicht auf A1 geht, erst die erste beschriebene Zelle 1,1 ist,

------------------
Gruß Wolfgang

Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP

Anzeige.:

Anzeige: (Infos zum Werbeplatz >>)

Darstellung des Themas zum Ausdrucken. Bitte dann die Druckfunktion des Browsers verwenden. | Suche nach Beiträgen

nächster neuerer Beitrag | nächster älterer Beitrag
Antwort erstellen


Diesen Beitrag mit Lesezeichen versehen ... | Nach anderen Beiträgen suchen | CAD.de-Newsletter

Administrative Optionen: Beitrag schliessen | Archivieren/Bewegen | Beitrag melden!

Fragen und Anregungen: Kritik-Forum | Neues aus der Community: Community-Forum

(c)2022 CAD.de | Impressum | Datenschutz