Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang

Forumthread: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
20.02.2025 15:59:26
Dieter
Hey all,
Ich habe mir eine UF Combobox für nur in gewissen Spalten und Zellen gebastelt.
Dieser Code unten funktioniert auch.
Erst einmal 2 Fragen dazu, Ist der Code gut so oder gibt es was besseres ?
Private Sub UserForm_Initialize()     'geht

'Dim rng As Range ' geht auch
' Set rng = Range("Kalender!AB4:AB8")
'ComboBox1.List = rng.Value
'---------------------------------------------------
Dim lngUntersterEintrag As Long ' der ist aktiv
lngUntersterEintrag = Range("AB65536").End(xlUp).Row
Me.ComboBox1.List = Range("AB4:AB" & lngUntersterEintrag).Value
End Sub
'-------------------------------------------------------
Private Sub ComboBox1_Change() 'geht
Dim rngZelle As Range
For Each rngZelle In Selection
rngZelle.Value = Me.ComboBox1.Value
Next rngZelle
Unload Me
End Sub

Private Sub Worksheet_SelectionChange(ByVal Target As Range)    'Userform Combobox anzeigen

'If Target.Column = 3 And Target.Row > 1 Then
If Target.Row > 2 And Target.Row = 33 Or Target.Row > 36 And Target.Row = 67 Then
Select Case Target.Column
Case 3, 7, 11, 15, 19, 23 'spalten ansprechen
If Target(1).Offset(0, -2).Value Then
With UserForm1
.StartUpPosition = 0
.Left = Target(1).Left
.Top = Target(1).Top - ActiveWindow.VisibleRange.Top
Call .ComboBox1.DropDown
Call .Show(vbModeless)
End With
UserForm1.Hide
End If
End Select
End If
End Sub

Jetzt würde ich aber gerne das ganze in eine DoubleClick machen,
da jedes mal wenn ich in die Zelle gehe er mir die Combobox aufmacht.
und da ist mein Problem.
Wenn ich jetzt Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ändere in Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
und den Code darunter setzte geht es leider nicht mehr.
Wo ist mein Fehler, oder wie muss der Code geändert werden ?
Ich danke schon mal allen für die Hilfe im Voraus.
Mfg
Dieter
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
20.02.2025 18:40:32
Yal
Hallo Dieter,

im Prinzip alles richtig.
Beim Range-Auswahl eine Kurzform genommen (nur ein Vorschlag. Nehme, womit Du dich "zuhause" füllst)
Beim Rückschreiben eine Event-Blocker reingebracht, falls eine "Worksheet_Change" vorhanden wäre oder dazu kommt.

Private Sub UserForm_Initialize()

Me.ComboBox1.List = Range("AB4", Range("AB65536").End(xlUp)).Value
End Sub

Private Sub ComboBox1_Change() 'geht
Dim rngZelle As Range
Application.EnableEvents = False
For Each rngZelle In Selection
rngZelle.Value = Me.ComboBox1.Value
Next rngZelle
Unload Me
Application.EnableEvents = True
End Sub


Die Prüfung der Zeilen auch in einem Select reingebracht (hier auch als Vorschlag),
Die "Call" beseitigt:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)    'Userform Combobox anzeigen

'If Target.Column = 3 And Target.Row > 1 Then
Select Case Target.Row
Case 3 To 33, 37 To 67
Select Case Target.Column
Case 3, 7, 11, 15, 19, 23 'spalten ansprechen
If Target(1).Offset(0, -2).Value Then
With UserForm1
.StartUpPosition = 0
.Left = Target(1).Left
.Top = Target(1).Top - ActiveWindow.VisibleRange.Top
.ComboBox1.DropDown
.Show vbModeless
End With
UserForm1.Hide
End If
End Select
End Select
End Sub
VG
Yal
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
20.02.2025 18:48:38
ralf_b
Es gibt nichts Besseres als einen funktionierenden Code. Er kann eleganter, kürzer, unübersichtlicher, in Teilen sogar überflüssig sein aber nicht besser.
auf was prüfst du denn hier If Target(1).Offset(0, -2).Value Then

und Userform.hide nimmst du mal raus. das macht die Userform wieder wech.

Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
20.02.2025 19:12:22
Yal
@Ralf:
Habe ich auch zuerst gestützt, aber macht Sinn: hier wird meist einen Bereich markiert, weil man will, dass die ausgewählte Wert in das gesamten Bereich reingeschrieben wird.
Jedoch für die Prüfung geht man auf die Zelle 2 Zeilen vor der erste Zelle des markierten Bereich.

Target(1) ist equivalent zu Target.Cells(1), also erste Zelle im Range.

