Live-Forum - Die aktuellen Beiträge
Datum
Titel
28.03.2024 21:12:36
28.03.2024 18:31:49
Anzeige
Archiv - Navigation
1520to1524
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
3. Teil - Combobox dynamisch in Tabelle erzeugen
06.11.2016 16:59:15
Oberschlumpf
Hallo Leute
alles begann mit meiner 1. Frage, hier nachzulesen (wer möchte)
https://www.herber.de/forum/archiv/1520to1524/t1522140.htm
daraus ergab sich bald meine 2. Frage, hier nachzulesen (wer möchte)
https://www.herber.de/forum/archiv/1520to1524/t1522155.htm#1522161
Und genau zur 2. Frage hab ich nun eine weitere Frage.
Karin (Beverly) hatte mir eine gute Bsp-Datei gezeigt, mit der ich es hinbekomme, eine Combobox (CB) anzeigen zu lassen, die während der Laufzeit des Codes erstellt wird, egal, welche Zelle ich anklicke.
Nun habe ich aber festgestellt, dass der ausgewählte Inhalt der CB nur dann in die zuvor angeklickte Zelle übertragen wird, solange sich der Change-Code von CB direkt im VBE im Worksheet-Bereich befindet.
Das hat aktuell zur Folge, dass in jedem Worksheet-Teil jeder Tabelle dieser Code stehen müsste, was aber fast nicht möglich ist, da im Lauf der Bearbeitung weitere Tabellenblätter hinzugefügt werden.
Möglich wäre das nur, wenn ich während der Laufzeit VBA-Code hinzufüge.
Und das wiederum geht nur, wenn ich in "Sicherheit" dem VBA-Projekt vertraue.
Aber genau das möchte ich vermeiden.
Gibt es eine andere Möglichkeit, z Bsp das Change-Ereignis von der CB in ein allgemeines Modul auszulagern, so dass, egal, welche Tabelle ich bearbeite, der Code immer ausgeführt wird, dass der ausgewählte Wert aus der CB in die Zelle übergeben wird?
Ich hoffe, ihr versteht, was ich meine.
Vielen Dank schon mal.
Ciao
Thorsten

12
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: 3. Teil - Combobox dynamisch in Tabelle erzeugen
06.11.2016 22:57:06
snb
Du brauchst ein combobox in jedem Arbeitsblatt.
In codemodule des Workbooks:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
If Target.Count > 1 Or Target.Column = 1 Then Exit Sub
With Sh.ComboBox1
.LinkedCell = ""
.Top = Target.Top
.Left = Target.Offset(, 1).Left
.List = Sh.Range("A1:A10").Value
.ListRows = 10
.ListIndex = -1
.LinkedCell = Target.Address
.Visible = True
End With
End Sub

leider nicht das, was ich benötige...
06.11.2016 23:16:35
Oberschlumpf
...trotzdem danke für deine Idee
Ich nutze zur Anzeige einer CB diese Lösung (lieber per DblClick als SingleClick):
(sbVal bestimmt dynamisch den benötigten Zellbereich für den Range-Namen "cbbereich")
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel  _
As Boolean)
Dim oobElement As OLEObject, larSplit As String
If ActiveSheet.Range("E1").Value  "all Display Names" Then Exit Sub
sbVal
If Not Intersect(zelle, Range("E:E")) Is Nothing Then
Application.ScreenUpdating = False
Set oobElement = ActiveSheet.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=0, Top: _
=0, Width:=0, Height:=0)
With oobElement
.Top = ActiveCell.Top
.Left = ActiveCell.Left
.Width = Range(ActiveCell, ActiveCell.Offset(0, 1)).Width
.Height = Range(ActiveCell, ActiveCell.Offset(1, 0)).Height
.Name = "DropDownZoom"
.ListFillRange = "cbbereich"
.Object.MatchRequired = True
.Object.ListRows = 14
.Object.Font.Size = 12
.Object.DropDown
.Object.ListIndex = 0
Application.OnTime Now + TimeValue("00:00:00"), "Eintrag"
End With
Application.ScreenUpdating = True
End If
End Sub

