Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1724to1728
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

Worksheet_Change auf zwei Zellbereichen

Worksheet_Change auf zwei Zellbereichen
19.11.2019 11:55:06
Marcel
Hallo liebe Excel-Freunde,
ich habe folgendes Problem:
Ich möchte gerne eine Excel To-Do-Liste erstellen mit mehreren Datenblättern. Die Datenblätter beeinflussen sich teilweise gegenseitig. Dies soll bei Eintragungen in bestimmten Zellbereichen geschehen.
Nun möchte ich , dass aus Tabelle1 Zellinhalte in Tabelle2 kopiert werden und zwar dann, wenn ich in einer Zelle der Spalte J etwas eintrage. Mein Code ursrpünglicher Code dazu sah folgendermassen aus:
Die Worksheet_Change in Tabelle 1:

Private Sub Worksheet_Change(ByVal Target As Range)
Wert = Target.Row
If Intersect(Target, Range("J2:J500")) Is Nothing Then Exit Sub
Call Übertragung
End Sub
und im Modul 1:

Public Wert, Reihe As Integer
Public JCItem As Integer
Public MM As String
Public Produkt As String
Public Thema As String

Die Sub im Modul 1:
Sub Übertragung()
JCItem = Tabelle1.Cells(Wert, 1).Value
MM = Tabelle1.Cells(Wert, 4).Value
Produkt = Tabelle1.Cells(Wert, 5).Value
Thema = Tabelle1.Cells(Wert, 9).Value
Tabelle2.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem
Tabelle2.Range("C1").End(xlDown).Offset(1, 0).Value = MM
Tabelle2.Range("D1").End(xlDown).Offset(1, 0).Value = Produkt
Tabelle2.Range("E1").End(xlDown).Offset(1, 0).Value = Thema
End Sub

Das haut auch bestens funktioniert.
Nun soll aber auch wenn eine Eintragung in einer Zelle der Spalte K gemacht wird Zellinhalte aus der Zeile in Tabelle 3 kopiert werden. Dazu habe ich den Code in Tabelle 1 angepasst und eine zusätzliche Sub im Modul 1 eingefügt:

Private Sub Worksheet_Change(ByVal Target As Range)
Wert = Target.Row
Spalte = Target.Column
If Spalte = 10 Then
If Intersect(Target, Range("J2:J500")) Is Nothing Then
Exit Sub
Else
Call Übertragung
End If
End If
If Spalte = 11 Then
If Intersect(Target, Range("K2:K500")) Is Nothing Then
Exit Sub
Else
Call Tooling
End If
End If
End Sub
Zweite Sub im Modul 1:
Sub Übertragung2()
JCItem = Tabelle1.Cells(Wert, 1).Value
MM = Tabelle1.Cells(Wert, 4).Value
Produkt = Tabelle1.Cells(Wert, 5).Value
Thema = Tabelle1.Cells(Wert, 9).Value
Tabelle5.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem
Tabelle5.Range("C1").End(xlDown).Offset(1, 0).Value = MM
Tabelle5.Range("D1").End(xlDown).Offset(1, 0).Value = Produkt
Tabelle5.Range("E1").End(xlDown).Offset(1, 0).Value = Thema
End Sub

Das Ganze funktioniert für die erste Sub auch weiterhin in der zweiten Sub bekomme ich in dieser Zeile:
Tabelle5.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem

folgende Meldung: "Laufzeitfehler 1004: Anwendungs- oder Objektdefinierter Fehler.
Kann mir jemand erklären warum?

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 12:42:03
Piet
Hallo Marcel
ich habe nur eine Vermutung, und zwar bei diesem Teil. Wenn Zelle A1 "leer" ist geht das schief!!
Tabelle5.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem
xlDown steht in der letzten Zeile, und Offset(1,0) will eine Zeile über das Blatt hinausschieben!! Ist das Blatt LEER?
Probier es bitte mal mit - Tabelle5.Cells(Rows.Count,1).End(xlup).Offset(1, 0).Value = JCItem>
mfg Piet
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 17:18:05
onur
Wo ist denn die 2. Sub?
Du hast 2x die Erste gepostet.
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 17:26:38
Marcel
Hallo Piet,
erst mal vielen Dank, das funktioniert. Allerdings verstehe ich das noch nicht ganz, denn die Zellen A1-J1 sind mit Überschrifften befüllt, also nicht leer.
Die erste

Sub ist weiter oben im Beitrag. Die heißt  

Sub Übertragung() und unterscheidet sich nur durch die Tabelle, die damit beschrieben wir. Da  _
ist es dann Tabelle2. Hier ist sie nochmal:

Sub Übertragung()
Reihe = Wert
JCItem = Tabelle1.Cells(Reihe, 1).Value
MM = Tabelle1.Cells(Reihe, 4).Value
Produkt = Tabelle1.Cells(Reihe, 5).Value
Thema = Tabelle1.Cells(Reihe, 9).Value
Tabelle2.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem
Tabelle2.Range("C1").End(xlDown).Offset(1, 0).Value = MM
Tabelle2.Range("D1").End(xlDown).Offset(1, 0).Value = Produkt
Tabelle2.Range("E1").End(xlDown).Offset(1, 0).Value = Thema
End Sub
wie gesagt hier funktioniert auch alles. Einziger Unterschied ist, dass hier die Spalten 2 und 3 vorher schon händisch befüllt waren.
Schönen Gruß
Marcel
Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 17:42:26
Piet
Hallo Marcel
freut mich das du sagst es klappt, ich sehe aber immer noch den alten Code mit Range("A1").xlDown
Um Vba zu verstehen mache bitte folgen Versuch mit dem kleinen Test Makro, und schau bitte selbst wo der Cursor stehen bleibt. Dann verstehst du es sofort! Befülle die Zelle A2 mit "xxx" und starte das Test Makro. Dann lösche Zelle A2 und starte das Test Makro. Dann siehst du selbst was passiert!
Wenn du mit xlUp von der letzten Zelle nach oben suchst passiert der Effekt nicht. Einfach anschauen.
mfg Piet
Sub LastZell_Test()
Range("A1").End(xlDown).Select
End Sub
Sub LastZell_Test_2()
Cells(Rows.Count, 1).End(xlUp).Select
End Sub

Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 18:06:02
Marcel
Naja die Sub die ich gerade gepostet habe hatte ja auch kein Problem, deswegen habe ich diese nicht gleich geändert. Ich teste gleich mal ein bisschen herum und sage dann nochmal bescheid...
Danke und schönen Gruß,
Marcel
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 19:18:41
Piet
Hallo Marcel
dein Code laeuft ja völlig normal wenn in Zelle A2 ein Wert drin steht. Nur wenn sie leer ist geht es schief!
Noch ein Hinweis zu xlDown und xlUp
Wenn in Spalte A Leerstellen vorkommen, das mitten drin -eine Zelle leer- ist, gibt es einen Fehler! Dann kopiert er nicht in die letzte Zeile, sondern irgenwo mitten drin in der Tabelle. Sıchst du von unten mit xlUP kann der Effekt NICHT passieren. Das sind so böse VBA Feinheiten über die man als Anfaenger gerne stolpert, und wundert sich das Daten weg sind, oder an falscher Stelle überschrieben wurden!
Das ist mir auch oft genug passiert. Nehme deshalb lieber xlUP.
Mfg Piet
Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
19.11.2019 22:27:02
Marcel
Hey Piet,
stimmt darüber habe ich gar nicht nachgedacht! Vielen Dank!!!!
Das Programmieren an und für sich ist mir nicht allzu fremd. VBA allerdings schon. Ich habe leider immer nur leichte in verschiedenen Sprachen gemacht.
Ich habe dadurch halt immer Schwierigkeiten bei Objektfunktionen oder anderen integrierten Funktionen. Aber ich lerne gerne dazu und habe Spaß daran.
Du hast ja vorher geschrieben:
......ich habe nur eine Vermutung, und zwar bei diesem Teil. Wenn Zelle A1 "leer" ist geht das schief!!
Tabelle5.Range("A1").End(xlDown).Offset(1, 0).Value = JCItem xlDown steht in der letzten Zeile, und Offset(1,0) will eine Zeile über das Blatt hinausschieben!! Ist das Blatt LEER?......
Nur um sicher zu gehen, dass heisst also, dass Offset(1,0) eine weitere Zeile nach unten erzeugt werden soll? Wenn ja verstehe ich jetzt nämlich nicht mehr, wie mein Code bisher funktioniert.
Durch das kleine Test Makro sieht man ja, dass man mit xlDown in die aller letzte Zeile springt. Mit Offset(1,0) springe ich noch einen runter.
Warum funktioniert mein Code denn eigentlich, warum lande ich in Zelle A3 wenn in A2 was steht? Ich komme da noch nicht ganz hinter.
Ich hoffe es ist verstänlich ;-)
Vielen Dank an dich!
Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
20.11.2019 13:17:18
Piet
Hallo Marcel
wenn du VBA lernen willst gebe ich dir ein kleines Programm zum spielen. Das kannst du beliebig erweitern! Wenn du auf dem Bildschirm optisch siehst was passiert praegt sich dir VBA und die Unterschiede zwischen Cells und Offset sofort ins Gedaechnis ein. Man sieht ja was passiert.
ZU LastZell: - Werner u.a. programmieren über .Offset(1,0).Row
Ich programmiere es so: Cells(Rows.Count).End(xlUp).Row +1
Beides führt zum Ziel, nur eine Frage der Schreibweise!
Und ja, Offset(1,0) wird immer die Zelle anwaehlen hinter LastZell. Bist du am Blattende geht das schief!! Aber eben nur in diesem einen Sonderfall, sonst klappt es ja. Man beachte die VBA Regeln!
Noch ein Hinweis:
willst du Zeilen ganz löschen muss dcie For Next Schleife RÜCKWAERTS laufen, geht sonst auch schief!! z.B. For j = LastZell to 2 Step -1. Step-1 heisst rückwaerts zaehlen! Bei Vorwaerts Löschen kommt der Zeilenzaehler durcheinander, weil du gerade die aktive Zeile weglöschst! Beachten auch viele nicht!
mfg Piet
Sub VBA_Grundkurs()
'Kleine Offset und Cells Übung über Msgbox
'Cells:  steuert direkt die Zelle an, die in () definiert ist!
'Dabei gilt:  (z,s) z=Zeile nach unten, s=Spalte nach rechts
'bei - Zahl:  (z,s) z=Zeile nach oben, s=Spalte nach links
For j = 6 To 10
Cells(j, 1).Select
MsgBox ActiveCell.Address
Next j
For j = 6 To 10
Cells(1, j).Select
MsgBox ActiveCell.Address
Next j
'Offset:  verschiebt die Zelle, die Range angegeben wurde!
'Dabei gilt:  (z,s) wie oben bei Cells!!
'wichtiger Unterschied zwischen Cells und Offset, wird oft NICHT verstanden!
'Bei Cells(1,1) ist A1 gemeint!! 1.Zeile, 1.Spalte
'**  Cells(0,0) für A1 geht in die Hose, Rückwaertssprung!!
'Bei Offset(1,1) verschiebt sich Zelle Diagonal
'Bei Offset(0,0) bleibt die Zelle auf Range stehen!!
'Diesen Unterschied zwischen Cells und Offset kapieren viele NICHT
For j = 6 To 10
Range("D4").Offset(j, 0).Select
MsgBox ActiveCell.Address
Next j
For j = 6 To 10
Range("D4").Offset(0, j).Select
MsgBox ActiveCell.Address
Next j
For j = 6 To 10
Range("D4").Offset(j, j).Select
MsgBox ActiveCell.Address
Next j
End Sub

Anzeige
AW: Worksheet_Change auf zwei Zellbereichen
21.11.2019 09:42:23
Hajo_Zi
lasse den Fragesteller entscheiden ob offen.
Es ist heute nicht mehr üblich eine Rückmeldung zu geben und so ist der Beitrag über 6 Tage offen.
Das ist nur meine Meinung zu dem Thema.

AW: Worksheet_Change auf zwei Zellbereichen
21.11.2019 16:19:45
Marcel
Hallo an Alle,
vielen Dank für die guten Hinweise und Tipps, speziell an Piet!
Auch das mit dem Löschen der Zelle ist echt interessant. Hatte bisher eine MSGBOX die mir sagt ob ein Wert in Tabelle schon vorhanden ist, wenn ich in Tabelle1 in der entsprechenden Zeile was ändere, sonst würde mir das Makro ja alles nochmal kopieren. Jetzt bekomme ich es bestimmt auch hin das mir die entsprechende Zeile gelöscht wird anstatt die MSGBOX anzuzeigen.
Ich schliesse den Thread hiermit erstmal ab.
Schönen Gruß Marcel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige