Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1160to1164
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

Change Anweisung

Change Anweisung
Tobi
Hallo Leute,
ich habe eine grundlegende Frage.
Ich mache momentan mehr mit VB2008 als mit VBA und mir fehlt stark die Übung...
In einer Private Sub Worksheet_Change Anweisung möchte ich, dass ein Codeabschnitt nur dann durchgeführt wir, wenn eine bestimmte Zelle geändert wurde.
In VB2008 wäre das so etwas wie Range("A1")_TextChanged...
Gibt es hierfür in VBA eine einfache Lösung? Wie muss dir Struktur von meinem Code aussehen, damit ich für die Änderung unterschiedlicher Zellen voneinander unabhängige Codeabschnitte durchführen lassen kann?
Danke,
Tobias

13
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Benutzer
Anzeige
AW: Change Anweisung
21.06.2010 16:47:13
Hajo_Zi
Hallo Tobias,
Target.Address="$A$1"
Beachte die Schreibweise.

AW: Change Anweisung
21.06.2010 16:54:02
Tobi
Hallo Hajo,
das klappt nicht so ganz. Ich habe schon den Targetbereich zugewiesen...
Hier mal mein Code:
Private Sub Worksheet_Change(ByVal Target As Range)
Set Target = Application.Intersect(Target, Range("C4:D8"))
If Target Is Nothing Then Exit Sub
On Error GoTo ErrorHandler
Application.EnableEvents = False
'Avoid empty Input Boxes:
If Range("C4") = "" Or IsNumeric(Range("C4")) = False Then
Range("C4") = 0
End If
If Range("C5") = "" Or IsNumeric(Range("C5")) = False Then
Range("C5") = 0
End If
If Range("C6") = "" Or IsNumeric(Range("C6")) = False Then
Range("C6") = 0
End If
If Range("C7") = "" Or IsNumeric(Range("C7")) = False Then
Range("C7") = 0
End If
If Range("C8") = "" Or IsNumeric(Range("C8")) = False Then
Range("C8") = 0
End If
If Range("D8") = "" Or IsNumeric(Range("D8")) = False Then
Range("D8") = 0
End If
'Automatic Conversions:
Range("D8").Value = Range("C8").Value * 0.62137111
Range("C8").Value = Range("D8").Value * 1.60934421
ErrorHandler:
Application.EnableEvents = True
End Sub
Die "Auromatic Conversions" führen natürlich zu Endlosschleifen...
Was ich möchte ist einfach bei Änderung von C8 in km/h den Wert in D8 in mph eintragen und umgekehrt...
Gruß,
Tobias
Anzeige
AW: Change Anweisung
21.06.2010 17:02:10
Hajo_Zi
Hallo Tobas,
ich hätte bei Änderung der Zellen die Reaktion auf die Eingabe abgeschaltet.
Application.EnableEvents = False
das Einschalten nicht vergessen.
Gruß Hajo
AW: Change Anweisung
21.06.2010 17:09:14
Tobi
Ich weiß jetzt nich, was Du meinst.
Das habe ich doch...
Momentan wird nur die Zeile
Range("D8").Value = Range("C8").Value * 0.62137111
ausgeführt.
Die Zeile
Range("C8").Value = Range("D8").Value * 1.60934421
wird ignoriert...
Gruß,
Tobias
AW: Change Anweisung
21.06.2010 17:47:14
Hajo_Zi
Hallo Tobias,
Du veränderst den Inhalt der Zelle, Du löst damit erneut das Cange Ereignis aus. Ich hätte vermutet das möchtest Du nicht. Da Deine Eingabe durch das Change Ereignis nicht überprüft werden muss.
Ich habe Deine Datei nicht nachgebaut und ich werde das auch nicht machen.
Gruß Hajo
Anzeige
Vorschlag....
21.06.2010 17:16:13
Tino
Hallo,
vielleicht geht es so?
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngRange As Range
Const Faktor_km_h As Single = 0.62137111
Const Faktor_mph As Single = 1.60934421
Set rngRange = Application.Intersect(Range("C4:D8"), Target)
If Target Is Nothing Then Exit Sub
Application.EnableEvents = False
With Application.WorksheetFunction
For Each rngRange In rngRange
Select Case rngRange.Column
Case 3:
If IsNumeric(Cells(rngRange.Row, 3)) Or Cells(rngRange.Row, 3)  "" Then
Cells(rngRange.Row, 4) = .Round(Cells(rngRange.Row, 3) * Faktor_km_h, 2)
Else
Cells(rngRange.Row, 4) = 0
End If
Case 4:
If IsNumeric(Cells(rngRange.Row, 4)) Or Cells(rngRange.Row, 4)  "" Then
Cells(rngRange.Row, 3) = .Round(Cells(rngRange.Row, 4) * Faktor_mph, 2)
Else
Cells(rngRange.Row, 3) = 0
End If
End Select
Next rngRange
End With
Application.EnableEvents = True
End Sub
Gruß Tino
Anzeige
AW: Vorschlag....
21.06.2010 17:34:25
Tobi
Danke für den Tip Tino aber das funkst nicht. Ich will die Umrechnung nur zwischen den Zellen C8 und D8 durchführen und nicht die kompletten Spalten.
Gibt es denn keine besch... Abfrage wie: Wenn dur diese Zelle geändert hast dann mache das und ansonsten halt die Füße still...?
Dieses Worksheet_Change macht alles echt umständlich...
Gruß,
Tobias
AW: Vorschlag....
21.06.2010 17:35:19
Tobi
Habe vergessen... der Threat ist noch offen...
einfach den Range("C4:D8") anpassen oT.
21.06.2010 18:02:38
Tino
AW: einfach den Range("C4:D8") anpassen oT.
21.06.2010 18:09:43
Tobi
Ok, das habe ich verstanden aber kann ich denn innerhalb des Change Events mehrere unabhängige Ranges definieren. Schließlich soll die Umrechnung von km/h nach mph nicht das Einzige sein, was das Sheet können soll.
Die Range für die Umrechnung würde also lauten: Set rngRange = Application.Intersect(Range("C8:D8"), Target)
Wie schreibe ich es dann, wenn ich mit der Range("C4:C7") was Anderes anfangen will...?
THX
Tobias
Anzeige
in etwa so...
21.06.2010 18:21:57
Tino
Hallo,
Private Sub Worksheet_Change(ByVal Target As Range)
Dim rngRange As Range
Const Faktor_km_h As Single = 0.62137111
Const Faktor_mph As Single = 1.60934421

If Application.Intersect(Range("C4:D7,C8:D8"), Target) Is Nothing Then Exit Sub
    
    'erster Bereich ***************************************************************************** 
    Set rngRange = Application.Intersect(Range("C8:D8"), Target)
    If Not rngRange Is Nothing Then
            Application.EnableEvents = False
            With Application.WorksheetFunction
             For Each rngRange In rngRange
                Select Case rngRange.Column
                    Case 3: 'Eingabe in Spalte C 
                        If IsNumeric(Cells(rngRange.Row, 3)) Or Cells(rngRange.Row, 3) <> "" Then
                            Cells(rngRange.Row, 4) = .Round(Cells(rngRange.Row, 3) * Faktor_km_h, 2)
                        Else
                            Cells(rngRange.Row, 4) = 0
                        End If
                    Case 4: 'Eingabe in Spalte D 
                        If IsNumeric(Cells(rngRange.Row, 4)) Or Cells(rngRange.Row, 4) <> "" Then
                            Cells(rngRange.Row, 3) = .Round(Cells(rngRange.Row, 4) * Faktor_mph, 2)
                        Else
                            Cells(rngRange.Row, 3) = 0
                        End If
                End Select
             Next rngRange
            End With
            Application.EnableEvents = True
    End If
    Set rngRange = Nothing
    
    'zweiter Bereich ***************************************************************************** 
    Set rngRange = Application.Intersect(Range("C4:D7"), Target)
    
    If Not rngRange Is Nothing Then
            Application.EnableEvents = False
             'Mach was anderes 
             '... 
             '... 
            Application.EnableEvents = True
    End If
    Set rngRange = Nothing
    
End Sub
Gruß Tino
Anzeige
AW: in etwa so...
21.06.2010 18:28:44
Tobi
You are the man!
Vielen Dank! Das nenne ich 'ne fundierete Hilfe.
Sorry ich brauch halt alles vorgekaut...
Gruß,
Tobias
AW: Change Anweisung
21.06.2010 18:00:21
Tobi
Hey Leute,
ich habe hierfür noch immer keine Lösung.
Weiß denn niemend etwas?
THX

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige