Ankündigung

Einklappen
Keine Ankündigung bisher.

Excel Makro - nächste freie Zelle auswählen

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

    Excel Makro - nächste freie Zelle auswählen

    hi leute, würde gerne mit einem makro die nächste freie zelle einer spalte (z.b. A) markieren, weiß jemand, wie das funktioniert? momentan sieht das makro so aus:

    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
    xlNone, SkipBlanks:=False, Transpose:=False
    Sheets("Stündlich").Select

    vor "Selection.PasteSpecial" soll das mit dem automatischen markieren geschehen.


    vor diesem makro wird folgendes ausgeführt:

    Selection.Copy
    Sheets("Tagesmittel berechnen (1-24)").Select
    ActiveWindow.SmallScroll Down:=-9
    Range("A1").Select
    ActiveSheet.Paste
    ActiveWindow.SmallScroll Down:=9
    Range("A26:K26").Select
    Application.CutCopyMode = False
    Selection.Copy
    Sheets("Alle Tagesmittel").Select


    das beste wäre, wenn ich beide makros zu einem zusammenführen könnte. bisher muss ich erst das erste (hier das untere) ausführen, dann die zu anfang angesprochene nächste freie zelle markieren und anschließend das zweite makro ausführen, was natürlich auf dauer einiges an zusätzlicher arbeitszeit bedeutet.

    #2
    Ich nutze immer

    ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row

    Also in VBA:

    Dim letzteZeile as integer
    letzteZeile = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row


    Das gibt dir die letzte gefüllte Zelle einer Spalte (1).

    Mit Range("A" & letzteZeile) markierst du dann die letzte Zelle in Spalte A. Also Selection mit Range("A" & letzteZeile) ersetzen.

    Edit: Versuch es mal mit dem Code, der sollte eigentlich alles beinhalten:

    Dim letzteZeile as integer
    letzteZeile = Sheets("Alle Tagesmittel").Cells(Rows.Count, 1).End(xlUp).Row

    Sheets("Tagesmittel berechnen (1-24)").Range("A26:K26").Copy
    Sheets("Alle Tagesmittel").Range("A" & letzteZeile+1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks:=False, Transpose:=False
    Application.CutCopyMode = False
    Sheets("Stündlich").Select

    Kommentar


      #3
      danke, coole sache! klappt leider noch nicht wie gewünscht, aber ich versuche es mal mit deiner hilfestellung hinzukriegen.

      Kommentar


        #4
        habe es jetzt so gelöst:

        Selection.Copy
        Sheets("Tagesmittel berechnen (1-24)").Select
        Range("A1").Select
        ActiveSheet.Paste
        Range("A26:P26").Select
        Application.CutCopyMode = False
        Selection.Copy
        Sheets("Alle Tagesmittel").Select
        Cells(Range("A1").End(xlDown).Row + 1, 1).Select
        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
        xlNone, SkipBlanks:=False, Transpose:=False
        Sheets("Stündlich").Select



        bei dem makro ist es jetzt ja so, dass es nach der ausführung auf das blatt "Stündlich" zurückspringt, was es auch soll, da ich dort den nächsten bereich markieren und das makro erneut ausführen will. kann man dieses markieren auch per makro machen? genauer gesagt markiere ich immer 24 (zeilen) x 16 (spalten) zellen, führe das makro aus und markiere die nächsten 24 x 16 zellen usw. kann ich das als makro schreiben? konnte bisher nichts konkretes dazu finden

        Kommentar


          #5
          Statt dem Selection.Copy am Anfang, kannst du auch ein Range("Von:Bis") machen. Also zB Range("A1:P24").Copy

          Ansonsten kannst du deinen Code auch kürzen:

          Selection.Copy
          Sheets("Tagesmittel berechnen (1-24)").Range("A1").Paste
          Application.CutCopyMode = False
          Sheets("Tagesmittel berechnen (1-24)").Range("A26:P26").Copy
          Sheets("Alle Tagesmittel").Cells(Range("A1").End(xlDown).Row + 1, 1).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
          xlNone, SkipBlanks:=False, Transpose:=False
          Sheets("Stündlich").Select
          Wenn du Selection.Copy durch das Range ersetzt, passiert folgendes:

          Im Aktuellen Sheet wird A1:P24 ausgewählt und in Zeile A1 des Sheets Tagesmittel berechnen (1-24) kopiert. Danach kopiert er A26:P26 aus dem Sheet Tagesmittel berechnen (1-24) und kopiert es in das Sheet Alle Tagesmittel an die erste freie Stelle in Spalte A oder? Als letztes springt er in das Sheet Stündlich.

          Stehst du vorher auch bereits im Sheet Stündlich? Dann könntest du dir das letzte Select sparen, da er mit meinem Code nicht auf die anderen Sheets springt.

          Kommentar


            #6
            mit deinem code bekomme ich einen fehler :P ich lasse ihn erst mal so und wenn ich zeit habe mache ich mich evtl. mal ans kürzen.

            ich weiss, dass Range("A1:P24").Copy den besagten bereich markiert, aber so würde ja immer nur derselbe bereich markiert werden. ich hätte es gerne so, dass am anfang der bereich "A2:P26" markiert bzw. kopiert wird, dann wird alles genau so wie du es beschrieben hast ausgeführt (hier endet das makro) und danach (bei erneutem ausführen des makros) wird der nächste 24 x 16 zellen-bereich markiert, also jetzt "A27:P50" und immer so weiter.

            Kommentar


              #7
              Das kannst du ganz einfach mit einer Schleife machen.

              For i = 2 to 100 step 25
              Range("A" & i ":P" i + 24).Copy
              Sheets("Tagesmittel berechnen (1-24)").Select
              Range("A1").Select
              ActiveSheet.Paste
              Range("A26:P26").Select
              Application.CutCopyMode = False
              Selection.Copy
              Sheets("Alle Tagesmittel").Select
              Cells(Range("A1").End(xlDown).Row + 1, 1).Select
              Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
              xlNone, SkipBlanks:=False, Transpose:=False
              Sheets("Stündlich").Select
              Next i
              Jetzt geht er mit einer Schleife durch i und erhöht jedes mal i um 25. Solange, bis i über 100 ist.

              Erster Durchgang: A2:P26
              Zweiter Durchgang: A27:P51
              3. A52:P76
              4. A77:P101

              Im 5. Durchgang wäre i über 100 und er würde nicht mehr laufen.

              Kommentar


                #8
                sehr cool, danke! für Range("A" & i ":P" i + 24).Copy wird mir ein syntaxfehler angezeigt, weißt du wo der fehler liegt?

                /edit: ok, es muss wohl Range("A" & i & ":P" & i + 24) lauten

                Kommentar


                  #9
                  Range("A" & i & ":P" & i + 24).Copy

                  So muss es natürlich heißen, sorry.

                  Soll nur bedeuten, dass die Schleife halt i hochzählt, bis es letztendlich über 100 ist.

                  Kommentar


                    #10
                    danke, jetzt läuft alles wunderbar! ein letztes problem gibt es aber noch, dann kann entgültig abgefahren werden :)


                    am anfang habe ich ja gefragt, wie man die nächste freie zelle in spalte A markiert.

                    deine lösung ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row und auch Cells(65000, 1).End(xlUp).Offset(1, 0).Select funktionieren gut, allerdings wird immer die nächste freie zelle unter der allerletzten gefüllten zelle in spalte A markiert, auch wenn zischendrin freie zellen sind, was bei mir der fall ist. z.B. steht was in den zeilen 1 und 33, jetzt soll aber nicht zeile 34 als nächste freie ermittelt werden, sondern zeile 2.

                    meine lösung Cells(Range("A1").End(xlDown).Row + 1, 1).Select oder dementsprechend auch Cells(1, 1).End(xlDown).Offset(1, 0).Select funktionieren, aber nur, wenn irgendwas in spalte A2 steht?! das tut es aber vor der makro-ausführung nicht, sondern lediglich in A1.

                    habe schon alles mögliche ausprobiert, aber bisher ohne erfolg.

                    Kommentar


                      #11
                      Was brauchst du denn jetzt genau? Die erste leere Zelle in Spalte A? ;)

                      Falls ja, ist mir keine Formel bekannt. Würde einfach mit einer IF-Schleife die Spalte A durchgehen, bis eine Zelle = "" ist.

                      Dim ersteLeereZelle as Integer

                      For j = 1 to ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
                      if Range("A" & j).Value = "" then
                      ersteLeereZelle = j
                      exit for
                      end if
                      next j
                      Danach kannst das Feld mit Range("A" & ersteLeereZelle) zugreifen.

                      Kommentar


                        #12
                        ach vergessen wir das ganze. wie sähe denn deine if-schleife im gesamten makro aus? momentan sieht es so aus (die fett markierte zeile macht aber nicht das was sie soll, da käme dann deine schleife zum einsatz):

                        For i = 3 To 100 Step 24
                        Sheets("Stündlich").Range("A" & i & ":P" & i + 23).Copy
                        Sheets("Tagesmittel berechnen (1-24)").Select
                        Range("A1").Select
                        ActiveSheet.Paste
                        Range("A26:K26").Select
                        Application.CutCopyMode = False
                        Selection.Copy
                        Sheets("Alle Tagesmittel").Select
                        Cells(65000, 1).End(xlUp).Offset(1, 0).Select
                        Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                        xlNone, SkipBlanks:=False, Transpose:=False
                        Sheets("Stündlich").Select
                        Next i

                        Kommentar


                          #13
                          Dim ersteLeereZelle as Integer

                          For i = 3 To 100 Step 24
                          Sheets("Stündlich").Range("A" & i & ":P" & i + 23).Copy
                          Sheets("Tagesmittel berechnen (1-24)").Select
                          Range("A1").Select
                          ActiveSheet.Paste
                          Range("A26:K26").Select
                          Application.CutCopyMode = False
                          Selection.Copy
                          Sheets("Alle Tagesmittel").Select

                          For j = 1 to ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
                          if Range("A" & j).Value = "" then
                          ersteLeereZelle = j
                          exit for
                          end if
                          next j

                          Range("A" & ersteLeereZelle).PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:= _
                          xlNone, SkipBlanks:=False, Transpose:=False
                          Sheets("Stündlich").Select
                          Next i
                          Alles immer ohne Gewähr, ich probiere es nicht aus, sondern alles aus dem Kopf ^^

                          Kommentar


                            #14
                            klar, ausprobieren und anpassen muss ich schon selbst, ich brauche den kram ja schließlich auch und nicht du :D mittlerweile läuft alles sahnig, danke für die top hilfe!!

                            Kommentar

                            Lädt...
                            X