[Gelöst] Inhalt aus Excel-Zelle lesen und in Datum konvertieren

schl3ck

schon lange hier
Inhalt aus Excel-Zelle lesen -> keine Stringfunktionen funktionieren

Hallo Boardies,

Ich wollte mir ein kleines Programm für ein Excelmakro schreiben, welches Daten aus dem Internet (per Hand rein kopiert) richtig anordnet, und wenn mal ein Tag übersprungen wird, dass er da den Wert des Vortages nimmt. Soweit, so gut. Nur streikt mein Testprogramm schon beim sortieren des Datums bzw. lesen des Datums.

VB spuckt mir bei diesem Testprogramm:
Code:
Sub umwandeln_Datuum()

' Dies ist ein Kommentar

Dim x As String

x = Cells(1, 1).Text.toString

Tag = [B][U]x[/U][/B].Substring(0, 2)         ' hier kommt der Fehler

Monat = x.Substring(3, 2)

MsgBox (x & ": " & Tag & "." & Monat & ".")

End Sub
beim unterstrichenen x einen Fehler aus, dass dieses "x" ein ungültiger Bezeichner sei. Ich habe es auch schon mit anderen Variablennamen versucht.
Eine Bedingung herrscht allerdings vor: Das Datum aus dem Internet ist nur mit Tag und Monat gegeben.
zB:
Code:
27.05.

Ich hoffe, mir kann jemand helfen und ich bin über jeden Versuch, mir zu helfen, sehr dankbar.
 
Zuletzt bearbeitet:
Vielleicht kann ich dir helfen, wenn du mir verrätst, wofür Cells ist und am besten auch eine msdn-Seite dazu gibst.
Hab etwas gegoogled, aber irgendwie nichts gutes gefunden. :/

Den Code ansonsten verstehe ich und dabei stellt sich mir auch gleich eine Frage:
Wo hast du die Variablen Tag und Monat deklariert? Wenn du das vergessen hast, ist klar, dass es einen Fehler gibt.
Wenn nicht, dann wäre die Fehlermeldung hilfreich.

Ansonsten würde ich nur noch vermuten, dass x einfach keine 2 Zeichen lang ist, dass du die direkt verwenden kannst.


Außerdem solltest du mal schauen, ob es bei Visual Basic die Struktur DateTime gibt.
Wenn ja, dann schau sie dir mal an, denn so Dinge, wie das Ausgeben des Tag-Elementes ist da ganz schnell gelöst.
 
Vielleicht kann ich dir helfen, wenn du mir verrätst, wofür Cells ist und am besten auch eine msdn-Seite dazu gibst.
Hab etwas gegoogled, aber irgendwie nichts gutes gefunden. :/

Cells gibt eine Zelle in einer Excletabelle mithilfe von 2 Integer an. Klick

Den Code ansonsten verstehe ich und dabei stellt sich mir auch gleich eine Frage:
Wo hast du die Variablen Tag und Monat deklariert? Wenn du das vergessen hast, ist klar, dass es einen Fehler gibt.
Wenn nicht, dann wäre die Fehlermeldung hilfreich.

Ich habe zwar die Variablen Tag und Monat nicht deklariert, aber daran lag auch nicht das Problem:
Excel-stringFehler.JPG

Ansonsten würde ich nur noch vermuten, dass x einfach keine 2 Zeichen lang ist, dass du die direkt verwenden kannst.

VB lässt mich nicht mal die Länge ausgeben... (dabei ensteht der selbe Fehler wie im Bild) Nur den Inhalt der Variable selbst (mithilfe einer MsgBox), und dieser entspricht "27.05." (ohne ").

Außerdem solltest du mal schauen, ob es bei Visual Basic die Struktur DateTime gibt.
Wenn ja, dann schau sie dir mal an, denn so Dinge, wie das Ausgeben des Tag-Elementes ist da ganz schnell gelöst.

Mir geht es nicht darum, den heutigen Tag heraus zu finden, sondern zu wissen, welches Datum in der entsprechenden Exceltabellenzelle steht.

Vielen Dank für deine Hilfe! :)
 
Hab leider von Excel (und VB) nicht so viel Ahnung, dass ich Deinen Codeschnipsel bewerten könnte.

Wenn die Zelle, auf die sich dieses Script bezieht, falsch formatiert ist, nützt das Ganze vermutlich nichts.
Das Datum oder die Uhrzeit wird in Excel intern durch fortlaufende Zahlen geführt, zB 42058 (heute), der nächste Tag (morgen) wäre dann 42059 usw. Wenn Du also auf eine dieser Zahlen Bezug nehmen willst, sollte sie im Format JJMMTT dargestellt werden, sonst kann VB vermutlich nichts damit anfangen.
Uhrzeiten werden entsprechend, aber mit Nachkommastellen gerechnet. Formatierung ist nur die optische Darstellung, rechnerisch die fortlaufende Zahl. Wenn Du bei der Formatierung keine Jahreszahl angibst, behandelt Excel dies als normale Zahl.
Falls Dir das schon klar war, liegt bei mir ein Verständnisfehler vor - bitte entschuldige, bin nur Gelegenheitsuser. :)
 
Danke, aber das weiß ich bereits. Deswegen versuche ich ja auch das Datum, welches nur mit Tag & Monat gegeben ist, heraus zu finden, um es nachher ins "echte" Exceldatum zu schreiben, also dass es intern eine Zahl ist.

Aber ich habe ja das Problem, dass keine Stringfunktion (zB myString.length oder myString.Substring) funktionieren wollen...
 
DateTime ist nicht nur für das aktuelle Datum. Das findet man mit DateTime.Now raus (Bei C#). Man kann damit aber allgemein Zeiten speichern und diese formatieren, wie es einem passt. Wenn du das Datum da rein bekommst, dann wäre der Rest ganz einfach.


Hast du denn mal versucht, das Programm zu debuggen? Was für einen Compiler nutzt du denn?
Bei Visual Studio debuggst du das Programm automatisch bei jedem Test (F5) außer du stellst es aus.



Und ich schau derweil mal, ob es bei DateTime nicht eine Methode gibt, die das Datum aus einem String lesen kann.
Dachte, da kommt sowas drin vor :unsure::
Ob die Methode dann in VB gleich ist, kann ich noch nicht sagen.

Auf jeden Fall, wenn es die gibt, müsstest du nur noch ein fiktives Jahr (das wars doch, was in dem Datum fehlt?) anhängen und der Methode übergeben.
Als Ergebnis bekommst du ein DateTime-Objekt, wo du nur noch Tag und Monat über die Eigenschaften abfragen musst.

Aber ob es das alles in VB auch gibt, keine Ahnung.
Ich starte mal ein VB-Projekt und experimentiere was rum^^
 
Keine Ahnung, welcher Compiler benutzt wird. Ich verwende Visual Basic for Applications für die Excelmakros. Ich meine, ich starte Excel, klicke dann auf "Entwicklertools" und schließlich auf "Makros". Nun wähle ich eins aus und klicke auf "Bearbeiten". Damit bin ich VBA.

Das ganze mit dem Datum habe ich mir schon angeschaut, aber wie gesagt, mir geht es um den Fehler (ich nehme an, dass es einer ist), dass bei mir keine String-Funktionen funktionieren (zB myString.length oder myString.Substring).
 
Code:
Module Module1

    Sub Main()
        ShowDate("27.5.")
        Console.Read()
    End Sub

    Sub ShowDate(ByVal dat As String)
        ' Die übergebene Datums-Zeichenfolge in das richtige Format bringen
        dat += "0 0:0:0 PM"

        ' Den String-Wert der Parse-Methode übergeben und Ergebnis als Wert von Date speichern
        Dim Datum As Date = Date.Parse(dat)

        ' Von dem Date-Wert Tag und Datum abfragen und anschließend als String abspeichern
        Dim Tag As String = Datum.Day
        Dim Monat As String = Datum.Month

        ' Damit habe ich mir das Ergebnis anzeigen lassen
        Console.WriteLine(Tag & "." & Monat & ".")
    End Sub

End Module

Das funktioniert, hab nun Tag und Monat als String und kann es nutzen.
Hoffe, das war es, was du versucht hast^^


Keine Ahnung, welcher Compiler benutzt wird. Ich verwende Visual Basic for Applications für die Excelmakros. Ich meine, ich starte Excel, klicke dann auf "Entwicklertools" und schließlich auf "Makros". Nun wähle ich eins aus und klicke auf "Bearbeiten". Damit bin ich VBA.

Das ganze mit dem Datum habe ich mir schon angeschaut, aber wie gesagt, mir geht es um den Fehler (ich nehme an, dass es einer ist), dass bei mir keine String-Funktionen funktionieren (zB myString.length oder myString.Substring).


Achso, ja dann wird das auch nix mit dem debuggen...

Warum das mit dem String nicht klappt, könnte (blinde Vermutung) vielleicht daran liegen, dass die String-Funktionen im Namespace (Bei VB Module oder) System liegen und das Ding muss man erst als DLL und dann als Namespace (Module) einbinden, bevor es genutzt werden kann.

Obwohl die ToString-Funktion eigentlich von object geerbt ist und damit allgegenwärtig sein sollte
 
Zuletzt bearbeitet:
AW: Inhalt aus Excel-Zelle lesen -> keine Stringfunktionen funktionieren

Tag = x.Substring(0, 2) ' hier kommt der Fehler

Monat = x.Substring(3, 2)
Wäre es möglich, dass VB hier an Stelle einer Variable x den Namen des Substrings benötigt, zB Tag = x day.substring (3, 2)oder so ähnlich, entsprechend dann x month.substring oder so ähnlich?
schl3ck schrieb:
...einen Fehler aus, dass dieses "x" ein ungültiger Bezeichner sei. Ich habe es auch schon mit anderen Variablennamen versucht.
Das hört sich doch so an, als brauchte VB einen intern festgelegten Namen nach der Variable, es erkennt x offensichtlich nicht als Var., wenn es die genaue (VB-)Bezeichnung nicht hat.
schl3ck schrieb:
Eine Bedingung herrscht allerdings vor: Das Datum aus dem Internet ist nur mit Tag und Monat gegeben.
Wenn ich das richtig begreife, kopierst Du das händisch ins Worksheet. Da sollte es doch nicht allzuviel Mühe machen, das Datum händisch zu ergänzen?:)
 
Ne, das mit dem x ist schon richtig, habs im Visual Studio getestet.
Substring ist eine Methode der Klasse String, das heißt, sie wird über das zu bearbeitende Objekt via Punkt-Operator aufgerufen.


Die Letzte Idee, die ich hab, ist folgende:

Du hast x in einer Zeile deklariert und erst in der Folgenden Zeile instanziert.
Bei Referenz-Typen würde in der ersten Zeile kein Wert vorhanden sein, eine solche Methode würde also nicht funktionieren.
Bei C# ist String allerdings ein Werte-Typ dann wird automatisch der Wert null gegeben.

Wie das bei Visual Basic ist, kann ich nicht sagen, aber vielleicht solltest du mal heraus finden, ob diese Zeile: Cells(1, 1).Text.toString überhaupt korrekt arbeitet.
Denn die ist dazu gedacht, x einen Wert zu verpassen und wenn x in VisualBasic als Referenz-Typ behandelt wird und die Methode nicht korrekt arbeitet, ist x zwar deklariert, hat aber keinen Wert, also keine Referenz. Die Methode ist also nicht zulässig.

Der zeigt das aber auch nur als Laufzeitfehler an, weil der Compiler ja nur die Deklaration der Variable sieht. In der Zeile danach wird sie ja instanziert, wenn die Methode aber einen nicht vorhandenen Wert ausgibt, sieht der Compiler das nicht.


Was du also machen kannst, ist folgendes:

MsgBox(Cells(1, 1).Text.toString)

Wenn diese Methode alles korrekt ausgibt, dann weiß ich auch nicht weiter -.-
Ich würde noch rum experimentieren, indem ich Deklaration und Instanzierung in eine Zeile schreiben, also so:

Dim x As String = Cells(1, 1).Text.toString

Aber ob das hilft, bezweifle ich.
 
@Palladin007: "Deklaration und Instanzierung" war das, was ich hinter meinem umständlichen Nicht-Codierer-Schnack gemeint hatte. Danke für die Übersetzung! :)
 
Achso? :D
Ich hab bei dir ehrlich gesagt nicht durch geblickt^^

Na mal schauen, was er sagt, wenn er wieder online ist^^
 
Code:
MsgBox (Cells(1, 1).Value.Text)
MsgBox (Cells(1, 1).Value)
MsgBox (Cells(1, 1).Value.Text.toString)

Die ersten Beiden funktionieren, nur beim Dritten regt er sich auf, dass er kein Objekt hat.
Da habe ich es mal Versucht, indem ich x als Objekt festgelegt habe. Beim Kompilieren regt er sich dafür nicht mehr auf, sondern beim Abrufen der Information aus dem Worksheet schreibt er: "Laufzeitfehler '91': Objektvariable oder With-Blockvariable nicht festgelegt"

Wenn ich versuche, die Variable zu deklarieren und in der selben Zeile einen Wert zuzuweisen, regt er sich schon auf, wenn ich mit dem Cursor aus der Zeile gehen will, dass da das Objektende erwartet wird (vor dem = ). Führe ich das Programm trotzdem aus, kommt beim Kompilieren der Fehler, das da ein Syntaxfehler vorliegt.


Händisch die Daten einzugeben wäre natürlich eine Möglichkeit, aber dafür bin ich viel zu faul... (also nehm ich den schwierigeren Weg ums nachher leichter zu haben...) :D
 
toString, was soll das eigentlich tun?

Text ist doch schon string, sonst würde die MsgBox es nicht akzeptieren.


ALso jetzt kann ich wirklich nur noch spekulieren, dass der Compiler (du nutzt ja einen von Excel, oder) da ein bisschen verbugt ist.
Du kannst dir ja mal Visual Studio 2010 Express downloaden, dort ein VisualBasic-Projekt erstellen und dann alles dort programmieren.
Wenn es da einen Fehler gibt, hast du gleich alle Infos vom Debuggen und kannst schauen, was das Problem ist.

Wenn es dann dort funktioniert, fügst du es bei Excel ein.
Und wenn es dann nicht geht, liegts wohl am Excel und du musst dir Infos darüber suchen, ob es bei Excel vielleicht irgendwelche Sonderregelungen gibt. :/
 
.Text gibt das her, was der Benutzer in der Exceltabelle sieht und .Value gibt das aus, was für Excel drinnen steht, also zB die Nummer für das Datum.

Ich werde es mal mit einer Neuinstallation bzw. mit "Reparieren versuchen. Mal sehen, was er dann sagt...

Trotzdem herzlichen Dank an euch beide, dass ihr euch die Zeit genommen habt, mir zu helfen :)
 
Und die toString-Funktion? o_O

Naja, ich kann C#, Visual Basic hab ich mich jetzt nur rein gedacht ^^

Hab getan, was ich konnte, mehr kann ich nur tun, wenn du C# lernst :D
 
Ich habe es nun endlich gelöst :)

Mein VB schafft es aus einem unbekanntem Grund nicht, den Punkt-Operator nach einer von mir definierten Variable zu akzeptieren. Da habe ich mal ein bisschen herumgeschaut und bin auf die Funktionen Left(String, AnzahlZeichen) und Right(String, AnzahlZeichen) gestoßen. Glücklicherweise nimmt VB diese an :)

Der Code:
Code:
    Dim tmp As String
    Dim x As String
    Dim heute As String
    
    Dim monath As Integer     ' Monat heute
    Dim tag As Integer        ' Tag mit Wert aus Internet
    Dim monat As Integer      ' Monat - || -
    Dim jahr As Integer       ' Heutiges Jahr
    Dim zeile As Integer
    Dim spalte As Integer
    
    zeile = 54
    spalte = 1
    
    Range("T54").Select
    Selection.NumberFormat = "dd/mm/yyyy"
    
    heute = Cells(54, 20).Text        ' Das heutige Datum steht in einer Zelle
    jahr = Right(heute, 4)
    tmp = Left(heute, 5)
    monath = Right(tmp, 2)
    
    For spalte = 1 To 13 Step 2       ' Das Datum aus der Excel-Zelle erkennen und richtig wieder rein setzen
        x = Cells(zeile, spalte)
        tag = Left(x, 2)
        tmp = Right(x, 3)
        monat = Left(tmp, 2)
        
        If (monath = 1) And (monat = 12) Then
            jahr = jahr - 1
        Else
            jahr = Right(heute, 4)
        End If
            
        Cells(zeile, spalte) = CStr(monat) & "/" & CStr(tag) & "/" & CStr(jahr)     ' Datum wieder in Excel-Zelle schreiben
        Cells(zeile, spalte).NumberFormat = "d/m/yyyy"                              ' Datum ins richtige Format bringen
    Next spalte
 
Oben