LabVIEW & Excel mit ActiveX

Es ist eine dieser schlaflosen Nächte in denen ich diesen Artikel beginne. Leider gelingt es mir seit einigen Monaten nicht, ausgeschlafen in die Woche zu starten. Selten bekomme ich mehr als drei Stunden Schlaf zusammen. Glücklicherweise lässt sich diesem Umstand jedoch auch etwas positives abgewinnen: Dieser Beitrag!
Nun jedoch direkt zum Thema.

Logo National Instrumens LabVIEW

Logo National Instrumens LabVIEW

Seit gut einem Jahr arbeite ich also mit Software von National Instruments. Fast täglich sogar, jedoch nicht besonders gut. Ständig muss ich Funktionen in den unendlichen Weiten des Internets suchen. Dabei ecke ich besonders oft bei der Integration von Excel an.

In Ermanglung des LabVIEW Report Generation Toolkit für Microsoft Office vom Hersteller, greife ich selbst über ActiveX auf die Office-Anwendungen zu. Theoretisch sollte dabei Alles möglich sein, was in Excel möglich ist, praktisch verzweifle ich regelmäßig an dem Umstand, dass dem nicht immer so ist und, dass es in den seltensten Fällen so einfach ist wie in Excel selbst. Daher folgen hier nun eine Hand voll, aus meiner Sicht nützlicher, Virtueller Instrumente, welche dem ein oder anderen Leser vielleicht ein Denkanstoß seien können. Ich möchte direkt einräumen, dass es sich bei all den vorgestellten Lösungsansätzen nicht um der Weisheit letzten Schluss handelt, sondern vielmehr applizierbare Lösungen, die ich so verwende.

Vorab eine kleine Zusammenfassung dazu, worum es sich bei LabVIEW handelt:

Um es Ingenieuren möglichst leicht zu machen Messaufgaben durchzuführen wurden bereits vor Jahren virtual engineering environments populär. Agilent stellt beispielsweise das entsprechende Programm Agilent VEE zur Verfügung. Sowohl dort, als auch im Produkt von National Instruments, wird nicht hart in einer textbasierten Programmiersprache ein Programm verfasst, es wird viel mehr ein Flussdiagramm aus zur Verfügung stehenden Operatoren zusammengestellt. Dies scheint vor Allem Ingenieuren entgegen zukommen, bedenkt man doch, wie vertraut diese in der Regel, mit Flussdiagrammen sind.

Weiterhin erleichtern oben genannte Programme auch den Umgang mit Messgeräten. Genau mein Thema! Tue ich doch fast nichts anderes, als Messprogramme zu schreiben, anzupassen und zu erweitern.

Über all die hier vorgestellten VIs sei gesagt, dass diese stets eine Excel-Applikation öffnen, etwas editieren und dann wieder schließen. Sicherlich ist dies suboptimal, wenn viele Operationen sequenziell ausgeführt werden sollen, jedoch gibt es den einzelnen virtuellen Instrumenten die Freiheit sie separat einzusetzen. Sollte angedacht werden viele Operationen innerhalb von Excel zusammenhängend auszuführen, so empfiehlt es sich jedoch die Referenzen nicht immer wieder zu schließen und zu öffnen, sondern alle Operationen in einem Schub durchzuführen.

Ein weiterer Grund, warum ich die Operationen weitestgehend entkoppelt habe ist, dass ich auf diese Weise relativ gefahrlos Dateien öffnen kann während LabVIEW noch arbeitet. Würde Excel die ganze Zeit offen gehalten werden, so wäre der Zugang durch LabVIEW exklusiv belegt und ein Lesezugriff durch den Anwender ausgeschlossen.

Schlussendlich denke ich überdies, dass es mehr Sinn macht die einzelnen VIs in einer Form vorzustellen, in der sie voneinander weitestgehend unabhängig ausgeführt werden können. Immerhin wird der geneigte Leser sich selbst zu helfen wissen, wenn es darum geht die vorgestellten Abschnitte auf seine Bedürfnisse abzustimmen.

Die Bilder, welche jeweils ein Instrument darstellen sind als Snippets angelegt. Es handelt sich folglich um *.png-Dateien, welche sich via Drag&Drop in LabVIEW importieren lassen. Alle Snippets wurden mit LV Version 2011 erstellt.

Nun jedoch mehr zu den eigentlichen Funktionen:

Ein Arbeitsblatt löschen – Delete a worksheet

Anhand dieses ersten Instruments wird deutlich, dass stets eine Excel._Application ausgeführt wird, daran schließt sich die Angabe der zu öffnenden Datei an. Im hier gezeigten Fall geschieht dies über einen Cluster, welcher zwei Pfade enthält. Das obere Element enthält den Pfad zu einer zu bearbeitenden Datei, der untere kann verwendet werden, um den Pfad zu einem Template zu übergeben. Den Grund dafür werde ich später erläutern. Ich ziehe es vor, die Applikation invisible auszuführen, da es mich stört, wenn in der Taskleiste Applikationen erscheinen und wieder verschwinden.

Löscht via ActiveX ein Arbeitsblatt aus einer Excel-Datei

Löscht via ActiveX ein Arbeitsblatt aus einer Excel-Datei

Ist die Datei gefunden worden, so wird das über einen String anzugebende Worksheet ausgewählt und dann gelöscht. Abschließend wird die Excel-Datei gespeichert, sodass die Änderung dauerhaft übernommen wird.

 

Einen Bereich einlesen – Read a range on a sheet

Mit diesem VI lässt sich sehr einfach der Inhalt eines Bereichs von einem Arbeitsblatt (Worksheet) in einen 2D-Array einlesen. Dabei wird wie zuvor auch der Dateipfad angeben. Hier jedoch ohne den Cluster. Weiterhin muss der Sheetname, also der Name des Arbeitsblatts, übergeben werden. Das VI wird nach Öffnen des Dokuments die Zelle ‚LeftColumn’32000 (also Zeile 32000 in einer von LeftColum vorgegeben Spalte) suchen und einlesen. Dabei dann soweit nach oben gehen, bis ein Feld mit Daten in der Spalte gefunden wird.

Liest einen Bereich von einem Arbeitsblatt ein

Liest einen Bereich von einem Arbeitsblatt ein

Die Zeile, in der es fündig geworden ist wird daraufhin mit der vorgegebenen RightRow kombiniert (hier hat sich ein Fehler eingeschlichen: Es muss selbstverständlich RightCol heißen und nicht, wie im Bild dargestellt RightRow), sodass der auszulesende Bereich ein Rechteck auf dem Datenblatt überspannt. Dieser Bereich sollte in jeder Zelle Daten enthalten.
Da das Auslesen in einen 2D-String-Array erfolgt sind auch leere Felder zu erfassen. Der Inhalt der Felder spielt folglich keine Rolle. Im Anschluss kann in LabVIEW beliebig in andere Daten-Typen umgewandelt werden.

Daten Schreiben – Write Array

Hierbei handelt es sich um das mit Abstand am häufigsten von mir benutzte VI. Ich verwende es sowohl zum Erstellen der Kopie des Templates, als auch zum Schreiben fast aller Daten.

Einen Array in Excel abspeichern

Einen Array in Excel abspeichern

Um eine Template-Datei zu verwenden wird der Pfad zu dieser in den oberen Teil des Eingangs-Clusters Excel Paths gegeben, der Ort, an dem die Kopie erscheinen soll wird im unteren Cluster übergeben. Soll eine Datei editiert werden, so muss für beide Elemente der selbe Wert übergeben werden und er Boolean-Wert von Save Changes auf true gesetzt werden.
Wie bei allen anderen hier vorgestellten VIs wird der Name des Arbeitsblatts benötigt, um eindeutig ein Blatt zu beschreiben. Über zwei weitere Werte wird angegeben wohin die Daten geschrieben werden sollen. Dabei muss nur die Spalte, sowie die Startzeile bekannt sein.

Um das Schreiben zu beschleunigen, kann Write as Region auf true gesetzt werden, sodass, wie oben gezeigt, geschrieben wird. Mit Excel 2010 habe ich jedoch die Erfahrung gemacht, dass dieses Vorgehen für Strings nicht zu empfehlen ist, da es zu Komplikationen mit dem Datenformat kommen kann, sodass Diagramme nicht mehr fehlerfrei auf diesen Wertebereich referenzieren können. Durch Ausschalten der Option wird wie im folgenden Bild beschrieben vorgegangen.

Alternatives Vorgehen zum Abspeichern eines Arrays

Alternatives Vorgehen zum Abspeichern eines Arrays

Hier findet also ein Zeilenweises Beschreiben des Arbeitsblattes statt, was wesentlich länger dauern kann, wenn entsprechend viele Daten abzulegen sind. Ich hatte jedoch noch keine Probleme damit auf diese Daten zu referenzieren.