Dieser Code, ausgeliehen von Beverly, erstellt während der Laufzeit zu jeder beliebigen Zeit eine CB.
So benötige ich nicht, wie du denkst, in jedem Sheet eine vordefinierte CB.
Aber leider wird aktuell in jedem Sheet der Code für's Change-Ereignis der CB benötigt.
Vielleicht weiß ja doch noch jemand, wie man das CB-Change-Ereignis außerhalb eines Sheets abfangen kann.
Vielen Dank!
Anzeige
AW: leider nicht das, was ich benötige...
06.11.2016 23:38:25
Mullit
Hallo,
das geht über Klassenprogrammierung und einer Automatisierungsklasse, in der Du das Change-Ereignis abfängst, gibt einige Bsp. von Nepumuk, Beverly oder Hajo dazu...
Gruß, Mullit
AW: leider nicht das, was ich benötige...
06.11.2016 23:47:05
Oberschlumpf
Hallo...
...und danke erst mal.
Ich lass mal offen; vllt mag mir ja jemand diesen Klassen-Code zum "Abfangen" vom Change-Ereignis einer CB außerhalb des Sheets, in dem die CB aktiv ist, verraten.
Ich selbst werde aber auch weiter genau danach suchen.
Ciao
Thorsten
Weshalb nicht wie vorgeschlagen...
07.11.2016 07:53:26
Beverly
Hi Thorsten,
...anstelle des Doppelklick-Ereignisses des Worksheets das des Wokbooks verwenden? Das funktioniert doch auch (Basis mein Code):
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, Cancel  _
As Boolean)
Dim oobElement As OLEObject             ' Variable für das Steuerelement als OLEObject
On Error Resume Next
Sh.OLEObjects("DropDownZoom").Delete
On Error GoTo 0
If Not Intersect(Target, Range("C5:C35")) Is Nothing Then
' Bildschirmaktualisierung aus
Application.ScreenUpdating = False
' ComboBox erstellen
Set oobElement = Sh.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=0, Top:=0,  _
Width:=0, Height:=0)
With oobElement
.Top = ActiveCell.Top          ' Position oben
.Left = ActiveCell.Left        ' Position links
.Width = Range(ActiveCell, ActiveCell.Offset(0, 1)).Width ' Breite
.Height = Range(ActiveCell, ActiveCell.Offset(1, 0)).Height ' Höhe
.ListFillRange = "Liste"        ' Quellbereich, per Name "Liste" definiert
.Name = "DropDownZoom"          ' Name zuweisen
.Object.MatchRequired = True    ' nur vorhandene Einträge
.Object.ListRows = 14           ' Zeilenanzahl der Liste
.Object.Font.Size = 12          ' Schriftgröße
.Object.DropDown                ' DropDown öffnen
.Object.ListIndex = 0           ' 1. Eintrag auswählen
' Umwandeln in ein Datum - nur erforderlich wenn die Auswahl aus Datumswerten  _
besteht
If IsDate(Range(.ListFillRange).Cells(1)) Then .Object = CStr(CDate(.Object))
.Activate                       ' aktivieren
' erforderlich, da andernfalls der 1. Eintrag nicht in die Zelle eingetragen werden  _
kann,
' weil seine Auswahl kein Change-Ereignis auslöst da er bereits ausgwählt ist
' mit dem Makro "Eintrag" wird der 1. Eintrag in die Zelle geschrieben
Application.OnTime Now + TimeValue("00:00:00"), "Eintrag"
End With
' Bildschirmaktualisierung ein
Application.ScreenUpdating = True
End If
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim oobElement As OLEObject             ' Variable für das Steuerelement als OLEObject
On Error Resume Next
ActiveSheet.OLEObjects("DropDownZoom").Delete
On Error GoTo 0
End Sub


Anzeige
AW: Weshalb nicht wie vorgeschlagen...
07.11.2016 17:47:48
Oberschlumpf
Hi Karin,
ja, dein Code im WorkBOOK-DoubleClick-Ereignis funktioniert soweit, dass eben beim Doppelklick in eine Zelle, egal welche Tabelle, die CB erstellt + angezeigt wird.
Aber ich hab es noch nicht geschafft, das Change-Ereignis der CB, so zu gestalten, dass es - nicht - erforderlich ist, den Code Sub DropDown()... dafür in jedes WorkSHEET schreiben zu müssen.
In deiner Bsp-Datei steht ja der Code auch im Worksheet-Bereich für Tabelle1.
Hast du vielleicht eine Idee?
(hab die anderen neuen Antworten noch nicht gelesen, weil gerade erst zu hause; deswegen ist meine Frage an dich vllt schon beantwortet)
Ciao
Thorsten
Anzeige
AW: Weshalb nicht wie vorgeschlagen...
07.11.2016 18:26:05
Beverly
Hi Thorsten,
mit der Codezeile
Application.OnTime Now + TimeValue("00:00:00"), "Eintrag"

wird das Makro "Eintrag" im Standardmodul aufgerufen (im Prinzip ersetzt dieses das Change-Ereignis bei meinem Beispiel) und steht somit in allen Tabellenblättern zur Verfügung.


AW: leider nicht das, was ich benötige...
07.11.2016 08:52:20
fcs
Hallo Thorsten,
für die Übernahme des in der Combobox ausgewählten Wertes kannst du die LinhedCell-Eigenschaft der Combobox nutzen.
Wenn du den Wert in einem Makro zusätzlich weiter verarbeiten willst, dann kannst du das Selection_Change-Ereignis nutzen.
Wenn nach der Auswahl in der Combobox eine beliebige Zelle im Blatt selektiert wird, dann wird auf vorhandensein der Combox geprüft und die verlinkte Zelle gemerkt, dann die Combobox gelöscht und das Makro gestartet, das den Zellinhalt verarbeitet.
LG
Franz
Private Sub Workbook_SheetBeforeDoubleClick(ByVal Sh As Object, ByVal Target As Range, _
Cancel As Boolean)
Dim oobElement As OLEObject, larSplit As String
Select Case Sh.Name
Case "TabelleXX", "TabelleYY"
'In diesen Tabellenblättern den Doppelklick normal verarbeiten
Case Else
If Sh.Range("E1").Value  "all Display Names" Then Exit Sub
sbVal
If Not Intersect(Target, Sh.Range("E:E")) Is Nothing Then
Cancel = True
Application.ScreenUpdating = False
Set oobElement = Sh.OLEObjects.Add(ClassType:="Forms.ComboBox.1", _
Left:=Target.Left, _
Top:=Target.Top, _
Width:=Sh.Range(Target, Target.Offset(0, 1)).Width, _
Height:=Sh.Range(Target, Target.Offset(1, 0)).Height)
With oobElement
.Name = "DropDownZoom"
.ListFillRange = "cbbereich"
.LinkedCell = Target.Address
.Object.MatchRequired = True
.Object.ListRows = 14
.Object.Font.Size = 12
.Object.DropDown
.Object.ListIndex = 0
'?Was macht das Makro "Eintrag"?
'                  Application.OnTime Now + TimeValue("00:00:00"), "Eintrag"
End With
Application.ScreenUpdating = True
End If
End Select
End Sub
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
Dim objOle As OLEObject
Dim Zelle As Range
On Error GoTo weiter
With Sh
Set objOle = .OLEObjects("DropDownZoom")
Set Zelle = Sh.Range(objOle.LinkedCell)
'Combobox wieder löschen
objOle.Delete
'geänderten Wert in Zelle verarbeiten
Call AnderungDropDownZoom(Zelle)
End With
weiter:
End Sub

Anzeige
AW: leider nicht das, was ich benötige...
07.11.2016 17:57:43
Oberschlumpf
Hallo Franz,
vielen Dank!
Ich werde das mal ausprobieren.
Erst mal deine Frage.
Das Makro "Eintrag" ist Bestandteil von Karins' Makro und setzt den 1. Eintrag aus der CB in die Zelle, weil laut ihrer Beschreibung sonst Fehler.
Und wo ich das gerad lese, was ich schreibe, hatte ich vllt die ganze Zeit die gesuchte Lösung vor Augen :-)
Wenn das Makro "Eintrag" den 1. Eintrag aus CB in die Zelle überträgt, wieso sollte das mit anderen Einträgen aus CB nicht auch möglich sein?! :-)
Aber auch das muss ich erst mal prüfen.
Und trotzdem hab ich noch eine Frage an dich.
In deinem Code wird das Makro "AnderungDropDownZoom" erwähnt.
Aber du hast das Makro selbst nicht im Code gezeigt.
Was, oder besser, wie passiert die Übergabe der Var Zelle an die Zelle an sich?
Ciao
Thorsten
Anzeige
AW: leider nicht das, was ich benötige...
07.11.2016 18:16:52
fcs
Hallo Thorsten,
In deinem Code wird das Makro "AnderungDropDownZoom" erwähnt.
Da du nicht beschrieben hast, was das Combobox_Change-Ereignismakro machen soll, hab ich es profilaktisch eingebaut.
Aber du hast das Makro selbst nicht im Code gezeigt.
Zum Testen hatte ich in einem allgemeinen Modul das folgende Makro eingfügt:

Sub AnderungDropDownZoom(Zelle As Range)
MsgBox "Geänderte Zelle hat Wert: " & Zelle.Value
End Sub

Was, oder besser, wie passiert die Übergabe der Var Zelle an die Zelle an sich?
Die Wertübergabe erfogt über die beim Anlegen der Combobox festgelegte LinkedCell.
Wenn du nur den Wert aus der Combobox in die per Doppelklick ausgewählte Zelle übernehmen willst,
dann kannst du Zeile mit "Call AnderungDropDownZoom(Zelle)" weglassen.
ebenso die Zeile
Set Zelle = Sh.Range(objOle.LinkedCell)
LG
Franz
Anzeige
AW: leider nicht das, was ich benötige...
07.11.2016 18:22:46
Oberschlumpf
Hi Franz,
ok, danke.
Ich hoffe, mit eurer Hilfe funzt das endlich.
Es muss ja eigtl nur das Change-Ereignis der CB "abgefangen" werden.
Ich werde deine Idee mal ausprobieren.
Ciao
Thorsten
Antwort an alle Helfenden: PROBLEM GELÖST!
08.11.2016 04:21:05
Oberschlumpf
Guten Morgen zusammen!
Die Idee von Franz
.LinkedCell = Target.Address

war die richtige!
Ich musste Target nur ändern in ActiveCell, weil der eigentliche Code aus
Private Sub Workbook_SheetBeforeDoubleClick(...

ins allgemeine Modul ausgelagert wurde.
Aber so funktioniert es endlich!
Das alles war (für mich) echt ne "schwierige Geburt"!
Aber danke, danke, danke an alle Helfenden!
Endlich wieder ein Problem weniger :-)
Tschüss
Thorsten
Anzeige

299 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige