701 Aufrufe
Gefragt in Anwendungen(Java,C++...) von martin68 Einsteiger_in (35 Punkte)
Hallo erstmal, ich hab leider keine Ahnung wie ich das Macro in eine VBA code richtig ausdrücke. Ich hab mal das Makro kopiert

Sub Makro10()
'
' Makro10 Makro
' Ausschneiden wenn Datum erledigt und in Tabelle erledigt einfügen und absteigend sortieren
'

'
    ActiveWindow.SmallScroll Down:=-42
    Rows("2:2").Select
    Selection.Cut
    Sheets("erledigt").Select
    Rows("17:17").Select
    ActiveSheet.Paste
    Range("A3:I17").Select
    ActiveWorkbook.Worksheets("erledigt").Sort.SortFields.Clear
    ActiveWorkbook.Worksheets("erledigt").Sort.SortFields.Add2 Key:=Range( _
        "I3:I17"), SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:= _
        xlSortNormal
    With ActiveWorkbook.Worksheets("erledigt").Sort
        .SetRange Range("A2:I17")
        .Header = xlYes
        .MatchCase = False
        .Orientation = xlTopToBottom
        .SortMethod = xlPinYin
        .Apply
    End With
    Sheets("Master").Select
    Rows("2:2").Select
    Selection.Delete Shift:=xlUp
End Sub

Für mich wichtig

nur wenn in der Spalte 9 Tabelle Master ein Datum eingetragen wird, soll diese Zeile auschgeschnitten werden und in die Tabelle erledigt eingefügt werden und dort Datumsmässig absteigen sortiert werden.

Ich hoffe das ich mich eingermassen verstädlich ausgedrückt habe und hoffe das mir hierbei jemand helfen kann.

Für die Hilfe mich jetzt schon einmal bedanken

Gruß Martin

4 Antworten

+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Martin,

kopiere das folgende Makro in ein Standardmodul deiner Tabelle. Die Sortierung erfolgt entsprechend deinem Makro ab Zeile 2 (=Überschrift). Ich gehe mal davon aus, dass du das Makro per Hand starten willst.

Sub erledigt()
Dim lngZeile As Long
Dim lngLetzte As Long
Dim lngEinfuegen As Long

'Bildschirmaktualisierung ausschalten:
Application.ScreenUpdating = False

With Worksheets("erledigt")
 'letzte beschriebene Zeile im Arbeitsblatt erledigt ermitteln
 lngEinfuegen = .Cells(Rows.Count, 9).End(xlUp).Row
End With

With Worksheets("Master")
 'im Arbeitsblatt Master die letzte beschriebene Zeile ermitteln
 lngLetzte = .Cells(Rows.Count, 1).End(xlUp).Row
 'alle Zeilen durchlaufen
 For lngZeile = lngLetzte To 2 Step -1
   'Prüfen, ob in Spalte I ein Datum steht
   If IsDate(.Cells(lngZeile, 9).Value) Then
     'falls ja, dann Einfügezeile um 1 erhöhen
     lngEinfuegen = lngEinfuegen + 1
     'Zeile kopieren
     .Rows(lngZeile).Copy Destination:=ThisWorkbook.Worksheets("erledigt").Rows(lngEinfuegen)
     'Zeile löschen
     .Rows(lngZeile).Delete Shift:=xlUp
   End If
 Next lngZeile
End With

'Daten im Arbeitsblatt erledigt nach Spalte I sortieren
With Worksheets("erledigt")
  .Sort.SortFields.Clear
   .Sort.SortFields.Add Key:=Range("I2:I" & lngEinfuegen), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortNormal
   With .Sort
      .SetRange Range("A2:I" & lngEinfuegen)
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
   End With
End With

'Bildschirmaktualisierung einschalten:
Application.ScreenUpdating = True

End Sub

Gruß

M.O.

0 Punkte
Beantwortet von martin68 Einsteiger_in (35 Punkte)

Guten Morgen M:O.,

vielen Dank für die schnelle Antwort.

Ich hab den Code ins Tabellenblatt Master eingefügt.

Dann bringt er mir einen Laufzeitfehler 9 Index auserhalb des gültigen Bereichs.

-->  .Rows(lngZeile).Copy Destination:=ThisWorkbook.Worksheets("erledigt").Rows(lngEinfuegen)

Geht es auch das ich das Makro nicht seperat ausführen muss?
Also sobald ich in der Spalte "Datum erledigt" ein Datum eintrage das dies dann automatisch ausgeführt wird?
Alternativ über einen "Button aktualisieren" auf der "Master" sobald ich drauf drücke das es aktualisiert wird?
Gruß Martin
+1 Punkt
Beantwortet von m-o Profi (22.7k Punkte)

Hallo Martin,

wenn das automatisch gehen soll, dann kopiere das folgende Makro in das VBA-Projekt des Arbeitsblattes "Master" (und lösche das vorhandene Makro):

Private Sub Worksheet_Change(ByVal Target As Range)
Dim lngZeile As Long

'Makro verlassen, wenn keine Eingabe in Spalte I erfolgt
If Intersect(Target, Range("I:I")) Is Nothing Then Exit Sub

If IsDate(Target.Value) Then
  lngZeile = ThisWorkbook.Worksheets("erledigt").Cells(Rows.Count, 9).End(xlUp).Row + 1
  Rows(Target.Row).Copy Destination:=ThisWorkbook.Worksheets("erledigt").Cells(lngZeile, 1)
    'Zeile löschen
  Rows(Target.Row).Delete Shift:=xlUp
 
  'Daten im Arbeitsblatt erledigt nach Spalte I sortieren
  With Worksheets("erledigt")
   lngZeile = .Cells(Rows.Count, 9).End(xlUp).Row
   .Sort.SortFields.Clear
    .Sort.SortFields.Add Key:=Range("I2:I" & lngZeile), SortOn:=xlSortOnValues, _
        Order:=xlAscending, DataOption:=xlSortNormal
    With .Sort
      .SetRange Range("A2:I" & lngZeile)
     .Header = xlYes
     .MatchCase = False
     .Orientation = xlTopToBottom
     .SortMethod = xlPinYin
     .Apply
   End With
 End With

End If

End Sub

Das zuerst gepostete Makro gehört in ein allgemeines Modul und funktioniert bei mir einwandfrei. Dabei wird die ganze Tabelle durchsucht und alle Datensätze, bei denen ein Datum in Spalte I steht in das Blatt erledigt kopiert.

Gruß

M.O.

0 Punkte
Beantwortet von martin68 Einsteiger_in (35 Punkte)
Hallo M.O.,

super vielen herzlichen Dank für deine schnelle hilfe.

Funtioniert jetzt einwandfrei.

Gruß

Martin
...