Live-Forum - Die aktuellen Beiträge
Datum
Titel
24.04.2024 19:29:30
24.04.2024 18:49:56
Anzeige
Archiv - Navigation
1904to1908
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

VBA Hilfe

VBA Hilfe
24.10.2022 18:11:43
Charly
Hi
Ich hab mir was zusammen geschraubt, funktioniert auch.
Ich denke aber das man das anders macht.

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B2:B30")) Is Nothing Then
If Target = Application.Unichar(10062) Then
Target = Application.Unichar(9989)
Else
Target = Application.Unichar(10062)
End If
Cancel = True
End If
End Sub
Ich hoffe ihr könnt mir helfen.
Gruß Charly

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

Betreff
Datum
Anwender
Anzeige
AW: VBA Hilfe
24.10.2022 19:04:41
onur
Wozu ist das denn gut?
AW: VBA Hilfe
24.10.2022 19:22:21
Charly
Kann man dann auswerten.
AW: VBA Hilfe
24.10.2022 19:05:52
Yal
Hallo Charly,
irgendwie ist heute ein komischer Tag, mit komisch formulierten Fragen... (nichts gegen Dich, ich stelle nur fest :-)
Also es funktioniert. Aber was sollte dann anders sein? Was würdest Du erwarten? Dass der Code leichter/logischer aussieht? Ich kann es nicht eindeutig aus der Frage entnehmen.
Es gibt an deinem Code nichts zu beanstanden oder zu verbessern.
Es würde eventuell kürzer sein, wenn Du den ternären Operator iif() verwendest:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B2:B30")) Is Nothing Then
Target = IIf(Target = Application.Unichar(10062), Application.Unichar(9989), Application.Unichar(10062))
Cancel = True
End If
End Sub
Hat aber keine wesentliche Mehrwert und sollte nur bevorzügt werden, wenn Test, True- und False-Einträge kurz sind:

Outfit = IIf(booEsRegnet, "Regenjacke", "Sandalen")
Sonst ist die Lesbarkeit beeinträchtigt: man muss mühsam die Kommas suchen, die die logische Struktur ausmacht. Der If-Then-Else bringt, mit passendem Einrücken, diese Struktur sofort mit.
VG
Yal
Anzeige
AW: VBA Hilfe
24.10.2022 19:18:14
Charly
Hi Yal
Vielen Dank für deinen Vorschlag, ist schon mal kürzer.
Ich dachte man kann z.B. Application.Unichar(10062) anders schreiben.
Gruß Charly
AW: VBA Hilfe
24.10.2022 21:17:03
GerdL
Moin

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel = Not Intersect(Target, Range("B2:B30")) Is Nothing
'Target = ChrW(10062) 'Initialisierung
If Cancel Then Target = IIf(Target = ChrW(10062), ChrW(9989), ChrW(10062))
End Sub
Gruß Gerd
AW: VBA Hilfe
25.10.2022 01:37:08
Charly
Hi Gerd
Kurz und knackig.
ChrW(... hatte ich gesucht.
Vielen Dank.
Noch ne kurze Nachfrage.
Wie schreibe ich das, wenn ich noch ein drittes Zeichen ChrW(63) einbauen möchte?
Gruß Charly
Anzeige
AW: VBA Hilfe
25.10.2022 07:04:49
GerdL
Moin Charly,
bei drei Optionen würde ich Select Case verwenden.
Gruß Gerd
AW: VBA Hilfe
25.10.2022 07:32:45
Charly
Moin Gerd
Danke
Ich versuch es mal.
Gruß Charly
AW: VBA Hilfe
27.10.2022 14:32:16
Charly
Hi
Brauche nochmal Nachhilfe.
Mit Select Case bekomme ich das mit meinen bescheidenen Kenntnissen nicht hin.
Hab ich es erst mal so gelöst.
Kann mir bitte jemand aufzeigen wie man das mit Select Case macht.

Option Explicit
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B2:B15")) Is Nothing Then
If Target = "" Then
Target = ChrW(11036)
Cancel = True
Else
If Target = ChrW(11036) Then
Target = ChrW(9989)
Cancel = True
Else
If Target = ChrW(9989) Then
Target = ChrW(10062)
Cancel = True
Else
If Target = ChrW(10062) Then
Target = ChrW(63)
Cancel = True
Else
If Target = ChrW(63) Then
Target = ""
Cancel = True
End If
End If
End If
End If
End If
End If
End Sub
Danke vorab
Gruß Charly
Anzeige
Offen vergessen
27.10.2022 14:47:59
Charly
AW: Offen vergessen
27.10.2022 14:50:07
GerdL
Moin Charly

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("B2:B15")) Is Nothing Then
Application.EnableEvents = False
Select Case Target.Value
Case "": Target = ChrW(11036)
Case ChrW(11036): Target = ChrW(9989)
Case ChrW(9989): Target = ChrW(10062)
Case ChrW(10062): Target = ChrW(63)
Case ChrW(63): Target = ""
End Select
Application.EnableEvents = True
End If
End Sub
Gruß Gerd
Danke
27.10.2022 14:56:38
Charly
Moin Gerd
Vielen Dank, wieder was gelernt.
Gruß Charly
ElseIf
27.10.2022 16:29:41
Yal
Hallo Charly,
ich erlaube mir, die bereit vollständig geantworte Frage noch eine Ergänzung hinzufügen, da ich gesehen habe, dass es dir darum geht, zu verstehen.
Deine verketteten IFs waren gut. In dem Fall wären "ElseIf" leichter:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim AktVal
If Not Intersect(Target, Range("B2:B15")) Is Nothing Then
AktVal = Target.Value
If Target = "" Then
Target = ChrW(11036)
ElseIf Target = ChrW(11036) Then
Target = ChrW(9989)
ElseIf Target = ChrW(9989) Then
Target = ChrW(10062)
ElseIf Target = ChrW(10062) Then
Target = ChrW(63)
ElseIf Target = ChrW(63) Then
Target = ""
End If
Cancel = (Target.Value  AktVal) 'nur wenn sich was geändert hat
End If
End Sub

Cancel wird nur auf True gesetzt, wenn sich was ändert. Dann kann man die originale Wert mit der Wert danach vergleichen und Cancel so setzen.
Aber da überall gegen "Target" geprüft wird, ist die Variante "Select Case" zu bevorzügen.
Der "If-ElseIf-Else-End If" ist dann zu nehmen, wenn das, wogegen es geprüft wird, sich ändert:

If Spalte(..) = xx Then
ElseIf Zeile(..) = yy Then
Else
End If
Wobei man den Select Case auch vergewältigen kann (bitte nicht übernehmen. Nur zum Zeigen, dass es gehen würde):

Select Case True
Case A > B: ..
Case X = Y: ..
Case C 
VG
Yal
Anzeige
AW: VBA Hilfe
27.10.2022 16:56:50
Daniel
Hi
wenn du per Klick eine vorgegebene Liste von Werten durchtickern willst, dann geht elegant so:

Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Dim x
Dim y
x = Array("", ChrW(11036), ChrW(9989), ChrW(10062), ChrW(63))
If Not Intersect(Target, Range("B2:B15")) Is Nothing Then
Cancel = True
y = Application.Match("~" & Target.Text, x, 0)
If IsNumeric(y) Then
y = y Mod (UBound(x) + 1)
Target = x(y)
End If
End If
End Sub
zur erläuterung:
das "~" & in der Match-Funktion braucht man normalerweise nicht. Es ist hier nur wegen dem Zeichen 63 erforderlich, welches das ? ist, welches in der Match-Funktion als Joker für ein Zeichen dient, was hier aber nicht erwünscht ist. das "~" macht aus Jokerzeichen normale Zeichen und stört bei normalen Zeichen nicht.
Falls hier jemand das Hochzählen vermisst: das passiert hier implizit, da das Array mit dem Index 0 beginnt, die Match-Funktion aber die Position im Array ausgibt, unabhängig vom Index, dh das erste Zeichen mit dem Index 0 hat die Position 1.
Gruß Daniel
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige