Inhalt einer Zelle in Abhängigkeit vorgeben
Hallo,
wie kann ich erreichen, dass nach Eingabe eines Wertes in Zelle A1 in Zelle A2 automatisch ein bestimmter Wert vorgegeben wird (Beispiel: Inhalt Zelle A1 = 1 oder 2, dann A2 = "W" ansonsten A2 = "T")? Der Wert in Zelle A2 soll nachträglich noch änderbar sein.
Eine =WENN Abfrage in Zelle A2 bringt zwar das gewünschte Ergebnis, da ich die Zelle aber nicht schützen kann, überschreibt eine manuelle Korrektur die WENN-Abfrage. Welche anderen Möglichkeiten gibt es für dieses Problem?
Danke im voraus für die Hilfe
Ullrich M.
Antwort schreiben
Antwort 1 von meinTipp vom 18.06.2019, 14:47 Options
Hallo Ullrich,
für ein Tabellenblatt markierst du unten den Reiter mit der rechten Maustaste --> Code anzeigen.
Dort folgende Routine eintragen
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Spalte As Integer
Spalte = Target.Column
If Spalte <> 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Select Case Target.Value
Case 1, 2
Cells(Target.Row, Spalte + 1).Value = "W"
Case 3
Cells(Target.Row, Spalte + 1).Value = "X"
Case Else
Cells(Target.Row, Spalte + 1).Value = "T"
End Select
End Sub
Wenn es für alle Tabellenblätter in der Arbeitmappe gelten soll, so erstelle folgende Routine in "Diese Arbeitsmappe" (gleicher Inhalt)
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Gruß Rolf
Antwort 2 von nighty vom 18.06.2019, 14:58 Options
hi all :-)
bitte zum anfang
Application.EnableEvents = False
und zum ende
Application.EnableEvents = True
es kommt ansonsten zu einen zirkelbezug
gruss nighty
Antwort 3 von meinTipp vom 18.06.2019, 15:10 Options
Hallo nighty,
im Allgemeinen hast du natürlich Recht.
Der Event der hier durch z.B.
Cells(Target.Row, Spalte + 1).Value = "W"
ausgelöst wird hat aber keinen Zirkelbezug zur Folge, da er durch
If Spalte <> 1 Then Exit Sub
abgefangen wird.
Antwort 4 von nighty vom 18.06.2019, 15:24 Options
hi all :-)
der zirkelbezug ist vorhanden und das modul wird bei einem aufruf dreimal durchlaufen
gruss nighty
leicht zu kontrollieren indem du folgendes machen koentest
einzufuegen in ein allgemeines modul
Public zaehler As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
rem hier die globale var die um eins addiert wird bei jedem aufruf
zaehler = zaehler + 1
Dim Spalte As Integer
Spalte = Target.Column
If Spalte <> 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Select Case Target.Value
Case 1, 2
Cells(Target.Row, Spalte + 1).Value = "W"
Case 3
Cells(Target.Row, Spalte + 1).Value = "X"
Case Else
Cells(Target.Row, Spalte + 1).Value = "T"
End Select
End Sub
rem hier ein kleines makro um die globale var anschliessend abzufragen
Sub test()
Cells(1, 5) = zaehler
End Sub
Antwort 5 von meinTipp vom 18.06.2019, 15:55 Options
Das streite ich ja in keiner Weise ab.
Die 3. Ausführung entsteht natürlich durch Ausführen des Testmacros (Änderung in Spalte 5) selber.
Sub Worksheet_Change(ByVal Target As Range) wird natürlich bei jeder Änderung in dem Arbeitsblatt ausgeführt.
Dabei bleibt abzuwägen, ob ein zusätzlicher Durchlauf durch die Änderung im Macro selber durch die einmalige Beendigung durch ein "exit sub" oder bei jedem Durchlauf (bei jeder Zelle im Arbeitsblatt) das Kommandopaar
Application.EnableEvents = False
Application.EnableEvents = True
ausgeführt wird.
Ich finde das ist Ansichtssache. Vom Gefühl her ist das Ein - und Ausschalten des Eventhandlers bei jeder Aktion auf dem Arbeitsblatt Zeitaufwendiger.
Antwort 6 von ullrichm vom 19.06.2019, 10:08 Options
Hallo Rolf,
zunächst einmal Danke für Deinen Vorschlag zur Lösung meines Problems. Ich habe vergessen zu sagen, dass das Arbeitsblatt Überschriften enthält.
Bei Deiner Lösung gehst Du davon aus, dass, die Spalte A nur Daten enthält, korrekt? Die Daten beginnen erst ab Zeile 5.
Ich habe mit VBA keinerlei Erfahrung und kann deshalb nur ungefähr nachvollziehen,
was der Code bewirkt.
Wodurch wird der VBA-Code zur Ausführung gebracht? Entschuldige bitte die Frage,
wie gesagt, VBA ist für mich Neuland!
Gruss
Ullrich