@Dieter:
ich habe auch gedacht, man könnte dasselbe Ergebnis mit einem Datenüberprüfung haben.
Nachdem der Wert in der erste Zelle gewählt wurde, druck man F2 (Zelle geht in Editier-Modus) und schliesst sofort wieder mit Strg+Enter.
Dann ist man den ganzen VBA und Formular los.

VG
Yal
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 10:57:00
Dieter
Hallo Yal und Ralf.
Erst mal vielen lieben Dank für eure Erklärung und kleine Änderung.
Damit ist aber leider mein Problem oder was ich möchte noch nicht beantwortet.
Ich würde gerne den Code in einem Sub Double Klick ausführen wie schon in meinem
ersten Beitrag erwähnt und warum.
Da bräuchte ich mal eure Hilfe weil einfach die Sub ändern geht nicht. WARUM ?
Wie immer Danke im Voraus eurer guten Arbeit und Erklärung.
Lg
Klaus
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 11:25:51
Yal
Hallo Dieter,

mit dem Ereignis "Worksheet_BeforeDoubleClick" wird es nicht funktionieren, weil Du möchtest eine Bereich aus mehreren Zellen auswählen, dann einen Eintrag auswählen und diese Eintrag in alle Zellen reinschreiben. Mit einem Doppelklick vernichtest Du der Auswahl von mehrere Zellen. Nur noch die Zelle, die gerade doppelgeklickt wurde, ist dann noch zu haben.

Also müsstest Du auf "Worksheet_BeforeRightClick" weichen.
Im Grund genommen, einfach deine "Worksheet_SelectionChange" durch den "Worksheet_BeforeRightClick" ändern und gut ist.
Es müsste zusätzlich darin einen
Cancel = True
vorhanden sein. Damit sagst Du, dass der Rechtsklick für einen separaten Zweck verwendet wurde und die normale Aufführung (Kontextmenü) nicht gebraucht wird.

VG
Yal
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 11:44:38
Crazy Tom
moin,

wenn ich dich richtig verstanden habe dann werden da keine Bereiche ausgewählt sondern nur eine Zelle im Bereich
dann wäre das hier eine Möglichkeit

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

If Target.Row > 2 And Target.Row = 33 Or Target.Row > 36 And Target.Row = 67 Then
Cancel = True
Select Case Target.Column
Case 3, 7, 11, 15, 19, 23 'spalten ansprechen
If Target.Value > "" And Target.Value = Target(1).Offset(0, -2).Value Then
With UserForm1
.StartUpPosition = 0
.Left = Target(1).Left
.Top = Target(1).Top - ActiveWindow.VisibleRange.Top
Call .ComboBox1.DropDown
Call .Show(vbModeless)
End With
' UserForm1.Hide
End If
End Select
End If
End Sub


mfg Tom
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 14:09:40
Dieter
Hallo Yal und Tom,
Yal, Deine Änderung geht, aber dafür ist das Auswahl Menü weg.
Tom, Du hast das richtig verstanden das ich nur immer die Zelle im Bereich für den DoubleClick haben möchte.
Aber leider geht Dein Vorschlag nicht.
An alle wieder,
Jetzt habe ich noch aus einer anderen Tabelle einen Code für einen CellDropdown im DoubleClick.
Der geht auch, aber wenn der CellDropdown öffnet ist die Schrift darin sehr klein.
Könnte man da die Schrift über den Code vergrößern ?
Hier mal der gesamte Code der dafür ist !!!!!!!
Bei RightClick nehme ich den CellDropdown wieder raus
--------------------------------------------------------------------------------------------------------------------------
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Excel.Range, Cancel As Boolean)

Dim RaBereich As Range ' Varable Bereich Wirksamkeit
' Bereich der Wirksamkeit
Set RaBereich = Range("C3:C33,G3:G30")
Cancel = True
If Not Intersect(Target, RaBereich) Is Nothing Then
Application.ScreenUpdating = False
' Range("C3:C33").Select
With Selection.Font
.Name = "Arial"
.Size = 10
End With
With Selection.Validation
.Delete
.Add Type:=3, AlertStyle:=1, Operator:=1, Formula1:="Urlaub,Arzt,Hund,Geburtstag"
.IgnoreBlank = True
.InCellDropdown = True
End With
Target.Cells = Value
Application.ScreenUpdating = True
End If
End Sub

---------------------------------------------------------------------------------------------------------------------------
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)    'CellDropdown aufheben

Application.ScreenUpdating = False
If Not Intersect(Target, [c3:c33,G3:G31]) Is Nothing Then
' Range("C3:C33,G3:G31,K3:K33,O3:O32,S3:S33,W3:W32,C37:C67,G37:G67,K37:K66,O37:O67,S37:S66,W37:W67").Select
With Selection.Validation
.Delete
End With
InCellDropdown = False
Application.ScreenUpdating = True
'Cancel = True
End If
End Sub

----------------------------------------------------------------------------------------
Private Sub ComboBox1_Click()	'geht

Application.EnableEvents = False
With Selection
If .Value = "" Then
.Value = ComboBox1.Text
.VerticalAlignment = xlCenter
.Font.Size = 11
Else
.Value = ""
.Font.Size = 10
End If
End With
Unload Me
Range("A1").Select
Application.EnableEvents = True
End Sub


Hoffe mal ich verlange jetzt nicht allzu viel von Euch,
suche halt nur für mich das am funktionalste beste raus.
Wie immer vielen Dank im Voraus der Mühe und Arbeit
Lg.
Dieter
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 14:25:23
Mullit
Hallo,

leider nicht mit dem Celldropdown, es sei denn, Du zoomst das ges. TabBlatt, ansonsten müsstest Du wie unten angedacht eine ComboBox nehmen, die besitzt eine Font-Eigenschaft.

Gruß, Mullit
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
22.02.2025 12:33:12
Dieter
Hallo Mullit,
Danke für Deine Erklärung
MfG
Dieter
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
21.02.2025 18:00:23
Yal
Hallo Dieter,

irgendwie verstehe ich nicht: wenn in deinem Dropdown sowieso immer nur die 4 Einträge "Urlaub,Arzt,Hund,Geburtstag" vorhanden sind, hast Du relativ schnell welche Eintrag wo steht.

Ich sehe auch nicht die Notwendigkeit diese Dropdown (richtig benannt: Datenüberprüfung) immer wieder zu löschen. Es ergibt keine Sinn.

Neue Vorschlag, wie ich es machen würde:
- Datenüberprüfung auf dem gesamten Bereich einrichten (einmalig, siehe Code)
- eine Gruppe von Zellen markieren, die oberste ist aktiv
- der gewünschte Eintrag per Dropdown auswählen,
- Anschliessend Strg+u drücken (steht für nach unten kopieren)
Fertig.

Kein Makro! (natürlich, wenn dein Ziel ist, VBA-Programmierung zu erlernen, ist diese Lösung kontraproduktiv)

Der Code für das Einrichten der Datenüberprüfung (eigentlich von Dir :-)
Private Sub Datenüberprüfung_einrichten()

Application.ScreenUpdating = False
With Range("C3:C33,G3:G31,K3:K33,O3:O32,S3:S33,W3:W32,C37:C67,G37:G67,K37:K66,O37:O67,S37:S66,W37:W67").Validation
.Delete
.Add Type:=3, AlertStyle:=1, Operator:=1, Formula1:="Urlaub,Arzt,Hund,Geburtstag"
.IgnoreBlank = True
.InCellDropdown = True
End With
Application.ScreenUpdating = True
End Sub


VG
Yal
Anzeige
AW: Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Rang
22.02.2025 13:45:28
Dieter
Hallo Yal,
Erst einmal vielen lieben Dank Deiner Ausführung.
Bei dem CellDropdown oder der Combobox habe ich natürlich viel mehr Einträge
als nur vier. ( abgespeckt ) Ich suche halt nur das für mich am besten raus.
Das mit dem löschen der Zellen beruht darauf das ich über dem Kalender (Tabelle) mehrere UF habe
die mit dem Kalender zusammen hängen und füllen und dann für eine Weiterverarbeitung sind.
Erklärung :
Zb. Eine UF für gesamten Geburtstag im Jahr gefüllt, dann eine UF für Feiertage, eine UF für Müll, usw.
Bei Hund Zb. weiß ich die Tage nicht immer im voraus der Betreuung, Einladungen usw.
Deshalb noch die Möglichkeit zusätzlich was nachtragen was zu dem einen oder anderen Kalender gehört.
Das wird mir sonst alles zu unübersichtlich wenn das alles in einem Kalender steht.
Dafür wollte ich noch eine Möglichkeit haben für entweder
CellDropdown oder Combobox um im Nachhinein noch etwas einzufügen
was ich nicht in einer fertigen UF habe.
Und mit kopieren, einfügen ist nicht so mein Ding.
Soweit ist ja mein kleines Problem alles Beantwortet worden von Dir ,Euch.
Vielen lieben Dank wie immer dafür.
Ich mache noch ein Thema auf Für eine Formel die ich nicht hinbekomme.
Man liest sich.
VL
Dieter
Anzeige
Vergessen
20.02.2025 18:42:58
Yal
Achte auf einem konsequenten und sauberen Einrücken! So wird die Lesbarkeit des Codes gewährleistet. Alles, was zwischen einen Anfang und ein Ende (For-Next, If-End if, With-End With, Select Case-End Select, usw): ein Tabulator eingerückt.

VG
Yal

Forumthreads zu verwandten Themen

Anzeige
Anzeige