Schleifen

Bild

Betrifft: Schleifen
von: Karmann
Geschrieben am: 07.05.2015 16:41:42

Hallo Zusammen!
Zwei Fragen!
Der beinhaltete VBA Code fügt ein aktuelles Datum zwei Spalten weiter ein, sobald in Spalte B irgendetwas drin steht.
1. Warum funktioniert das nur auf dem ersten Tabellenblatt und wie muss der Code aussehen, damit diese Funktion auf jedem Tabellenblatt funktioniert?
2. Wie müsste der Code lauten, wenn ich das auch noch in Spalte E mit Datumsausgabe in Spalte G haben möchte? Oder sogar in weiteren Spalten?
Wäre euch sehr dankbar!
https://www.herber.de/bbs/user/97518.xlsm

Bild

Betrifft: AW: Schleifen
von: Klaus M.vdT.
Geschrieben am: 07.05.2015 18:33:06
Hallo Karman,
was hat das mit Schleifen zu tuen?
Der Code funktioniert nur in Tabelle1, weil er in Tabelle1 steht ... Der Turbolader in meinem SAAB funktioniert ja auch nicht in meinem Toyota :-)
Was macht das einsame "Next" mitten im Code?
Du prüfst zuerst Spalte B. Falls da nichts zutrifft, verlässt du mit "Exit Sub" den Code. Ergo: Der zweite Teil des Code hat keine Chance, jemals ausgeführt zu werden. Packe das ganze stattdessen in IF-Blöcke. Stupide ginge das so:

Private Sub Worksheet_Change(ByVal Target As Range)
   
   'If Intersect(Target, Range("B1:B100")) Is Nothing Then Exit Sub
   If Not Intersect(Target, Range("B1:B100")) Is Nothing Then
        If Target.Value <> "" Then
           Target.Offset(0, 2).Value = Date
        Else
           Target.Offset(0, 2).ClearContents
        End If
   End If
   
   'If Intersect(Target, Range("e1:e100")) Is Nothing Then Exit Sub
   If Not Intersect(Target, Range("E1:E100")) Is Nothing Then
        If Target.Value <> "" Then
           Target.Offset(0, 2).Value = Date
        Else
           Target.Offset(0, 2).ClearContents
        End If
   End If
   
End Sub
Aber dann musst du den Code ständig wiederholen - wenn du ihn dann auf 3, 5 oder 70 Spalten erweiterst pflegst du dir einen Wolf, sobald sich etwas ändert. Besser (nur einer von vielen Ansätzen): Lege einen boolean-Schalter um, der dann den Code ausführt oder nicht. Ungetestet:
Private Sub Worksheet_Change(ByVal Target As Range)
   Dim MacheDatum As Boolean
   
   MacheDatum = False
   If Not Intersect(Target, Range("B1:B100")) Is Nothing Then MacheDatum = True
   If Not Intersect(Target, Range("E1:E100")) Is Nothing Then MacheDatum = True
   
   If MacheDatum Then
        If Target.Value <> "" Then
           Target.Offset(0, 2).Value = Date
        Else
           Target.Offset(0, 2).ClearContents
        End If
   End If
   
End Sub
Wieder die stupide Lösung: Kopiere diesen Code in jedes Blatt, in dem der Code wirken soll.
Grüße,
Klaus M.vdT.

Bild

Betrifft: AW: Schleifen
von: Daniel
Geschrieben am: 07.05.2015 19:27:01
Hi
damit der Code in jedem Blatt läuft, muss folgendes Makro ins Modul "DieseArbeitsmappe"

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
du hast mit Worksheet_Change die falsche Bezeichung verwendet, diese Bezeichnung für das Change-Event gilt nur in den Tabellenblattmodulen und dann läuft der Code natürlich nur, wenn im entsprechendne Blatt eine Änderung passert, dh du müsstest dann den Code in jedem Tabellenblattmodul wiederholen.
wenn der Code auch für mehre Spalten gelten soll, musst du irgendwie definerten, wie der Code erkennen soll, ob er weiter laufen soll oder nicht.
der folgende Code prüft bei einer Änderung ob in der Zeile 1 der jeweiligen Spalte der Text "Erledigt" steht und führt ihn dann aus.
Dh für Spalte E funktioniert das automatisch mit, weitere Spalten kannst du hinzunehmen, indem du "Erledigt" in sie Spaltenüberschrift schreibst (Zeile 1)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim Zelle As Range
For Each Zelle In Intersect(Target, Sh.UsedRange)
    If Zelle.Value <> "" Then
        Select Case Zelle.Offset(1 - Zelle.Row, 0).Value
            Case "Erledigt"
                Application.EnableEvents = False
                Zelle.Offset(0, 2).Value = Date
                Application.EnableEvents = True
            Case Else
        End Select
    End If
Next
End Sub
Gruß Daniel

Bild

Betrifft: AW: Schleifen
von: Karmann
Geschrieben am: 07.05.2015 23:14:25
Vielen, vielen Dank an Klaus und Daniel!
Beide Lösungen funktionieren sehr gut!

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Spinbotten oder Drehfeld"