Zusätzlich verwende ich eine Version, welche Werte im Format double akzeptiert. Beide Versionen habe ich in einem polymorphen VI zusammengefasst, sodass LabVIEW stets die richtige von beiden Varianten wählt, wenn das SubVI mit Daten aus einer Quelle beaufschlagt wird.
Grundsätzlich finde ich diese Art der virtuellen Instrumente sehr reizvoll, gibt sie dem Anwender doch etwas mehr Spielraum. Es ist jedoch stets darauf zu achten, dass das Pinning kompatibel sein muss. Sprich: alle Ein- und Ausgänge sollten auf dem jeweils gleichen Pin liegen.

Daten von einem Arbeitsblatt einlesen – Read data from woorksheet

Ähnlich der Funktion von Einen Bereich einlesen – Read a range on a sheet. Jedoch wird hier ein Feld mit einem String im für Excel typischen Format à la A2 benötigt. Alle Referenzen müssen sich auf das selbe Arbeitsblatt beziehen. Die Angabe von Rangefield entspricht dem genannten Feld. Es wird also ein double-Wert aus diesem Feld eingelesen und mit diesem die untere rechte Zelle eines Bereichs angegeben.

Liest einen ganzen Datenbereich ein

Liest einen ganzen Datenbereich ein

Die obere linke Zelle wird über Startfield vorgegeben. Ich verwende diese relative simple Funktion, um von selbst beschriebenen Arbeitsblättern den zu verwendenden Arbeitsbereich auszuwählen. Im Abschnitt Einen Bereich einlesen – Read a range on a sheet wurde bereits eine elegantere Methode dafür vorgestellt, den hier gewählten Ablauf verwende ich jedoch dort, wo ich die Daten selbst schreibe und deren Umfang mit angebe, um in Excel einfache Makros mit diesen Werten arbeiten zu lassen.
Ein weiterer Unterschied besteht übrigens darin, dass hier double-Werte ausgelesen werden und keine Strings. Weiterhin findet eine Überprüfung auf das Vorhandensein des gewählten Arbeitsblattes statt.
Die Idee hinter diesem Instrument besteht darin, dass eine IP3-Messung sich auf eine Sensitivity-Messung beruft, falls diese bereits durchgeführt wurde. Wurde sie noch nicht vollzogen, so muss die Empfindlichkeit erst noch bestimmt werden, weshalb die hier ausgelesenen Daten einen leeren Array liefern, was in der Durchführung der Sensitivitäts-Messung mündet.

Namen aller Arbeitsblätter einlesen – Get Sheet Names

Dieses VI begnügt sich mit einem Pfad, mehr wird nicht benötigt.

Dieses Instrument liest die Namen aller Worksheets ein

Dieses Instrument liest die Namen aller Worksheets ein

Als Resultat wird ein Array der einzelnen Arbeitsblätter, beziehungsweise deren Namen, ausgegeben.

Werte einlesen – Read Excel

Eine weitere Methode, um Werte von einem Blatt einzulesen. Dabei wird so vorgegangen, dass die oberste Zelle im Format A1 angegeben werden muss.

Eine weitere Variante zum Einlesen von Daten aus Excel

Eine weitere Variante zum Einlesen von Daten aus Excel

Das VI hangelt sich von diesem Feld in der entsprechenden Spalte so weit nach unten, bis ein leeres Feld gefunden wird. Die Ausgabe erfolgt als Array aus double-Werten.

Eine kleine Hilfestellung – Some little help

Immer wieder kommt es vor, dass auf einem Datenblatt viele Spalten beschrieben werden sollten. Oft liegen in meinem Anwendungsfall jedoch nicht alle Daten zur gleichen Zeit vor, weshalb ich es vorziehe die Daten nach jeder Iteration abzulegen.

Hilfs-VI zur Erstellung alphabetischer Konstellationen für Excel

Hilfs-VI zur Erstellung alphabetischer Konstellationen für Excel

Wahre LabVIEW-Profis würden wahrscheinlich *.tdms-Dateien empfehlen, da ich jedoch üblicherweise keine Probleme mit Excel an und für sich habe, ziehe ich es vor die Daten direkt im schlussendlich angestrebten Format abzulegen.

Erstellt das Alphabet als String-Array

Erstellt das Alphabet als String-Array

Verwendet man nun eine der oben vorgestellten Funktionen, so kommt man nicht umhin die Spalte, welche zum Abspeichern verwendet werden soll, mit anzugeben. Das hier vorgestellte VI hilft dabei und generiert aus einer Zahl einen Buchstaben, entsprechend dem in Excel angewandten Format, sprich: A,B … Z, AA, AB, … AZ, BA, BB … usw. Bisher habe ich es noch nicht geschafft den so abgedeckten Bereich zu überschreiten.
Das SubVI links am Rande enthält eine einfache Möglichkeit die 26 Buchstaben des Alphabetes als Array zu erstellen.

Zweidimensionalen Bereich beschreiben – Write 2d-data

Zuvor wurden Möglichkeiten aufgezeigt, um Daten zeilenweise nach Excel zu übertragen. Liegen diese jedoch bereits als zweidimensionales Array vor, so empfiehlt es sich, diese auch als solches abzulegen.
Der hier vorgestellte Weg benötigt lediglich die zu schreibenden Daten, welche sich bisher auf double-Werte beschränken, und die linke obere Zelle, welche beschrieben werden soll.

Ablegen eines zweidimensionalen Arrays

Ablegen eines zweidimensionalen Arrays

Aus den Dimensionen des Datenfeldes ergibt sich automatisch das untere rechte Feld, welches mit Hilfe der zuvor vorgestellten Unterfunktion als Buchstabe zur Verfügung steht. Die untere rechte Zelle wird aus dem VI ausgegeben und kann weiterverwendet werden. Es gilt zu beachten, dass die hier vorgestellte Version sich auf das Beschreiben bis maximal zur Spalte Z beschränkt. Kann nicht garantiert werden, dass doch mehr Spalten benötigt werden, so sollte auf die oben vorgestellte, erweiterte Hilfsfunktion zurückgegriffen werden!

3 comments for “LabVIEW & Excel mit ActiveX

  1. Timo
    3. April 2020 at 10:24

    Hallo Herr Schafing,
    dieser Beitrag ist zwar schon einige Zeit her und dennoch erhoffe ich mir, hier Hilfe zu bekommen. Für mein Praktikum soll ich in LabView ein Programm schreiben, kenne mich aber alles andere als gut mit LabView aus.
    Ich soll über ActiveX auf eine Excel Vorlage zugreifen, um dann dort Messwerte abspeichern zu können. Soweit, so gut. Wäre da nicht die Tatsache, dass ich die Vorlage verwenden sollte, wäre es sehr einfach. Da ich nun aber die Vorlage verwenden, darin erst ab Zeile 11 die Daten abspeichern und zusätzlich noch zwei 4×4 Matrizen an eine bestimmte Stelle speichern soll, bin ich tatsächlich überfragt.
    Ich denke, dass der Grundaufbau des Programms zum „Ablegen eines zweidimensionalen Arrays“ mir schon sehr helfen würde. Allerdings kann ich nicht erkennen, was in der while-Schleife oben und hinter dem Array-Bedienelement unten passiert. Ist es möglich, dass Sie mir davon ein Bild schicken, auf dem ich dies erkennen kann? Ich würde mich sehr freuen.

    Mit freundlichen Grüßen
    Timo

    • Rudolf Schafing
      4. April 2020 at 12:59

      Hallo,
      irgendwann hat photobucket leider die Snippets durch Bilder mit Wasserzeichen ersetzt, sodass das nicht mehr funktioniert.

      Falls du es nicht modular brauchst: Beim Invoke Node „Range“ in Range den Wert Bezeichner der linken oberen Spalte deiner zu schreibenden Region z.B. A11 geben und bei Cell D15 (4*4). Danach das Value mit dem 2d-Array füttern.

      Die VIs habe ich jetzt auf die Schnelle nicht finden können. Aber so habe ich das damals gemacht:
      Den Ablauf mit den Invoke Nodes kann man ja evtl. noch erkennen. Was man braucht ist die linke obere Zelle in die man schreiben möchte. Die wird über Upper Left Cell in das VI gegeben und in einer While-Schleife habe ich mittels Match Pattern alle Ziffern [0-9] rausgeholt. Die Zahl wird dann in ein Integer umgewandelt. Parallel dazu nimmt man die Zahl, um aus dem String den Buchstaben zu holen. Diesen konvertiere ich dann in eine Zahl (A->0, B->1 usw.) Dann hat man ein Integer für die Zeile und eins für die Spalte. Nun addiere ich die Dimensionsgrößen des 2D-Array hinzu und mache die Berechnung nochmal in die entgegengesetzte Richtung. Also aus der Zahl für die Spalte am rechten Ende deines Datenfeldes wird wieder ein Buchstabe. Mit der Zeile baust du einen String zusammen, den du dann als zweites Argument in den Range Invoke Node gibst. Danach dann die Daten als Array in ein Value2 Property.

      Ich hoffe, das dir das ein bisschen weiterhilft,
      Rudi

      • Timo
        6. April 2020 at 10:34

        Vielen lieben Dank für die schnelle und hilfreiche Antwort! Ich probiere mich noch mal ein bisschen.

        Liebe Grüße Timo

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert