soco: Excel

Hallo alle!!

Ich suche eine Lösung um Excel Registerblätter mit Hilfe eines Makros automatisch mit Tag und Datum zu benennen.

also z.B

MI 01.10.09
DO 02.10.09
FR 03.10.09
usw.

kann mir da jemand helfen?

mfg

  1. Hallo,

    Ich suche eine Lösung um Excel Registerblätter mit Hilfe eines Makros automatisch mit Tag und Datum zu benennen.

    wo ist das Problem?

    Legst Du bzw. Deine Anwendung die Tabellenblätter an?
    Ist es egal, welches Blatt wie heißt?
    Benötigst Du einfach nur ein Blatt für jeden Tag eines Monats?

    Alles in allem ist das mit VBA nicht besonders schwierig.

    Freundliche Grüße

    Vinzenz

    1. Ich brauche eine excel tabelle wo für jeden tag eine eigene registerkarte besteht die sortiert sind. immer für 3 monate also zum Beispiel oktober bis dezember

      die registerkarten sollten folgendermaßen benannt sein:

      1te: DO 01.10.09
      2te: FR 02.10.09
      3te: SA 03.10.09

      usw

      danke...

      1. Mahlzeit soco,

        Ich brauche eine excel tabelle wo für jeden tag eine eigene registerkarte besteht die sortiert sind. immer für 3 monate also zum Beispiel oktober bis dezember

        Dann solltest Du in irgendeiner Form Start- und Enddatum abfragen.

        Anschließend gehst Du mittels einer Schleife vom Startdatum ausgehend durch alle Tage dieses Zeitraums.

        Für jeden einzelnen Tag legst Du ein neues Arbeitsblatt an (z.B. nach dem letzten bestehenen). Anschließend benennst Du es Deinen Wünschen entsprechend um.

        Wie Vinzenz bereit schrieb, ist das mit VBA eigentlich kein großer Aufwand ...

        danke...

        Gern geschehen.

        MfG,
        EKKi

        --
        sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      2. Hoi!

        Und was hast Du schon? Sind die Sheets schon vorhanden und sollen nur noch umbenannt werden? Oder sollen sie erstellt werden?

        --
        "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
              - T. Pratchett
  2. Hi soco,

    Ich suche eine Lösung um Excel Registerblätter mit Hilfe eines Makros automatisch mit Tag und Datum zu benennen.

    hier ist eine kleine Anregung:

    Dim datDatum As Date
    For datDatum = "01.01.2009" To "30.03.2009"
        Sheets.Add after:=Sheets(Sheets.Count): ActiveSheet.Name = Format(datDatum, "DDD DD.MM.YY")
    Next

    Beginn und Ende können natürlich abgefragt werden, wobei zur Sicherheit auch ein Errorhandler eingebaut werden sollte, falls es sich nicht wirklich um Datumsangaben handelt. Und um ganz sicher zu gehen, kann auch CDate verwendet werden, damit Excel die Angaben nicht als String behandelt - aber bitte vorher prüfen, ob es sich wirklich um Datumsangaben handelt, weil es sonst bei CDate zu einem Fehler kommen kann.

    Warum manche ein Problem daraus machen, mal ein kleines Stück Code vorzugeben, verstehe ich echt nicht. Vielleicht sollten sich die Vetreter des "SELF" auch mal deutlich machen, dass es auch ein induktives Lernen gibt und man damit oft besser hilft, zum Verstehen beizutragen.

    1. Mahlzeit Jörg,

      Warum manche ein Problem daraus machen, mal ein kleines Stück Code vorzugeben, verstehe ich echt nicht.

      Ich fühle mich hier mal angesprochen: im konkreten Fall ist es so, dass die Problemlösung wirklich mehr als trivial ist. Insofern hast Du schon recht: man hätte auch einfach die paar Zeilen Code hinschreiben können.

      Die Frage ist doch aber eher: warum hat der OP so ein Problem damit, eine derart einfache Aufgabe zu lösen? Hat er irgendwie ein grundsätzliches Verständnisproblem, sieht den berühmten Wald vor lauter Bäumen nicht? Dann sollte es IMHO schon sehr hilfreich sein, wenn er durch entsprechende Hinweise in die richtige Richtung geschubst wird oder wenn er kurz schematisch einmal einen Ansatz bekommt.

      Oder liegt es vielleicht eher daran, dass der OP keine Ahnung hat, auch nicht bereit ist, irgendwas zu lernen und einfach nur "das Bisschen Code" haben will, das er dann ohne sich zu bedanken direkt einbaut und im Endeffekt *NICHTS* gelernt hat. Weder, wie die konkrete Problemlösung aussieht bzw. funktioniert, noch wie man gezielt an Probleme herangeht und eine sinnvolle Lösung *SELF* entwickelt.

      So oder so: es ist IMHO in jedem Fall besser, dem Fragenden Hinweise zu geben, anstatt ihn mit fertigen Lösungen zu überhäufen. Hinweise können in dem Fall natürlich auch die vier von Dir geposteten Code-Zeilen sein (da sie so ohne Weiteres auch nicht die vollständige Lösung darstellen und der Fragende sich schon wieder Gedanken machen sollte) ...

      Ich gebe ehrlich zu: ich war zu faul, mich jetzt in die Excel-VBA-Syntax hineinzudenken (mittlerweile mache ich das zu selten). Aber ich behaupte mal, dass mein Hinweis nicht minder hilfreich war ... zumindest für jemanden, der sein Problem ernsthaft *SELF* lösen möchte.

      MfG,
      EKKi

      PS: Dass der OP sich aber - nachdem eine fast fertige Lösung genannt wurde - nicht noch einmal wieder gemeldet hat (und die Art, *WIE* er seine beiden Beiträge schrieb) lassen mich aber eher vermuten, dass er einfach nur fertigen Code wollte und nicht im Geringsten Interesse daran hat, seine Probleme in Zukunft selbst zu lösen ... "da im Internet" gibt's ja immer genug "Idioten, die einem alles machen".

      --
      sh:( fo:| ch:? rl:( br:> n4:~ ie:% mo:} va:) de:] zu:) fl:{ ss:) ls:& js:|
      1. Hi EKKi,

        Ich fühle mich hier mal angesprochen: im konkreten Fall ist es so, dass die Problemlösung wirklich mehr als trivial ist. Insofern hast Du schon recht: man hätte auch einfach die paar Zeilen Code hinschreiben können.

        eben - denn das hat vielleicht gerade mal eine Minute gedauert.

        Die Frage ist doch aber eher: warum hat der OP so ein Problem damit, eine derart einfache Aufgabe zu lösen? Hat er irgendwie ein grundsätzliches Verständnisproblem, sieht den berühmten Wald vor lauter Bäumen nicht?

        Das wissen wir wahrscheinlich alle nicht, können nur spekulieren. Da das Problem so einfach zu lösen ist, handelt es sich IMHO um einen Anfänger, aber auch das ist eben nur Spekulation.

        Dann sollte es IMHO schon sehr hilfreich sein, wenn er durch entsprechende Hinweise in die richtige Richtung geschubst wird oder wenn er kurz schematisch einmal einen Ansatz bekommt.

        Richtig. Das "Schematische" ist der deduktive Lernansatz - eine Möglichkeit.

        Oder liegt es vielleicht eher daran, dass der OP keine Ahnung hat, auch nicht bereit ist, irgendwas zu lernen und einfach nur "das Bisschen Code" haben will, das er dann ohne sich zu bedanken direkt einbaut und im Endeffekt *NICHTS* gelernt hat. Weder, wie die konkrete Problemlösung aussieht bzw. funktioniert, noch wie man gezielt an Probleme herangeht und eine sinnvolle Lösung *SELF* entwickelt.

        Wissen wir das? Das stellt sich oft erst im Nachhinein heraus.

        So oder so: es ist IMHO in jedem Fall besser, dem Fragenden Hinweise zu geben, anstatt ihn mit fertigen Lösungen zu überhäufen. Hinweise können in dem Fall natürlich auch die vier von Dir geposteten Code-Zeilen sein (da sie so ohne Weiteres auch nicht die vollständige Lösung darstellen und der Fragende sich schon wieder Gedanken machen sollte) ...

        Jeder hat so seine Erfahrungen. Meine ist, dass sich vor allem bei solch einfachen Code-Gebilden die Methode besser macht, dass man praktische Beispiele vorgibt und diese dann analysiert werden. Im Unterricht habe ich sehr oft fertige Formeln an das Whitebord geschrieben, die (ohne dass die Teilnehmer dazu vorher Kenntnisse hatten) analysiert werden mussten. Die Leute, die vor mir saßen, haben das weit besser (und vor allem sicherer und dauerhafter) begriffen, als wenn sie aufgrund von Erklärungen die Formeln selbst hätten zusammensetzen müssen. Dadurch, dass sie Logik und Syntax des Vorgegebenen selbst herausgefunden haben, waren sie anschließend wesentlich sicherer in der Lage, eigenständige Lösungen zu entwickeln, weil sie in der Lage waren, die Details selbstständig zu einem Gesamtbild zusammenzufügen. Wie geschrieben - meine Erfahrungen. Wenn Du da andere gesammelt hast, ist es natürlich zweckmäßig, diese anzuwenden.

        Ich gebe ehrlich zu: ich war zu faul, mich jetzt in die Excel-VBA-Syntax hineinzudenken (mittlerweile mache ich das zu selten). Aber ich behaupte mal, dass mein Hinweis nicht minder hilfreich war ... zumindest für jemanden, der sein Problem ernsthaft *SELF* lösen möchte.

        Keine Ahnung - jeder hat, wie geschrieben, sein eigenen Erfahrungen in der Wissensvermittlung.

        PS: Dass der OP sich aber - nachdem eine fast fertige Lösung genannt wurde - nicht noch einmal wieder gemeldet hat (und die Art, *WIE* er seine beiden Beiträge schrieb) lassen mich aber eher vermuten, dass er einfach nur fertigen Code wollte und nicht im Geringsten Interesse daran hat, seine Probleme in Zukunft selbst zu lösen ... "da im Internet" gibt's ja immer genug "Idioten, die einem alles machen".

        Naja, das Problem haben wir doch schon immer - oder? Mittlerweile müssten wir doch darüber stehen.

        Dabei ist es dann doch egal, ob man einen Roman geschrieben hat, um den Fragenden deduktiv an die Lösung heranzuführen oder ob man einfach ein paar Zeilen Code eintippt. Falls er wirklich kein Interesse am Verständnis einer Lösung hat, war ich mit meinem Posting mit den paar Codezeilen wenigstens schnell fertig. Und wenn er dann doch Interesse hat, kann er sich induktiv damit beschäftigen.

  3. moinmoin...

    ich hab den Thread aufmerksam verfolgt und soweit verstanden, dass das
    folgende die Tabellenblätter für den Zeitraum 01.10.09 bis 31.12.09 erzeugt.

    Sub Monatsblätter()
        For Monat = 305 To 396
            Set Sh = Worksheets.Add(after:=Worksheets(Worksheets.Count))
            Sh.Name = Format(DateSerial(2009, Tag, Monat), "dddd,dd.mm.yy")
        Next
        Set Sh = Nothing
    End Sub

    Was mir nicht in den Kopf will, ist die zweite Zeile. Wieso Monat von 305 bis 396? Ich sehe, dass das gewünschte Ergebnis rauskommt, aber ich versteh's nicht. Was ist das für ein Format? Wieso ist Monat 1 = 01.12.2008?

    Wie komme ich von der Zahl 305 zum 01.10.2009?

    Rubuäh... bitte mal erklären...

    1. Hallo,

      ich hab den Thread aufmerksam verfolgt und soweit verstanden, dass das
      folgende die Tabellenblätter für den Zeitraum 01.10.09 bis 31.12.09 erzeugt.

      nö, das ist eher Zufall. Gäbe es eine globale Variable "Tag" mit einem von 0 verschiedenen Inhalt, käme etwas anderes heraus.

      Sub Monatsblätter()
          For Monat = 305 To 396
              Set Sh = Worksheets.Add(after:=Worksheets(Worksheets.Count))
              Sh.Name = Format(DateSerial(2009, Tag, Monat), "dddd,dd.mm.yy")
          Next
          Set Sh = Nothing
      End Sub

      Was mir nicht in den Kopf will, ist die zweite Zeile. Wieso Monat von 305 bis 396?

      ist das für ein Format? Wieso ist Monat 1 = 01.12.2008?
      Wie komme ich von der Zahl 305 zum 01.10.2009?

      Durch schlampige Programmierung, d.h. durch Weglassen von

      Option Explicit

      die eine Deklarierung aller Variablen erzwingt. Weiterhin sind die Variablen miserabel benannt:

      Die Variable Tag wird nicht initialisiert, die Variable Monat ist implizit vom Typ Variant.

      DateSerial() hat folgende Syntax:
          DateSerial(Jahr As Integer, Monat As Integer, Tag As Integer)

      Da die Variable "Tag" nicht deklariert wurde, wird sie implizit angelegt und erhält den Standardwert 0.
      Somit wird der Funktion DateSerial für Jahr der Wert 2009, für den Monat der Inhalt der Variablen "Tag", d.h. 0 und für den Tag der jeweils aktuelle Wert der Variablen "Monat", der von 305 bis 396 läuft übergeben.

      Zählst Du die Tage folgender Monate zusammen:

      Dezember  2008: 31
      Januar    2009: 31
      Februar   2009: 28
      März      2009: 31
      April     2009: 30
      Mai       2009: 31
      Juni      2009: 30
      Juli      2009: 31
      August    2009: 31
      September 2009: 30

      so kommst Du auf 304 Tage.
      Der 305. Tag des 0. Monat des Jahres 2009 ist somit der 1. Oktober 2009.
      Wie nahezu jede vernünftige Programmiersprache verwendet VBA für den ersten Monat im Jahr die 1 und für den ersten Tag im Monat ebenfalls die 1 :-)

      Fazit:

      • Benenne Variablen sinnvoll.
      • Deklariere jede Variable explizit und gib ihr den geeigneten Datentyp
      • Arbeite mit vernünftigen Werten :-)
      • Kommentiere den Code!
      • Nutze die VBA-Hilfe zu den verwendeten Funktionen

      Freundliche Grüße

      Vinzenz

      1. moinmoin Vinzenz,

        ok, soweit verstanden

        Da die Variable "Tag" nicht deklariert wurde, wird sie implizit angelegt und erhält den Standardwert 0.

        verstanden. DateSerial ist damit quasi *unvollständig*... nicht gut...

        Somit wird der Funktion DateSerial für Jahr der Wert 2009, für den Monat der Inhalt der Variablen "Tag", d.h. 0 und für den Tag der jeweils aktuelle Wert der Variablen "Monat", der von 305 bis 396 läuft übergeben.

        auch verstanden, die For-Next-Schleife... also genauer: ich habe verstanden, dass die Schleife diese Werte übergibt, aber

        Zählst Du die Tage folgender Monate zusammen:
        [...]
        so kommst Du auf 304 Tage.
        Der 305. Tag des 0. Monat des Jahres 2009 ist somit der 1. Oktober 2009.

        halt halt halt... stop... Timeout...

        Wieso soll ich ab Dezember 305 nach vorne zählen? Ich kapiers immer noch nich. Wieso beginnt die Schleife bei 305?

        Wie nahezu jede vernünftige Programmiersprache verwendet VBA für den ersten Monat im Jahr die 1 und für den ersten Tag im Monat ebenfalls die 1 :-)

        schon klar, aber ich versteh nicht warum die Schleife bei 305 beginnt.
        Als VBA-Anfänger kann ich nicht nachvollziehen, wie ich von der Aufgabenstellung Schleife vom 01.Oktober 2009 bis Jahresende auf den Startwert 305 komme?

        Unbedarft wie ich bin, hätte ich einen solchen Lösungsansatz erwartet

        For x gleich 01.10.2009 to 31.12.2009
          erzeuge Tabellenblatt
          stelle es ans Ende
          benenne es um in x
        Next x

        oder meinetwegen sowas in der Art

        nimm Tabellenspalte A und beginne in Zelle 1
        solange Zelle nicht leer
          erzeuge Tabellenblatt
          stelle es ans Ende
          benenne es um mit Inhalt der Zelle
        nächste Zelle

        anschliessend erstes Tabllenlatt löschen, zack fertig

        Wo kommt die verschis...ähm Verzeihung... die *merkwürdige* 305 als Startzahl her... Spock würde sagen, das ist höchst unlogisch... seufz

        Erstmal lieben Dank an dich Vinzenz, dass du versucht hast, mir die Gedankengänge des OP darzulegen, aber ich fürchte du bist gescheitert. Ich vergess einfach den Lösungsansatz des OP und mach es lieber *self* ... ist eh immer am besten.

        Gruß Krischi

        1. moinmoin Vinzenz,

          halt halt halt... stop... Timeout...

          ich hab was gefunden... Excel 2007 liefert bei der Funktion Datum(2009;0;305) den 01.10.2009...

          welcher Id*** (vermutlich überbezahlter Schlipsträger, der niemals 8 Std am Stück mit Excel gearbeitet hat) hat denn den Schwachsinn festgelegt?

          Wo kommt die verschis...ähm Verzeihung... die *merkwürdige* 305 als Startzahl her... Spock würde sagen, das ist höchst unlogisch... seufz

          ok... jetzt weiss ich, wo die 305 herkommt... aber logisch ist das nicht...

          Gruß Krischi

          1. Hola amigo!

            ok... jetzt weiss ich, wo die 305 herkommt... aber logisch ist das nicht...

            Das haben die Roemer evtl. Auch gesagt, als irgendwelche dahergelaufenen Auslaender anfingen mit einer 0 zu rechnen. ;)

            Fuer Excel scheint Monat 0 sowas wie der letztjaehrige Dezember zu sein.

            --
            "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                  - T. Pratchett
            1. Hallo,

              Das haben die Roemer evtl. Auch gesagt, als irgendwelche dahergelaufenen Auslaender anfingen mit einer 0 zu rechnen. ;)

              Fuer Excel scheint Monat 0 sowas wie der letztjaehrige Dezember zu sein.

              wie ich schon schrieb:

              "Der 305. Tag des 0. Monat des Jahres 2009 ist somit der 1. Oktober 2009."

              Sorry, aber Du kannst DateSerial auch -1 als Monat übergeben:

              DateSerial(2009, -1, 62)

              ist der 62. Tag des -1. Monats des Jahres 2009,
              d.h. der 62. Tag des 11. Monats des Jahres 2008
              und da der November 30 und der Dezember 31 Tage hat, ist dies nichts anderes als eine komplizierte Schreibweise für

              DateSerial(2009, 1, 1)

              was viel logischer ist, um den ersten Januar zu kennzeichnen.

              Für den OP war wohl:

              DateSerial(2009, 10, 1)

              als Angabe für den 1.10.2009 viel zu schwierig und unverständlich und natürlich noch viel schwieriger als die von Jörg vorgeschlagene Variante:

              Dim datum as Date
                  For datum = CDate("01.10.2009") To CDate("31.12.2009")
                      ' Tu was mit dem Datum
                  Next

              was ja nun wirklich niemand versteht, ohne zwei Seiten Kommentare dazu zu schreiben ;-)

              Nö, da ist sowas wie DateSerial, was PHPler an mktime() erinnert, viel anschaulicher und verständlicher. Muss man nicht so komplizierte Cast-Funktionen wie CDate verwenden, muss man sich nicht an Datentypen halten. Alles in Variant, das ist doch wie in PHP ...

              Freundliche Grüße

              Vinzenz

              1. @ Vinzenz, Steel und Jörg

                mit euren Hinweisen und der VBA-Hilfe von Excel bin ich (absolut keine VBA-Kenntnisse) zu diesem Ergebnis gekommen:

                Sub Monatsblätter()

                Dim datDatum As Date
                Cells.Select
                Selection.Copy

                For datDatum = CDate("01.10.2009") To CDate("31.12.2009")
                    Worksheets.Add after:=Worksheets(Worksheets.Count)
                    ActiveSheet.Name = Format(datDatum, "dddd, dd.mm.yy")
                    ActiveSheet.Paste
                Next

                End Sub

                Das aktuelle Tabellenblatt wird markiert und kopiert, dann ein neues Tabellenblatt erstellt, umbenannt und der Inhalt eingefügt. Dies wird
                für jedes Datum von Startdatum bis Endedatum wiederholt.

                ...und es taucht keine unsinnige *305* auf... freu...

                Vielen Dank an euch, wieder was gelernt

                Gruß Krischi

                1. Hallo!

                  ...und es taucht keine unsinnige *305* auf... freu...

                  Jööööh! Das gefaellt mir daran sogar am Besten. (Und natuerlich, dass Du scheinbar was gelernt hast) :D

                  --
                  "Die Diebesgilde beklagte sich darueber, dass Mumm in aller Oeffentlichkeit behauptet hatte, hinter den meisten Diebstaehlen steckten Diebe."
                        - T. Pratchett