Excel Tabelle füllen

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 18 Antworten in diesem Thema. Der letzte Beitrag () ist von petaod.

    Excel Tabelle füllen

    Vorweg: Anscheinend wurde es schwerer gemacht, die serielle Schnittstelle in Excel (2013?) zu verwenden.
    (Vielleicht kennt ja jemand eine zukunftssichere Methode :rolleyes: )
    Und darum wollte ich versuchen, mittels eines externen Programms (VB 2016) die Daten
    universeller zu erfassen, um sie anschließend auf unterschiedliche Weise (XML, TXT, Clipboard, Excel etc.)
    zu erfassen.

    Meine Frage bezieht sich hier auf Excel. ( Ich stelle die Frage aber hier im allgemeinen Forum)
    Welche Methode ist geeignet, Daten in Excel zu schreiben, bei der es egal ist, ob die
    Arbeitsmappe schon geöffnet ist oder nicht?
    Man kann Excel ja als Datenbank ansprechen, oder Excel-Objekte erstellen und
    dort rein schreiben, so als würde man Excel bedienen (also Range ansprechen etc).
    Es gibt bestimmt noch andere Methoden (Tastaturfernsteuerung...)
    Ich hoffe ich habe mich klar genug ausgedrückt... :/
    Was soll denn Dein Programm genau machen?
    • Daten in Tabellenform erfassen
    • Berechnungen durchführen

    Für mich klingt es danach, dass Du vorhast, so etwas wie mit Markdown (de.wikipedia.org/wiki/Markdown) zu machen. Etwas aufwändiger ginge es dann mit eine XML Ansatz, wo man auch die Daten für die Ausgabe mit Stylesheet ausgibt. (So wird aktuell in MS Office und Libre-Office gearbeitet)
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Dann schreibe doch die Daten mit Append in eine CSV-Datei.

    Diese kannst Du bei Bedarf auch in Excel öffnen.

    Die CSV-Datei kannst Du aber auch in einem einfachen Text-Editor bearbeiten.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Welche Excel Version verwendest Du?

    Mache in Excel eine Datenabfrage mit PowerQuery auf Deine CSV-Datei.
    An die Importierten Daten kannst Du dann noch Berechnungen anfügen.

    Wenn Du nun neue Daten hast, musst Du nur einmal die Abfrage aktualisieren und schon hast Du die neusten Daten in der Excel-Auswertung.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Version 16

    PowerQuery hatte ich nochmals probiert.

    Leider muss man:
    Extra aktualisieren.
    Ist anscheinend nicht per Makro erstellbar. Jedenfalls wurde meine Aktion nicht aufgezeichnet.
    Somit wahrscheinlich keine Aktualisierung per Timer möglich.

    Ich habe es ja schon hinbekommen, Daten per Excel-Fernbedienung von VB.Net aus
    einzugeben. Ich hatte halt gehofft, es gäbe eine praktischere Methode.

    Vielleicht schreibe ich mir eine DLl, die ich von Excel aufrufen kann, um
    die Daten abzuholen.
    Anders herum wäre es mir halt lieber.
    Dass man nämlich an der Waage den Printbefehl drückt, und die Daten aktiv in das Excelblatt geschrieben werden,
    Oder noch eine Möglichkeit: Der User klickt in Excel auf "Abrufen" woraufhin die momentan anstehenden
    Wiegedaten abgerufen werden. Welche dieser Möglichkeiten besser sind weiß ich noch nicht.
    Schwer ist daran, dass das Abrufen über RS232 Steuerbefehle gehen müsste.

    Wie geschrieben bin ich noch am Überlegen, was die sicherste und einfachste Methode wäre.
    Im Moment mache ich es so, dass mein RS232 VB.Net Programm die Daten der Waage
    in ein HTML-file schreibt. Die Daten dieses Files kann ich natürlich über PowerQuery
    in Excel einlesen. Aber ich möchte halt noch divere Interaktionen ausführen.
    Am liebsten wäre mir, wenn ich die Daten von meinem VB.Net Programm direkt
    in Excel reinschreiben würde. Das geht im Prinzip auch. Aber je nachdem, ob
    Excel offen oder noch geschlossen ist, muss ich das unterschiedlich handhaben.
    Auf diese Problematik, die ich schon zu Beginn gestellt hatte, ist hier noch niemand eingegangen.

    Lightsource schrieb:


    Auf diese Problematik, die ich schon zu Beginn gestellt hatte, ist hier noch niemand eingegangen.


    Du weißt schon, dass das hier kein offizielles MS Support Formum (falls es so etwa sgäbe) ist?
    Es ist schon auch manchmal Glücksache, dass ein Profi auf dem Gebiet welches du gerade anfragst hier mitliest und dann auch noch eine passende Lösung für dich hat. Falls es diese denn gibt.
    Dein Satz klingt ein wenig nach Vorwurf und das selbst der Hauch davon ist hier fehl am Platz. Wird schon seine Gründe haben..
    Versuch halt einen Workaround.Grundsätzlich brauchen Datenquellenaktualisierungen über Powerquery ganz "schön" was an Ressourcen, bei deinem Konstrukt kann man das wohl vernachlässigen.
    Also könntest du ja versuchen dir eine Timer zu schnitzen und jede Minute (als Beispiel) automatisiert den Refresh durchführen.
    Du weißt schon, dass das hier kein offizielles MS Support Formum (falls es so etwa sgäbe) ist?


    So war das auch nicht gemeint. Es ist mir aber lieber, wenn man versucht meine Fragen zu beantworten.
    Denn sonst muss ich im Nachhinein doch noch ausführlich erklären, warum ich ausgerechnet dies oder das
    anders haben will.
    Aber das geht wohl jedem so, der in einem Forum Fragen stellt.

    Lightsource schrieb:


    Am liebsten wäre mir, wenn ich die Daten von meinem VB.Net Programm direkt
    in Excel reinschreiben würde.


    eins nach dem anderen, probiere ob das mit deinen verschiedenen Excel-Versionen funktioniert

    Daten in Excel schreiben:

    VB.NET-Quellcode

    1. Option Strict On
    2. Imports Microsoft.Office.Interop.Excel
    3. Public Class Form4
    4. Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click
    5. Try
    6. Dim xlApp As New Microsoft.Office.Interop.Excel.Application()
    7. Dim xlWb As Microsoft.Office.Interop.Excel.Workbook
    8. xlWb = xlApp.Workbooks.Open("E:\TestFolder\ExcelTest\vbexcel.xlsx")
    9. Dim xlSt As Microsoft.Office.Interop.Excel.Worksheet = CType(xlWb.Worksheets("Tabelle4"), Worksheet)
    10. With xlSt
    11. 'schreibe in Zelle
    12. .Range("E19").Value = 56
    13. 'etc...
    14. End With
    15. xlWb.Save()
    16. xlApp.Quit()
    17. xlApp = Nothing
    18. Catch g As Exception
    19. MessageBox.Show(g.ToString)
    20. End Try
    21. End Sub
    22. End Class
    Danke. Das ist das, mit dem ich angefangen hatte.
    Ja, diese Methode funktoniert bei mir.
    Das Problem hier ist nur, dass die Mappe zum Bearbeiten geöffnet wird.
    (Ist sie bereits offen, dann will sie unter einem anderen Namen abgespeichert werden)
    Gibt es eine Möglichkeit, in eine Zelle einer Mappe/Tabelle zu schreiben egal ob
    die Tabelle gerade auf dem PC geöffnet ist oder nicht?
    Excel ist keine Datenbank und lässt nur unter bedingten Voraussetzungen zu, dass zweimal auf die gleiche Datei zugegriffen wird.

    Wann und wie der Import von PowerQuery gestartet wird lässt sich steuern. Natürlich kann man dies auch über VBA machen.

    Wieviel Installationen greifen denn zeitgleich auf deine "Excel-Datei" zu? Bedenke, wenn die Datei geöffnet ist, liegt ggf. ein Schreibschutz drauf.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    Excel ist keine Datenbank und lässt nur unter bedingten Voraussetzungen zu, dass zweimal auf die gleiche Datei zugegriffen wird.

    Darum überlege ich auch noch, eine extra Datenbank zu füllen, und Excel nur zur Anzeige/Berechnung zu verwenden.

    Wann und wie der Import von PowerQuery gestartet wird lässt sich steuern. Natürlich kann man dies auch über VBA machen.

    Das muss ich nochmal testen. Auf die Schnelle ging es jedenfalls nicht.

    Wieviel Installationen greifen denn zeitgleich auf deine "Excel-Datei" zu? Bedenke, wenn die Datei geöffnet ist, liegt ggf. ein Schreibschutz drauf.

    Bisher eigentlich nur der lokale User sowie die RS232-Einleseroutine.
    Vielleicht lasse ich das mit Excel doch sausen und mache es nur mit VB.Net. Ich wollte das ja nur, weil die Leute so gerne mit Excel hantieren. :S

    Lightsource schrieb:

    Vielleicht lasse ich das mit Excel doch sausen und mache es nur mit VB.Net. Ich wollte das ja nur, weil die Leute so gerne mit Excel hantieren.
    Warum nicht beides?
    Zeig die Daten in einem Datagridview an und für die Excel-Liebhaber, erzeuge mit einem Export-Button eine Excel-Datei (z.B. mit EPPlus).
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --