LabVIEWForum.de - Excel-Datei durchgehend ausfüllen ohne neue Mappen zu öffnen mit ActiveX

LabVIEWForum.de

Normale Version: Excel-Datei durchgehend ausfüllen ohne neue Mappen zu öffnen mit ActiveX
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Seiten: 1 2
Hallo Leute,

anbei wieder ne Frage Blush

Ich programmiere gerade ein Sub.vi für relvante Messwerte eines Prüfstandes der mit Labview funktioniert. Hierbei werden verschiedene Messungen durchgeführt und Kennzahlen bestimmt. (So jetzt kommen wir zur Frage Big Grin)

Nach der Bestimmung sollen die Daten in eine vorgefertigtes Excel-Sheet per ActiveX geschrieben werden. Zurzeit funktioniert das Sub.vi so, das es erkennen kann ob das Sheet offen ist oder nicht. Danach schreibt es die Kennzahlen in die richtigen Zeilen und Spalten. Danach starte ich die nächste Messung und das Programm öffnet erneut eine Datei und schreibt in diese Datei die Kennzahlen an die richtige Position.

Ich will jedoch, dass nur eine Datei offen ist und die Daten dort nacheinander reingeschrieben werden.

Über konstruktive Hilfe würde ich mich sehr freuen.

Zur besseren Darstellung habe ich das VI angehängt

Grüße DM
Das schreit nach einer Umsetzung als FGV bzw. Action-Engine-VI:

Hier das Grundprinzip eines solchen VIs:
[attachment=59106]

Enum (natürlich Typ-Definiert, fehlt im Screenshot) legt fest, was das VI machen soll. In deinem Fall bieten sich die Status: Excelfile öffnen; Daten schreiben; File schließen an.

In einem uninitialisierten Schieberegister werden Werte für den nächsten Aufruf den VI gespeichert, in deinem Fall z.B. die Workbook-Reference.

Die While-Loop läuft immer nur 1x durch.

Und das ist es dann auch schon.

In deinem Programm rufst du dann diese Sub-VI 1x mit der Methode "Öffnen" auf, dann beliebig oft mit "Schreiben", und irgendwann mit "Schließen".

Gruß, Jens
Hallo DM,

ich möchte da Jens widersprechen. Wenn du dein Sub VI in mehrere Teile austeilst, kommst du in meinen Augen viel besser ans Ziel.
Dein Sub VI würde ich so zerlegen:
1. Öffnen von Excel
2. Öffnen/Erstellen der Excel Datei
3. Schreiben der Daten
4. Speichern der Datei
5. Schließen von Excel

So kannst du vor Beginn der Messung Excel + Datei öffnen. Danach beliebig oft die Messung durchführen + Daten schreiben und nach der Messung einfach alles schließen.

Hinweis noch am Rande, du Prüfst nicht ob eine Exceldatei geöffnet ist sondern ob die Excel Application an sich sichtbar ist. Ob Excel dann eine Datei geöffnet hat stellst du damit nicht fest.
(11.05.2018 06:53 )MaxP schrieb: [ -> ]Dein Sub VI würde ich so zerlegen:
Genau das ist es ja, was Jens beschreibt. Zerlegung eines Ablaufes in einzel aufrufbare Abschnitte. Nur das diese Zerlegung mittels diverse LabVIEW-Elemente in einem einzigen VI liegt - andere Programmiersysteme würden zu so einem Konstrukt möglicherweise Klasse sagen, LabVIEW sagt in diesem Falle FGV.

Die Aufteilung in mehrere VIs hat nämlich einen Nachteil gegenüber nur ein VI: die mehreren VIs, die dann ja sinnvollerweise keinen eigenen Speicher für die Excel/Sheet-Referenz haben, müssten mit den Referenzen sequenziert werden - was aber andere Nachteile mit sich bringt.
(09.05.2018 16:49 )jg schrieb: [ -> ]Das schreit nach einer Umsetzung als FGV bzw. Action-Engine-VI:

Hier das Grundprinzip eines solchen VIs:


Enum (natürlich Typ-Definiert, fehlt im Screenshot) legt fest, was das VI machen soll. In deinem Fall bieten sich die Status: Excelfile öffnen; Daten schreiben; File schließen an.

In einem uninitialisierten Schieberegister werden Werte für den nächsten Aufruf den VI gespeichert, in deinem Fall z.B. die Workbook-Reference.

Die While-Loop läuft immer nur 1x durch.

Und das ist es dann auch schon.

In deinem Programm rufst du dann diese Sub-VI 1x mit der Methode "Öffnen" auf, dann beliebig oft mit "Schreiben", und irgendwann mit "Schließen".

Gruß, Jens

Hi Jens,

bei mir funktioniert komischerweise meine Case-Struktur nicht. Die Fehlerliste zeigt an: "Case-Struktur: Angegebener Case nicht vorhanden" aber ich habe den Case definiert.

Zudem hast du bei dem Ausgang und Eingang im Case zwei gelbe Pfeile in den grünen Rechtecken, wo kommt das her?

Grüße
DM
Hallo DM,

Zitat:bei mir funktioniert komischerweise meine Case-Struktur nicht. Die Fehlerliste zeigt an: "Case-Struktur: Angegebener Case nicht vorhanden" aber ich habe den Case definiert.
Wie soll man das beurteilen, wenn du weder das VI oder wenigstens einen (aussagekräftigen!) Screenshot bereitstellst?

Zitat:Zudem hast du bei dem Ausgang und Eingang im Case zwei gelbe Pfeile in den grünen Rechtecken, wo kommt das her?
Das ist ein Schieberegister - und das gehört zu den LabVIEW-Grundlagen! (Und Jens hatte das in seinem Beitrag auch so benannt…)
Du kennst die ganzen Links in meiner Signatur doch eigentlich schon, oder?
(17.05.2018 07:57 )GerdW schrieb: [ -> ]Hallo DM,

Zitat:bei mir funktioniert komischerweise meine Case-Struktur nicht. Die Fehlerliste zeigt an: "Case-Struktur: Angegebener Case nicht vorhanden" aber ich habe den Case definiert.
Wie soll man das beurteilen, wenn du weder das VI oder wenigstens einen (aussagekräftigen!) Screenshot bereitstellst?

Zitat:Zudem hast du bei dem Ausgang und Eingang im Case zwei gelbe Pfeile in den grünen Rechtecken, wo kommt das her?
Das ist ein Schieberegister - und das gehört zu den LabVIEW-Grundlagen! (Und Jens hatte das in seinem Beitrag auch so benannt…)
Du kennst die ganzen Links in meiner Signatur doch eigentlich schon, oder?


Hey,

also die Case-Strktur funktioniert jetzt.

Ja die Links kenne ich und habe Sie mir schon angeschaut... Ich kenne das Schieberegiester, ich hätte es besser beschreiben sollen. Ich meine die Rechtecke in der Case-Struktur (siehe umrande Elemente im Bild im Anhang).
Hallo DM,

das sind In/Out-Tunnel der Case-Struktur - an denen zusätzlich (dank Rechtsklick-Option!) der Modus "verknüpfte Tunnel" gesetzt wurde…
Einfach mal die LabVIEW-Hilfe zu den Tunneln lesen! Big Grin

Zitat:also die Case-Strktur funktioniert jetzt.
Bist du dir sicher, dass OpenFile der Standard-Case sein sollte?
Immer, wenn irgendwas nicht passt, soll eine neue Datei geöffnet werden und die alte Referenz vergessen werden???

Abgesehen davon: bei einem Enum sind die Items klar definiert! Also bitte für jedes Item im Enum exakt einen Case erstellen - auch dafür gibt es eine Rechtsklick-Option der Case-Struktur!
Hi Leute,

habe anbei mal ein Vi gesendet, welches mit den Tipps von Jens und Gerd enstanden ist. Die Excel-Datei wird hier durch ActiveX aufgerufen und beschrieben. Ich weis nicht ob es bis ins letzte Detail allen Tipps folgt aber es läuft halbwegs Big Grin

Habe nur die Probleme:
Das das Programm die gewünschte vorgefertigte Datei nicht öffnet, die ich durch den Pfad angebe
Und wenn ich den Befehl create mehrmals ausführe eine Null-Refernz besitzt.

Ihr könnt es ja mal ausprobieren, bin über jede Hilfe froh Big Grin

Grüße DM
Hallo DM,

Zitat:Habe nur die Probleme:
Das das Programm die gewünschte vorgefertigte Datei nicht öffnet, die ich durch den Pfad angebe
Und wenn ich den Befehl create mehrmals ausführe eine Null-Refernz besitzt.
THINK DATAFLOW!
Da sind diverse CloseReference-Befehle in deinem VI - und diese halten sich leider nicht an den nötigen DATAFLOW!
Wenn du Referenzen schon (mangel DATAFLOW-Koordinierung) schließt, obwohl diese noch benötigt werden, kann es eben zu unbeabsichtigten Resultaten kommen!
(Ich würde ein Workbook erst schließen, wenn ich mit den darin enthaltenen Worksheets fertig bin. Und diese wiedrum erst dann schließen, wenn die darin enthaltenen Ranges fertig bearbeitet sind…)

- Warum verwendest du zweimal eine "Value"-Property von "Reset"? Warum nicht einfach das ungenutzte Terminal und etwas Draht verwenden?
- Man kann einen Range auch direkt als "F34:J34" angeben und (nur) an Cell1 verdrahten.
- Wieso erzeugst du in der Schleife, in der du die Werte in die Excel-Datei einträgst, ein Array of References am Ausgang? Dan Range gleich in der Schleife schließen, das Worksheet nur genau einmal nach der Schleife!
- Es gibt keinen State in der Statemachine, wo du das Workbook (korrekt) schließt und speicherst!?
- Wozu erzeugst du den Range "F4" per FormatIntoString? Warum nicht einfach nur eine Stringkonstante verwenden?
Seiten: 1 2
Referenz-URLs