Arbeitstagebuch mit Visual Basic

  • Excel

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

    Arbeitstagebuch mit Visual Basic

    Hallo zusammen,

    ich bin bin neu hier im Forum und auch im Bereich Visual Basic.
    Ich würde gerne ein „Arbeitstagebuch“ mit Visual Basic realisieren.
    Das Ganze soll wie folgt aussehen: 3 Felder 1. Datumsfeld mit Uhrzeit ( automatisch mit aktuellen Daten vorbelegt aber auch änderbar), 2. Rubrik („Telefonat“, „Wichtig“, „Info“),...) , 3. Textfeld zur freien Eingabe.
    Die Einträge sollen pro Tag untereinander dargestellt werden. Außerdem sollte es eine Suchfunktion geben, mit denen ich nach bestimmten Einträgen suchen kann.
    Ich notiere mir in diesem „Tagebuch“ wichtige Ereignisse, damit ich auch noch nach Wochen nachvollziehen kann, wann etwas vorgefallen ist.
    Ich weiß, für den Anfang kein leichtes Projekt, aber es wäre mir schon sehr wichtig. Ich hoffe auf eure Hilfe :)

    Vielen Dank schonmal!

    Gruß surfer ;)
    Dann sag uns mal bitte, in welcher Programmierumgebung Du programmierst. Du bist hier im Unterforum VBA. Das impliziert, dass Du in MS Word oder Excel unterwegs bist. Da könntest Du ein UserForm verwenden und Deine Daten in der eigentlichen Excel-Tabelle abspeichern, also Excel als Datenpersistierablage verwenden.

    Wenn Du aber mit Visual Studio arbeitest, geht es um VB.Net. Dann sind wir bei anderen Herangehensweisen. Da geht es nicht nur um die Programmgestaltung (Stichwort: Trennung Daten<->GUI; Daten gehören in Datenkonstrukte wie List(Of DeineErinnerungen) gespeichert, in den CEs wie eine TextBox werden sie nur angezeigt!), sondern auch um die Persistierung (das Abspeichern und wieder laden). Dazu kannst Du z.B. TXT- oder CSV-Dateien nehmen (Stichwort IO.File.WriteAllLines / IO.File.ReadAllLines) oder einen Schritt weiter, aber später sehr bequem: Arbeiten mit nem tDS. Wenn Du den Weg gehen willst (was sich schnell ausbezahlt macht), dann natürlich am besten für den Anfang ohne DB, sondern tDS-only arbeiten. Nicht selten bleibt man auch ne ganze Weile dann tDS-only, weil es für lange Zeit ausreichend ist. Das spätere Anhängen einer DB ist relativ leicht möglich.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.
    Hallo VaporiZed,

    ich hatte mir eine Lösung in Excel überlegt und bin auch schonmal angefangen entwas zu entwerfen (siehe Screenshot).
    Allerdings stoße ich hier auf die ersten Probleme:
    1. Ich habe kein Datumsfeld für VB gefunden, welches man einbinden könnte. Somit muss man immer per Hand den Tag und das dazugehörige Datum eingeben.
    2. Aktuell gibt es noch einen Fehler beim Übertragen in die Excel-Mappe (siehe Screenshots Fehler_1, Fehler_2). Die Vorgehensweise habe ich mir von einem Youtube Video abgeschaut und dort steht es genauso... Ich weiß nicht, wo hier der Fehler ist.

    Gruß surfer
    Bilder
    • Kartei.jpg

      156,38 kB, 1.513×553, 35 mal angesehen
    • Fehler_1.jpg

      60,38 kB, 843×384, 32 mal angesehen
    • Fehler_2.jpg

      31,32 kB, 591×222, 34 mal angesehen
    Es gibt zwar nen DateTimePicker in den Common Controls (MSCOMCT2.OCX), aber nicht für Office 64-Bit, was ich habe. Es gibt moch im Excel-Forum eine Alternative, aber die habe ich nicht getestet.
    Den Fehler kann ich mir auf Anhieb nicht erklären. Ich hab es nachgebaut, bei mir geht es. Kannst Du Deine Datei mal per [+ Erweitere Antwort] hochladen, vielleicht finden wir so den Fehler.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Häufig von mir verwendete Abkürzungen: CEs = control elements (Labels, Buttons, DGVs, ...) und tDS (typisiertes DataSet)
    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht in den Spekulatiusmodus gehen.

    surfer09 schrieb:

    Die Vorgehensweise habe ich mir von einem Youtube Video abgeschaut und dort steht es genauso
    Sagen wir mal: fast genauso.

    Ja, das ist das Problem, wenn man nach Filmvorlagen codiert.
    Und den Code im Forum als Bild verschleiert.
    Da sind solche Fehler für andere kaum zu finden,
    x1Up und xlUp sieht nahezu identisch aus, aber das eine ist eine Eins und das andere ist ein L.
    Der Fehler wäre dem Compiler übrigens aufgefallen, hättest du in der obersten Zeile Option Explicit stehen, was du unbedingt immer tun solltest.

    Anmerkung am Rande:
    Arbeite nicht mit ActiveSheet, sondern adressiere das Arbeitsblatt direkt.
    last = Tabelle1.Cells(Rows.Count, 1).End(xlUp).Row + 1
    ActiveSheet ist das Sheet, das gerade zufällig aktive ist.
    Da du eh nur eines hast, wird sich das nicht arg bemerkbar machen.
    Noch mehr macht sich es bemerkbar in den Zeilen darunter, wo du die Sheet-Adressierung ganz weg lässt.
    Cells(last, 1).Value = ListBox1_Tag.Value
    Solche Unsauberkeiten solltest du dir erst gar nicht angewöhnen. Unbedingt das Sheet adressieren!
    Tabelle1.Cells(last, 1).Value = ListBox1_Tag.Value
    Und wenn du jetzt dem Sheet-Objekt eine "richtigen" Namen gibst, ist das Programm auch noch in 4 Wochen lesbar.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „petaod“ ()

    Super, das war´s! Vielen Dank auch für deine weiteren Tipps!

    Ich habe jetzt noch 2 kleinere Probleme:
    Wenn ich zu einem vergangen Tag noch einen Eintrag generiere, sortiert Excel diesen Eintrag ja unter die neueren. Ich möchte die Tabelle ja nicht jedes Mal neu sortieren, damit dieser Eintrag auch an die richtige Stelle rutscht. Geht das vielleicht auch noch mit einem Trick?
    Am Ende eines Tages würde ich noch gerne einen Trennstrich ziehen lassen, damit ich die Tage auch optisch voneinander getrennt habe. Eine Leerzeile würde ja nicht gehen, weil Excel ja immer die nächste leere Zeile für neue Einträge nehmen würde.
    Da muss ich wahrscheinlich ein eigenes Makro bauen, welches den Strich zieht?
    Bilder
    • Sortierung.jpg

      118,18 kB, 1.039×163, 23 mal angesehen
    • Tagtrennung.jpg

      115,9 kB, 1.036×174, 26 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „surfer09“ ()

    surfer09 schrieb:

    Ich möchte die Tabelle ja nicht jedes Mal neu sortieren, damit dieser Eintrag auch an die richtige Stelle rutscht
    Warum nicht? Ist ein Einzeiler.

    surfer09 schrieb:

    Am Ende eines Tages würde ich noch gerne einen Trennstrich ziehen lassen
    Ich würde das mit bedingter Formatierung machen.
    Wenn das aktuelle Datum nicht mit dem nachfolgenden übereinstimmt, den unteren Rahmen dicker machen mit anderer Farbe versehen.
    Da brauchst du kein Makro und hast immer genau da den Trennstrich, wo du ihn erwartest.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „petaod“ ()

    surfer09 schrieb:

    Wie sieht der Einzeiler für die Sortierung aus?

    Visual Basic-Quellcode

    1. Tabelle1.Range("A:D").Sort Key1:=Tabelle1.Range("B1"), Order1:=xlAscending, Header:=xlYes


    surfer09 schrieb:

    Die bedingte Formatierung kenne ich.
    Dann solltest du dich dringend damit beschäftigen.
    Damit lässt sich sehr schön zaubern.
    Ist halt etwas tricky.
    Du musst halt ein wenig spielen, bis du das gewünschte Ergebnis erreicht hast.
    Tipp: Fang an mit einer Zelle und wende dann das Ergebnis auf den gesamten Range an.

    surfer09 schrieb:

    Aber wie sage ich dem System da „Prüfe das letzte vorhandene Datum“?
    Gar nicht.
    Die Regel steht oben.
    Die wird auf den kompletten Tabellen-Range angewendet.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    Das mit der Sortierung klappt einwandfrei jetzt! Vielen Dank!
    Allerdings bekommt ich das mit der bedingten Formatierung nicht hin... Hat da vielleicht nochmal jemand einen Tipp?
    Mir würde es auch reichen, wenn ich das mit einem Makro machen könnte "Setze in der letzten beschriebenen Zelle einen Rahmen" als Button. Den müsste ich dann zwar jeden Tag als "Tagesabschluss" anklicken aber damit könnte ich leben.
    Anbei noch ein Screenshot wie es sein soll.

    Danke!

    Gruß surfer
    Bilder
    • Tagtrennung.jpg

      35,73 kB, 283×335, 12 mal angesehen

    surfer09 schrieb:

    Allerdings bekommt ich das mit der bedingten Formatierung nicht hin
    Bevor ich das lange mühevoll beschreibe, hänge ich es dir als Beispiel an.
    Dateien
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --