Anzeige
Archiv - Navigation
1844to1848
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

VBA Laufzeitfehler

VBA Laufzeitfehler
16.09.2021 13:24:32
Zulu
Hallo zusammen,
ich habe glaube ich gleich mehrere Fehler in meinen Code eingebaut und bin auf eure Hilfe angewiesen da ich keine Idee habe wie ich das Makro zum laufen bekomme.
Wenn ich den Code wie abgebildet anstoße kommt es zum Laufzeitfehler 13 'Typen unverträglich'.
Dieser Fehler lässt sich durch das Löschen des Or Verbinders vermeiden. Jedoch kommt es dann zum Laufzeitfehler '-2147417848 (80010108)' Die Methode Range für das Objekt Worksheet ist fehlgeschlagen.
Könnt ihr mir sagen wo sich hier der Fehlerteufel versteckt?

Private Sub Worksheet_Change(ByVal Target As Range)
Datum = Range("H5")
If Target.Address = "$I$2" And Target.Value = "Nachtschicht" And Cells(2, 3).Value = "Frühschicht" Or "Spätschicht" Then
With Worksheets("Personalplanung")
.Range("I4").Value = "So"
.Range("J4").Value = "Mo"
.Range("K4").Value = "Di"
.Range("L4").Value = "Mi"
.Range("M4").Value = "Do"
.Range("N4").Value = "Fr"
.Range("I5").Value = DateAdd("d", 1, Datum)
.Range("J5").Value = DateAdd("d", 2, Datum)
.Range("K5").Value = DateAdd("d", 3, Datum)
.Range("L5").Value = DateAdd("d", 4, Datum)
.Range("M5").Value = DateAdd("d", 5, Datum)
.Range("N5").Value = DateAdd("d", 6, Datum)
End With
ElseIf Target.Address = "$I$2" And Target.Value = "Frühschicht" Or "Spätschicht" And Cells(2, 3).Value = "Nachtschicht" Then
With Worksheets("Personalplanung")
.Range("I4").Value = "Mo"
.Range("J4").Value = "Di"
.Range("K4").Value = "Mi"
.Range("L4").Value = "Do"
.Range("M4").Value = "Fr"
.Range("N4").Value = "Sa"
.Range("I5").Value = DateAdd("d", 3, Datum)
.Range("J5").Value = DateAdd("d", 4, Datum)
.Range("K5").Value = DateAdd("d", 5, Datum)
.Range("L5").Value = DateAdd("d", 6, Datum)
.Range("M5").Value = DateAdd("d", 7, Datum)
.Range("N5").Value = DateAdd("d", 8, Datum)
End With
Else
With Worksheets("Personalplanung")
.Range("I4").Value = "So"
.Range("J4").Value = "Mo"
.Range("K4").Value = "Di"
.Range("L4").Value = "Mi"
.Range("M4").Value = "Do"
.Range("N4").Value = "Fr"
.Range("I5").Value = DateAdd("d", 2, Datum)
.Range("J5").Value = DateAdd("d", 3, Datum)
.Range("K5").Value = DateAdd("d", 4, Datum)
.Range("L5").Value = DateAdd("d", 5, Datum)
.Range("M5").Value = DateAdd("d", 6, Datum)
.Range("N5").Value = DateAdd("d", 7, Datum)
End With
End If
End Sub

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA Laufzeitfehler
16.09.2021 13:28:13
peterk
Hallo
( Cells(2, 3).Value = "Frühschicht" Or Cells(2, 3).Value = "Spätschicht" )
Peter
AW: VBA Laufzeitfehler
16.09.2021 13:42:13
Zulu
Super. Das behebt den ersten Fehler. Danke.
Leider läuft der Code immer noch zum zweiten Laufzeitfehler.
Hast du hier auch eine Lösung?
Danke und Grüße
AW: VBA Laufzeitfehler
16.09.2021 14:01:01
peterk
Hallo
Du befindest Dich in einem Endlos Loop. Wenn Du in eine Zelle schreibst (auch per Makro) wird wieder das Change Event ausgelöst!
Daher:

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Count > 1 Then Exit Sub
Application.EnableEvents = False
Datum = Range("H5")
End If
Application.EnableEvents = True
End Sub

Anzeige
AW: VBA Laufzeitfehler
16.09.2021 14:10:42
Zulu
Danke für die Antwort.
Das Makro läuft jetzt zwar nicht mehr auf Fehler, arbeitet aber auch nicht wie gewollt. Ich befürchte durch deinen Zusatz If Target.Count größer 1 Then Exit Sub werden nicht mehr alle genannten Bedingungen berücksichtigt.
Für mein Verständnis:
Ich frage die Zelle I2 ab. Diese beschreibe ich doch nicht durch das Makro. Wo entsteht die Endlosschleife?
Grüße
AW: VBA Laufzeitfehler
16.09.2021 14:31:02
Werner
Hallo,
teste mal:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim dadaDatum As Date
dadaDatum = Range("H5")
On Error GoTo Notausgang
If Target.Address = "$I$2" Then
Application.EnableEvents = False
If Target = "Nachtschicht" Then
If Cells(2, 3) = "Frühschicht" Or Cells(2, 3) = "Spätschicht" Then
With Worksheets("Personalplanung")
.Range("I4").Value = "So"
.Range("J4").Value = "Mo"
.Range("K4").Value = "Di"
.Range("L4").Value = "Mi"
.Range("M4").Value = "Do"
.Range("N4").Value = "Fr"
.Range("I5").Value = DateAdd("d", 1, daDatum)
.Range("J5").Value = DateAdd("d", 2, daDatum)
.Range("K5").Value = DateAdd("d", 3, daDatum)
.Range("L5").Value = DateAdd("d", 4, daDatum)
.Range("M5").Value = DateAdd("d", 5, daDatum)
.Range("N5").Value = DateAdd("d", 6, daDatum)
End With
End If
ElseIf Target = "Frühschicht" Or Target = "Spätschicht" Then
If Cells(2, 3) = "Nachtschicht" Then
With Worksheets("Personalplanung")
.Range("I4").Value = "Mo"
.Range("J4").Value = "Di"
.Range("K4").Value = "Mi"
.Range("L4").Value = "Do"
.Range("M4").Value = "Fr"
.Range("N4").Value = "Sa"
.Range("I5").Value = DateAdd("d", 3, daDatum)
.Range("J5").Value = DateAdd("d", 4, daDatum)
.Range("K5").Value = DateAdd("d", 5, daDatum)
.Range("L5").Value = DateAdd("d", 6, daDatum)
.Range("M5").Value = DateAdd("d", 7, daDatum)
.Range("N5").Value = DateAdd("d", 8, daDatum)
End With
End If
Else
With Worksheets("Personalplanung")
.Range("I4").Value = "So"
.Range("J4").Value = "Mo"
.Range("K4").Value = "Di"
.Range("L4").Value = "Mi"
.Range("M4").Value = "Do"
.Range("N4").Value = "Fr"
.Range("I5").Value = DateAdd("d", 2, daDatum)
.Range("J5").Value = DateAdd("d", 3, daDatum)
.Range("K5").Value = DateAdd("d", 4, daDatum)
.Range("L5").Value = DateAdd("d", 5, daDatum)
.Range("M5").Value = DateAdd("d", 6, daDatum)
.Range("N5").Value = DateAdd("d", 7, daDatum)
End With
End If
End If
Notausgang:
On Error GoTo -1
Application.EnableEvents = True
End Sub
Gruß Werner
Anzeige
AW: VBA Laufzeitfehler
16.09.2021 14:33:54
Daniel
Hi
Endlosschleifen entstehen dann, wenn das Change-Event auf seinem eigenen Tabellenblatt eine Änderung durchführt und sich somit dann selber aufruft.
Dies kann man durch eine saubere Abfrage was geändert wurde am Anfang des Change-Events vermeiden, oder einfacher durch das pauschale Abschalten der automatischen Ausführung der Eventmakros mit Application.EnableEvents = False
bei dir dürfte aber auch so nichts in dieser Richtung passieren, da du ja alle Änderungen auf einem anderen Blatt durchführst(Personalplanung) - es sei denn, dort gibts ebenfalls ein Change-Event-Makro, dass dann lösläuft..
bedenke auch, dass der ELSE-Teil deines IFs keine weitere Abfrage hat daher bei jeder Änderung im Blatt ausgeführt wird, die nicht über die ersten beiden Bedingungen abgefangen wird.
hast du meine andere Antwort gelesen?
Gruß Daniel
Anzeige
AW: VBA Laufzeitfehler
16.09.2021 14:44:55
peterk
Hallo
Den Target.Count hab ich reingenommen damit bei Änderung mehrere Zellen kein Fehler kommt. z.B. Du markierst mehrere Zellen und drückst auf "entf". Das Event wird ausgelöst Traget ist jetzt aber ein größerer Range und somit wirft Target.value einen Fehler. Die Anweisungen in Deiner If Abfrage werden immer ALLE ausgewertet und danach entschieden ob True/False.
bzgl. Endlos Schleife gibts ja schon eine Erklärung
Peter
AW: VBA Laufzeitfehler
16.09.2021 14:24:56
Daniel
HI
welcher Fehler in welcher Zeile?
hast du die Bedingungsprüfung beim ELSE-IF nach dem gleichen Schema korrigiert?
dort hast du ja auch so ein OR drin, bei dem auch die zweite Verknüpfung vollständig geschrieben werden und das ganze in Klammern gesetzt werden muss?
also nach dem Prinzip, Wenn A gleich X oder Y sein darf, dann gilt:
FALSCH: A = X or Y
RICHTIG: A = X or A = Y
in Klammern gesetzt werden muss das ganze (A =X or A=Y), weil du das noch mit AND kombinierst, und da gelten dann gleichen Regeln wie beim normalen Rechnen auch mit + und *, dh zuerst werden die Multiplikationen durchgeführt und dann mit deren Ergebnis die Additionen.
Will man das anders haben und die Addtion soll zuerst ausgeführt werden, muss man Klammern setzen, ansonsten gilt PUNKT vor STRICH.
das gleiche Prinzip gilt auch beim Berechnen von Wahrheitswerten, hier gilt anlaog: UND vor ODER oder eben Klammersetzung.
Gruß Daniel
Anzeige
AW: VBA Laufzeitfehler
16.09.2021 15:08:27
Zulu
Hallo zusammen,
danke für die zahlreichen Antworten.
@Daniel: Ja ich habe alle Oder Bedingungen entsprechend angepasst. Danke für die Erklärung warum ich die Bedingung klammern muss!
Deine andere Nachricht verstehe ich leider nicht. Ich habe das Makro direkt in das Tabellenblatt eingefügt welches bearbeitet werden soll.
Zu deinem Hinweis "bedenke auch, dass der ELSE-Teil deines IFs keine weitere Abfrage hat daher bei jeder Änderung im Blatt ausgeführt wird, die nicht über die ersten beiden Bedingungen abgefangen wird". Das bedeutet das jede Änderung, egal wo im Tabellenblatt die Else Schleife auslöst?
Das ist natürlich nicht gewollt. Danke für den Hinweis!
@Werner: Danke für den Code. Leider läuft auch der nicht wie gewollt.
Ich habe für das bessere Verständnis mal eine Beispiel Datei mit dem Makro hochgeladen. Vielleicht ist dann mein Problem einfacher nachzuvollziehen.
https://www.herber.de/bbs/user/148111.xlsm
Danke für die Unterstützung!
Anzeige
toll...
16.09.2021 15:14:37
Werner
Hallo,
...VBA-Projekt mit Passwortschutz...
Gruß Werner
AW: VBA Laufzeitfehler
16.09.2021 15:34:45
Daniel
Ja, das bedeutet das.
btw bitte im Zusammenhang IFvon IF nie von "Schleife" sprechen.
"Schleife" ist eindeutig den Programmstrukturen FOR-NEXT, DO-LOOP und WHILE-WEND zugeordnet.
bei IF spricht man normalerweise von einem "Block"
oft ist es auch sinnvoller, statt langer Bedinungsprüfungen mit vielen AND-verknüpften Teilen hieraus mehrere ineinander verschachtelte IF-Blöcke zu machen, insbesondere dann, wenn eine Prüfung mit AND bei jedem ELSEIF vorkommt.
also bei dir

IF Target.Address = "$I$2" Then
If Target.Value = "Nachtschicht" AND (....) Then
ElseIf (Target.Value = "Spätschicht" or Target.Value = "Frühschicht" ) AND ... Then
Else
end If
hat hier mehrere Vorteile:
a) es passiert nichts, wenn irgend eine andere Zelle geändert wird
b) mit Target.Address = "$I$2" ist nur wahr, wenn genau diese eine Zelle geändert wird. Damit ist dann auch jeder Fall ausgeschlossen, wenn der Anwender mehrere Zellen gleichzeitig ändert.
Dieser macht nämlich probleme, weil dann Target.Value ein Array ist und ein kein Einzelwert.
mit einem Array sind Vergleiche mit Einzelwerten nicht zulässig (Target.Value = "Nachtschicht").
wenn du also hier diese Prüfung in ein übergeordnetes IF packst, hast du die Prüfung Target.Count = 1 schon implizit mit drin.
Gruß Daniel
Anzeige
AW: VBA Laufzeitfehler
16.09.2021 16:04:32
Zulu
Es läuft!
Danke an euch.
Gerne u. Danke für die Rückmeldung. o.w.T.
17.09.2021 17:38:15
Werner

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige