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

Programm geschrieben (alter Code stört)

Programm geschrieben (alter Code stört)
10.07.2014 10:26:56
Dennis Steffen

Habe für einen Kollegen ein Programm geschrieben. Das Problem ist nun das er vorher als Change Bedienung einen Befehl drin hat denn ich nicht ganz verstehe(und mein Programm Stört). :/ Der Code hat seinen Sinn deswegen möchte ich ihn gerne drin lassen. Hier der Code:

Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A7:A100")) Is Nothing Then Exit Sub
If Target.Value <> "" Then
Target.Offset(0, 8).Value = Date
Else
Target.Offset(0, 8).ClearContents
End If
End Sub
Ich denke der Code Funktioniert so. Er Speichert in der Variable "Target" die Range A7;A100 und guck nun dann ob sie leer sind wenn ja soll er das Sub Verlassen. Ist das gebiet 0,8 nicht "ungleich" Leer soll es in die Zelle 0,8 bzw "Offset"? Das Datum reinschreiben. Ist Target 0,8 leer? Löscht es die Komplette Zeile?...
So das Programm erzeugt immer wenn man in Spalte A in eine neue Zeile schreibt an der stelle 8/bzw. H das Datum.
Das Problem ist aber das der Debugger anspringt wenn man Zeilen per Rechtsklick Zeilen Löschen rauslöscht. Und da das wiederum unschön ist wäre hilfe wirklich schön :)
mfg Dennis

14
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Programm geschrieben (alter Code stört)
10.07.2014 10:34:16
Hajo_Zi
Hallo Dennis,
Benutze in Deinen Programm eine Variable z.B BoProgramm setze die zu Beginn auf True am Ende auf False. Definiere Sie in einem Modul Public BoProgramm as Boolean.
Im Change If BoPragramm =False Then End if vor End Sub nicht vergessen.

AW: Target and Basics
10.07.2014 10:37:56
Gerd L
Hallo Dennis,
stelle mal eine einschränkende Bedingung, z.B.
If Target.Count > 1 Then Exit Sub
voran.
P.S.: Ansonsten ist aller Laster Anfang schwierig. Du kannst dir einzelne Befehle übersetzen oder dazu in der VBA-Hilfe nachlesen.
Gruß Gerd

Anzeige
AW: Target and Basics
10.07.2014 10:44:08
Hajo_Zi
Hallo Gerd,
das führt zu einem Fehler falls alle Zellen.
für alle Versionen
Public Sub Beispiel()
Dim dblCount As Double
dblCount = CallByName(Selection, IIf(Val( _
Application.Version) > 11, "CountLarge", "Count"), VbGet)
MsgBox dblCount
End Sub

‘ von Nepumuk

AW: Target and Basics
11.07.2014 01:47:04
Ewald
Hallo Denis,
Target ist keine Variable,sondern je nachdem wie eine Eingabe beendet wird entweder die letzte oder die aktive Zelle.
Im Normalfall ist es die Zelle die du gerade verlassen hast,wird die Eingabe aber oben mit dem grünen Häckchen neben der Eingabeleiste bendet,kann es auch die aktive Zelle sein.
Target ist immer nur eine Zelle,bei Zeile löschen wo ja mehrere Zellen nacheinander berechnet werden,gibt es dann deinen Fehler.
Hier mußt du dann wie von Gerd erwähnt,aus der Sub aussteigen.
If Target.Count >1 Then Exit Sub
zu deinem Code
in der ersten Zeile wird geprüft,ob sich Target im Bereich A7:A100 befindet,falls nicht wird die Sub verlassen.
Target.Offset(Zeile,Spalte)bedeutet nichts anderes als springe von Target aus nach Zeile(hoch/runter),Spalte(links/rechts)und mach was.
offset(0,8)= gleiche Zeile,8 Spalten nach rechts.
Hajo deinen Einwand kann ich nicht bestätigen.
in der Tabelle folgenden Code
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column > 1 Then Exit Sub
If Target.Count > 1 Then Exit Sub
If Target.Value <> "" Then Target.Offset(0, 2).Value = Date
End Sub
dann dein Beispiel ausgeführt, egal ob eine Zelle oder ganze Tabelle markiert, kein Fehler
Gruß Ewald

Anzeige
Target ...
11.07.2014 07:25:21
Matthias L
Hallo
Deine Erklärung ist falsch!
Target ist weder die letzte- noch die aktive Zelle.
Target ist die, das Change-Ereignis auslösende Zelle
https://www.herber.de/bbs/user/91466.xlsm
Gruß Matthias

AW: aber hallo.
11.07.2014 09:10:51
Ewald
und welche Zelle löst bei manueller Eingabe das Change-Ereignis aus. wohl doch die Zelle die du gerade geändert hast.
Gruß Ewald

AW: aber hallo.
11.07.2014 09:53:15
Nepumuk
Hallo Ewald,
If Target.Count > 1 Then Exit Sub

Ist doch ganz großer Mist. Ich brauch nur zwei Zellen gleichzeitig ändern und die zweite Zelle wieder löschen, schon hab ich eine "nicht protokollierte" Änderung in der Tabelle.
Target ist eine Variable die kann nämlich jede Zelle in der Tabelle beinhalten und ist änderbar. Sprich ich kann dieser Variablen jede andere Zelle in jeder anderen Tabelle aus jeder geöffneten Mappe zuweisen. Auch den Namen der Variablen kannst du völlig problemlos ändern.
Gruß
Nepumuk

Anzeige
AW: aber hallo.
11.07.2014 11:59:20
Ewald
Hallo,
wir reden hier von Target in Bezug einer manuellen Änderung einer Zelle, also Auslösung des Change-Ereignisses.
Dazu vielleicht diese Erklärung von Pearson

Within the Worksheet_Change procedure, you can add any code that you want to take place when a cell value is changed. This event is raised automatically by Excel when a cell's value is changed either by user input or by other VBA code. It is not raised if the value of the cell is changed by a formula calculation in that cell. The Target parameter is a Range type object referring to the cell(s) that were changed. To use other events of the worksheet, select the event in the right hand dropdown at the top of the code pane. When you change this setting, VBA will insert the procedure shell in the code module for you, ensuring that the procedure is properly declared. Under no circumstances should you change anything in the Sub statement created by VBA. Doing so may cause the event not to work.

Dieses Makro zeigt das Target.Value nur eine Zelle kann
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
MsgBox Target.Address
MsgBox Target.Value
End Sub
Gruß Ewald

Anzeige
AW: aber hallo.
11.07.2014 12:57:50
Nepumuk
Hallo,
1. Ging es hier um das Change-Event und nicht das SelectionChange-Event.
2. Natürlich gibt auch das SelectionChange-Event einen Bereich zurück wenn ich einen Bereich markieren und in dem Fall erzeugt der Zugriff auf die Value-Eigenschaft einen Fehler, denn das ist ja ein Array und kein Einzelwert. Klick doch einfach mal in den Spaltenkopf von Spalte A deine 2. Prorammzeile löst den Fehler 13 aus weil es ein Array ist.
3. Genau das selbe hast du im Change-Event. Spalte A markieren - x eingeben - CTRL+Enter drücken.
Gruß
Nepumuk

AW: aber hallo.
14.07.2014 23:57:32
Ewald
Hallo,
hätte auch das Change-Ereignis nehmen können,nur ändern tut sich ja nichts.
Sobald Value ins Spiel kommt,bezieht sich Target auf die geänderte Zelle und dies kann je nach Vorgehensweise die aktive Zelle oder die zuletzt aktive Zelle sein.
Auch ist es möglich,wenn ich dein Beispiel auf Spalte A nehme,auch bei Value keinen Fehler zu bekommen.indem man einfach eine Schleife auf Target legt.
Private Sub Worksheet_Change(ByVal Target As Range)
For Each Target In Target
If Target.Value = "x" Then
Target.Interior.ColorIndex = 3
Else
Target.Interior.ColorIndex = xlNone
End If
Next
End Sub
Nachteil ist halt nur,ist kein Value im Spiel,ist das Durchlaufen der einzelnen Zellen unnötig.
Auf der anderen Seite kann aber das Aussteigen falls Target.Count > 1 oder eine Fehlerbehandlung entfallen.
Was dann verwendet wird,hängt doch davon ab,was gemacht wird.
ändere ich nur immer eine Zelle,reicht das Aussteigen mit Target.Count >1
werden mehrere Zellen geändert die Schleife über Target.
ist Value nicht im Spiel brauch ich garnichts zu berücksichtigen.
Gruß Ewald

Anzeige
AW: aber hallo.
15.07.2014 00:49:22
Nepumuk
Hallo,
mir ist noch nie ein Change-Event untergekommen in dem die Value-Eigenschaft nicht abgefragt wurde. Die Änderungen eines Bereichs zu überwachen, ohne die geänderten Werte abzufragen ergibt keinen Sinn. Zumindest fällt mir kein vernünftiger ein. Oder hast du eine Idee was ein Programm immer machen soll egal was der Benutzer eingibt oder löscht?
Gruß
Nepumuk

AW: aber hallo.
15.07.2014 23:06:57
Ewald
Hallo,
ob alles sinnvoll oder vernünftig ist, was mit Excel gemacht werden kann,datüber läßt sich wunderbar streiten, nur wird dies ja manchmal trotzdem gewünscht.
ein Beispiel dafür habe ich auch
eine ständig wachsende Tabelle mit vielen Spalten, in Spalte A wird der Status geändert, 5 Möglichkeiten.
Der Status darf aber nur einmal pro Woche geändert werden,eine Datumsspalte ist nicht gewünscht,weil viel zuweit rechts und deshalb schlecht zu erreichen.
Ergebnis war dann das bei Änderung in Spalte A die Zeile in einer Farbe die in Zelle P1 steht gefärbt wird. Die Farbe wechselt jeden Wochentag. Am Montag werden beim öffnen der Datei alle Zeilen wieder auf xlnone gesetzt und das Spiel geht dann von vorne los.
Es kam also nicht darauf an,wie geändert wurde, sondern das geändert wurde und es optisch sichtbar ist.
dies wurde dann einfach so gehändelt
Farbe = Range("P1").Value
If Target.Column = 1 Then
Target.EntireRow.Interior.ColorIndex = Farbe
End If
Gruß Ewald

Anzeige
entweder die letzte oder die aktive Zelle
11.07.2014 10:11:53
Rudi Maintaire
Hallo,
Quatsch.
Target beinhaltet den betroffenen (geänderten) Bereich.
Ändere mal mehrere Zellen gleichzeitig:
Private Sub Worksheet_Change(ByVal Target As Range)
MsgBox Target.Address
End Sub
Gruß
Rudi

AW: Programm geschrieben (alter Code stört)
10.07.2014 10:42:39
Rudi Maintaire
Hallo,
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("A7:A100")) Is Nothing Then
If Target.Count = 1 Then
On Error GoTo ERREXIT
Application.EnableEvents = False
If Target <> "" Then
Target.Offset(0, 7) = Date
Else
Target.Offset(0, 7).ClearContents
End If
End If
End If
ERREXIT:
Application.EnableEvents = True
End Sub

Gruß
Rudi

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige