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

Target.Offset(0, -1) Konflikt

Target.Offset(0, -1) Konflikt
Angelika
Hallo
ich hab wieder mal ein Problem.
(Datei hab ich mit hochgeladen)
Beim Ausführen meines Makros kommt
laufzeitfehler 1004 usw.
beim Debuggen erscheint Target.Offset(0, -1) = "X" gelb hinterlegt
und zwar beim Code Private Sub Worksheet_Change(ByVal Target As Range)
Ich vermute dass dieser Code mit dem Code aus Private Sub Archivieren()
in Konflikt steht.Aber meine VBA Kentnisse reichen hier nicht aus.
kann sich bitte jemand die Tabelle anschauen und mir helfen?
Danke im voraus
Angelika
https://www.herber.de/bbs/user/79042.xlsm

7
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
Ereignisbehandlung ausschalten
23.02.2012 11:52:35
Erich
Hi Angelika,
eine Frage: Soll Worksheet_Change in Blatt Daten1 auch dann laufen, wenn die Änderungen nicht duch Eingabe,
sondern durch ein anderes Makro (z. B. Archivieren) vorgenommen werden?
Wenn nicht, solltest du vor den Makroaktionen auf dem Blatt die Ereignisbehandlung abschalten.
Das geht mit Application.EnableEnvents = False
Danach muss man die Ereignisbehandlung wieder einschalten mit Application.EnableEnvents = True
Archivieren() würde dann vielleicht so aussehen:

Private Sub Archivieren()
' Aus Tabelle Daten1 die zu archivierenden Datensätze in Tabelle Archiv verschieben
Dim bereich As Range, Zeilen As Object, Zähler As Long
Dim Zelle As Range, i As Long, ziel As Range, Arr As Variant
Set Zeilen = CreateObject("Scripting.Dictionary")
Set bereich = Me.Range("AA40:AA" & Me.Range("AA" & Rows.Count).End(xlUp).Row)
For Each Zelle In bereich.Cells
If LCase(Zelle.Text) = LCase("X") Then
Set Zeilen(Zähler) = Zelle.Offset(0, 11 - Zelle.Column).Resize(1, 23)
Zähler = Zähler + 1
End If
Next Zelle
If Zähler = 0 Then Exit Sub
Zähler = Zähler - 1
Set ziel = Sheets("Archiv").Range("A65536").End(xlUp).Offset(1, 0)
Application.EnableEvents = False    ' Ereignisbehandlung ausschalten
'Werte übertragen
Application.ScreenUpdating = False
For i = 0 To Zähler
Arr = Zeilen(i).Value
ziel.Resize(1, Zeilen(i).Cells.Count).Value = Arr
Set ziel = ziel.Offset(1, 0)
Next i
'Werte löschen
For i = Zähler To 0 Step -1
Zeilen(i).EntireRow.Clear
Next i
Application.EnableEvents = False    ' Ereignisbehandlung einschalten
Zeilen.RemoveAll
Set Zeilen = Nothing
Set bereich = Nothing: Set Zelle = Nothing
Set ziel = Nothing
Application.ScreenUpdating = True
End Sub
Übrigens: Option Explicit als erste Zeile in jedem Modul ist nur zu empfehlen.
Und Wörter, die schon in Excel als Namen von Funktionen usw. auftreten,
würde ich nicht als Variablennamen verwenden (z. B. Zeilen, Zelle).
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: Ereignisbehandlung ausschalten
23.02.2012 12:52:23
Angelika
Hallo Erich
vielen Dank für Deine schnelle Hilfe - es hat super funktioniert.
Ich werde auch Deine Tips in Zukunft berücksichtigen.
Vielen vielen Dank
Angelika
'Frage noch offen' nicht einschalten - und ZU
23.02.2012 12:57:08
Erich
Hi Angelika,
warum stellst du die Frage auf 'offen'? Damit ich das wieder ausschalten muss?
(nur als Tipp fürs nächste Mal)
Danke für deine Rückmeldung! - Grüße aus Kamp-Lintfort von Erich
AW: 'Frage noch offen' nicht einschalten - und ZU
23.02.2012 14:32:32
Angelika
Hallo Erich,
entschuldige ich habe verkehrt herum gedacht.
Ich habe noch eine Frage. Wenn ich das Ereignis ausschalte , dann
löscht er mir aber nicht die leeren Zellen, die durchs archivieren entstehen.
Wie könnt ich das wieder hinbekommen ?
Hast Du mir hier auch noch einen Tip
Vielen Dank im voraus
Anzeige
da war jetzt eine Zusatzfrage
23.02.2012 17:26:20
Erich
Hi Angelika,
zunächst mal sorry: Von meinen beiden neuen Codezeilen war eine falsch.
Die zweite muss lauten:

Application.EnableEvents = True    ' Ereignisbehandlung einschalten
Da stand False statt True.
Nun habe ich mit die Prozedur mal genauer angesehen - und verstehe ihren Sinn nicht.
Ist es wirklich so gewollt, dass in Sp. N bzw. T ein X eingetragen wird, wenn sich in O oder U etwas tut?
Auch dann schon, wenn in Sp. O auf einer leeren Zelle die Del-Taste gedrückt wird, wird X eingetragen.
Wenn es denn überhaupt sinnvoll ist, würde ich eher in Sp. N eine Formel schreiben,
=WENN(O40>0;"X";"") oder ähnlich. Dann verschwindet das X automatisch, wenn man in O löscht.
Das X sagt doch nichts anderes aus, als dass rechts daneben das ebenso sichtbare Datum steht, oder?
Wozu soll es gut sein, das Format leerer Zellen auf Standard zurückzustellen?
In den Spalten kann nur nichts oder ein Datum stehen. Für beide passt das Datumsformat - immer.
Hintergrund- und teileise Schriftfarbe lassen sich viel einfacher mittels bedingter Formatierung steuern.
Nun zu deiner Frage mit dem Löschen der leeren Zellen. Wo sollte das geschehen sein?
Das hat m. E. mit der Ereignisbehandlung nichts zu tun.
Ich sehe in deinem Code nirgends ein Delete, nur ein Clear. Clear löscht aber nicht, sondern reinigt Zellen.
Noch eine Bemerkung:
Du hattest jetzt eine Zusatzfrage gestellt. Um darauf aufmerksam zu machen,
hättest du nun die Frage auf 'offen' stellen können. Das hätte jetzt gut gepasst.
Und noch ein Tipp:
Im Betreff kann man kurz und knapp ausdrücken, worum es im neuen Beitrag geht.
Da sollte besser nicht "AW: letzter Betreff" stehen.
Rückmeldung wäre nett! - Grüße aus Kamp-Lintfort von Erich
Anzeige
AW: da war jetzt eine Zusatzfrage
24.02.2012 07:24:05
Angelika
Hallo Erich,
danke für Deien Antwort, Dass mit dem kleinen Fehler habe ich erkannt war nicht tragisch.
ich muss jetzt gleich weg, sobald ich wieder da bin werde ich
Dir ausführlich beschreiben was ich bezwecke.
Gruss Angelika
Zweck meiner Tabelle
24.02.2012 11:08:44
Angelika
Hallo Erich
1. ) Du hast natürlich recht - bei drücken der Del Taste sollte natürlich kein "X" eingetragen werden.
Das sind die Fehler die ich als nicht VBA Spezialist mit übernehme.
2.) Formeln wären einfacher, aber ich habe die befürchtung, dass diese doch hin und wieder versehentlich gelöscht werden könnten.Ich erstelle diese Tabelle - Anwender sind dann Personen die nicht so oft mit Excel arbeiten. Ausserdem dachte ich mir wenn ich ja die erledigten Zellen archiviere und lösche ist alles wieder im ursprünglichen Zustand.
3.) Bedingte Formatierung per VBA kam mir einfach professioneller vor.
Und nun versuche ich mal zu erklären was die Tabelle bewirken soll.
Bei unserer Projektentwicklung gibt es zwei Stadion
1.) Angebotszeichnung erstellen
2.)Bemusterung
Also in Daten1 gibt der Anwender Kundenname;Projekt;seinName, und in der Spalte Start- das aktuelle Datum ein. Wenn nun ein nächster Schritt in dem Projekt getan ist also 25 % erreicht, wird dort das aktuelle Datum eingegeben. usw.
Mein Plan - wenn das erste Datum eingegeben wird (z.B. Zelle O 40 dann soll das X in Zelle N40 automatisch eingetragen werden.
Genau das gleiche Prinzip geschieht bei Step 2 Bemusterung
Die Daten aus DATEN1 werden in Focus1 ausgewertet. Diese Tabelle brauch ich, weil ich zu jedem Stadium des Projekts, also durch Eintrag eines Datums, aus dem Datum das Quartal werden soll.
Die Archivierung der erledigten Projekte soll Quartalsmässig vorgenommen werden. Deshalb brauche ich das Tabellenblatt Focus1
Wie Du in Focus1 sehen kannst habe ich hier vorwiegend mit Formeln gearbeitet, da diese Tabelle nicht vom Anweder benutzt wird.
In Spalte AR erscheinen die "X" wenn das Projekt erledigt ist.
Und dann sollte die Zelle Focus1 "X" in Daten1 erscheinen passsende Zelle in Spalte AA. Da ich ja aus Daten1 heraus archiviere.
Ich hoffe das ist nicht zu umständlich beschrieben.
Vielleicht kannst Du mir ja nochmal helfen- wäre klasse
Danke Angelika
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige