2 kleine Fragen zur Kombobox in VBA

Hallo,

Dank Reinhard habe ich es inzwischen geschafft eine Kombobox als ActiveX-Steuerelement in VBA bzw. Excel zu programmieren. Allerdings werden die 3 Einträge, die ich anzeigen lassen möchte ín der Liste insgesamt 9 mal angezeigt… Deshalb meine Frage: Wie limitiere ich die Einträge der Kombobox auf 3 bzw. lasse nur 3 Einträge anzeigen?

Außerdem würde ich gerne je nach Eintrag, der ausgewählt wird in einer seperaten Funktion mit einer if-Abfrage unterschiedliche Berechnungen ausführen. Wenn also z.B. „Edelstahl“ aus der Liste ausgewählt wird, soll in der Funktion Kosten=1+1 gerechnet werden. Aber wie kann ich aus der Funktion auf die Kombox zugreifen?

Freue mich über alle Antworten :smile:

Gruß
Chris

Hallo Chris,

Allerdings werden die 3 Einträge, die ich anzeigen lassen
möchte ín der Liste insgesamt 9 mal angezeigt… Deshalb meine
Frage: Wie limitiere ich die Einträge der Kombobox auf 3 bzw.
lasse nur 3 Einträge anzeigen?

Gegenfrage, wie befüllst du die Combobox?

Außerdem würde ich gerne je nach Eintrag, der ausgewählt wird
in einer seperaten Funktion mit einer if-Abfrage
unterschiedliche Berechnungen ausführen.

Ginge auch mit If, aber wenn du auch andere Einträge auswerten willst nimmt man besser select Case, ist übersichtlicher:

Private Sub ComboBox1\_Change()
Select Case ComboBox1.Value
 Case "Edelstahl"
 ' mache dies
 Case "Alu"
 ' mache das
 Case "Rost"
 ' mache jenes
End Select
End Sub

Gruß
Reinhard

Moin, Chris,

Allerdings werden die 3 Einträge, die ich anzeigen lassen
möchte ín der Liste insgesamt 9 mal angezeigt…

immer noch 9 oder inzwischen vielleicht 12? Schließ das Dokument mal und öffne es erneut, dann werden es wohl wieder 3 Einträge sein. Vermutlich hängen die AddItem-Anweisungen am falschen Ereignis, sie gehören zu Workbook.Activate.

Gruß Ralf

Also auch nach erneutem Öffnen sind es noch 9 Einträge…
Ich befülle die Combobox folgendermaßen:

Public Sub ComboBox1_change()
ComboBox1.AddItem „Kohlenstoffstahl“
ComboBox1.AddItem „Edelstahl“
ComboBox1.AddItem „Titan“
End Sub

Das mit der If-Abfrage macht Sinn, nur möchte ich sie ja in einer anderen Funktion aufrufen und nicht in dem Sub der Combobox. ICh stelle mir das ungefähr so vor:

function Berechnung() as integer
if combobox1.value = „Edelstahl“ then
Berechnung = 1
end if
end function

Natürlich funtioniert das so noch nicht… aber das Prinzip wird vielleicht klar.

Gruß
Chris

Hallo Chris,

Also auch nach erneutem Öffnen sind es noch 9 Einträge…

warum auch nicht. Und wenn du paarmal in der CB etwas auswählst werden es 12,15,18,21,… Einträge.

Ich befülle die Combobox folgendermaßen:

Ändere den Code so ab:

Public Sub ComboBox1_change()
End Sub

oder lösche ihn ganz.

CB kann man auf zwei Arten befüllen, über ListFillRange oder wie bei dir über .AddItem.

Einfügen—Modul, dortrein die folgenden Codes.
Die Prozedur CB_Füllen befüllt die CB mit den drei Einträgen.
Die Prozedur Test testet deine Funktion.

Option Explicit
'
Sub CB\_Füllen()
With ActiveSheet.ComboBox1
 .Clear
 .AddItem "Kohlenstoffstahl"
 .AddItem "Edelstahl"
 .AddItem "Titan"
End With
End Sub
'
Sub test()
MsgBox Berechnung()
End Sub
'
Function Berechnung() As Integer
If ActiveSheet.ComboBox1.Value = "Edelstahl" Then
 Berechnung = 1
End If
End Function

Gruß
Reinhard

Hallo Reinhard,

jetzt klappt endlich alles, vielen Dank!!!

Eine einzige Sache stört aber noch: Wenn ich den Code wie von dir vorgeschlagen eingebe:

Einfügen—Modul, dortrein die folgenden Codes.
Die Prozedur CB_Füllen befüllt die CB mit den drei Einträgen.
Die Prozedur Test testet deine Funktion.

Option Explicit

Sub CB_Füllen()
With ActiveSheet.ComboBox1
.Clear
.AddItem „Kohlenstoffstahl“
.AddItem „Edelstahl“
.AddItem „Titan“
End With
End Sub

Sub test()
MsgBox Berechnung()
End Sub

Function Berechnung() As Integer
If ActiveSheet.ComboBox1.Value = „Edelstahl“ Then
Berechnung = 1
End If
End Function

…und in einer Zelle die Funktion Berechnung ausführe, dann wird in dieser Zelle erst der Wert 1 angegeben, wenn ich „Edelstahl“ auswähle und dann nochmal die Funktion ausführe. Sie aktualisiert sich also nicht von selbst. Kann man das noch irgendwie schaffen?

Gruß
Chris

…und in einer Zelle die Funktion Berechnung ausführe, dann
wird in dieser Zelle erst der Wert 1 angegeben, wenn ich
„Edelstahl“ auswähle und dann nochmal die Funktion ausführe.
Sie aktualisiert sich also nicht von selbst. Kann man das noch
irgendwie schaffen?

hallo Chris,

dafür ist das _Change Ereignis da. Also das was ich dir riet zu löschen :smile:
Baue da ein
Application.calculate

Gruß
Reinhard

Baue da ein
Application.calculate

Also so?

Private Sub ComboBox1_Change()
Application.Calculate
End Sub

Das scheint irgendwie noch nicht zu funktionieren… ich muss immernoch jedesmal, wenn ich einen Wert aus der Kombobox auswähle in die Zelle klicken, in der die Funktion ausgeführt wird, und Enter drücken, damit etwas passiert…

Moin, Chris,

…und in einer Zelle die Funktion Berechnung ausführe, dann
wird in dieser Zelle erst der Wert 1 angegeben, wenn ich
„Edelstahl“ auswähle und dann nochmal die Funktion ausführe.
Sie aktualisiert sich also nicht von selbst. Kann man das noch
irgendwie schaffen?

es wäre wohl geschickter, das Ereignis zu nutzen - wenn eine Eingabe auf dem Blatt erfolgt, kriegt VBA das mit und bietet den passenden Einstieg an. Schreib dazu den Funktionsaufruf in die Sub hinein, die mit dem Combobox_Change generiert wird.

Das Application.Calculate berechnet die Formeln auf dem Blatt, ruft aber keine Functions auf.

Gruß Ralf

Schreib dazu den Funktionsaufruf in die Sub hinein, die mit dem :Combobox_Change generiert wird.

Wie genau mache ich das? Wenn meine Funktion „Kosten(x)“ heisst, kann ich ja nicht einfach folgendes schreiben:

Public Sub ComboBox1_change()
Kosten(x)
End Sub

Wie schreibe ich den Funktionsaufruf richtig in die Sub?

Gruß
Chris

Schreib dazu den Funktionsaufruf in die Sub hinein, die mit dem :Combobox_Change generiert wird.

Wie genau mache ich das? Wenn meine Funktion „Kosten(x)“
heisst, kann ich ja nicht einfach folgendes schreiben:

Public Sub ComboBox1_change()
Kosten(x)
End Sub

Wie schreibe ich den Funktionsaufruf richtig in die Sub?

Hallo Chris,
eine Function ist keine Sub.
Eine Sub rufst du auf, dann macht sie irgendwas.
Eine Function auch, die macht auch irgendwas, aber sie liefert einen Rückgabewert.

Also so

Public Sub ComboBox1_change()
Msgbox Kosten(10)
End Sub

oder

Public Sub ComboBox1_change()
Dim T
T = Kosten(10)
If T= 123 Then
mache dies
end if
End Sub

Gruß
Reinhard

Public Sub ComboBox1_change()
Dim T
T = Kosten(10)
If T= 123 Then
mache dies
end if
End Sub

Ok, das macht Sinn… nur kann ich das so bei mir nicht anwenden, da meine Funktion von mehreren Variablen abhängt, deren Werte aus Excelzellen ausgelesen werden. Ich kann die Funktion also nicht mit einem festen Wert aufrufen, wie in deinem beispiel. Wenn ich sie mit den variablen Werten, also T = Kosten(x, y) aufrufe, bekomme ich die Fehlermeldung „Argument ist nicht optional“.

Außerdem möchte ich ja die Funktion in einer Zelle ausführen, so dass ein Wert ausgegeben wird, der von der Auswahl des Kombobox-Eintrags, sowie den angesprochenen anderen variablen Werten abhängt.

Gibt es nicht die Möglichkeit in der Funktion die Kombobox zu refreshen? Oder kann ich in der Sub ComboBox1_change() eine Variable deklarieren, in die ich den Wert der Kombobox, also ActiveSheet.ComboBox1.Value, speichere und diese Variable in der Funktion verwenden?

Gruß
Chris

Hallo Christian,

Ok, das macht Sinn… nur kann ich das so bei mir nicht
anwenden, da meine Funktion von mehreren Variablen abhängt,
deren Werte aus Excelzellen ausgelesen werden. Ich kann die
Funktion also nicht mit einem festen Wert aufrufen, wie in
deinem beispiel. Wenn ich sie mit den variablen Werten, also T
= Kosten(x, y) aufrufe, bekomme ich die Fehlermeldung
„Argument ist nicht optional“.

die Fehlermeldung ist was anderes, sie besagt daß die Anzahl der Parameter nicht übereinstimmen.

Du könntest doch so aufrufen:

T = Kosten(range"A1"),combobox1.value)

oder so:

T = Kosten(combobox1.value)
wobei dann in der Funktion au A1 zugegriffen wird.

Die Beitragsfolge ist schon lang, kannste nicht mal die Mapee hochladen oder eine Beispiemappe mit hostarea ( FAQ:2606 )

Gibt es nicht die Möglichkeit in der Funktion die Kombobox zu
refreshen?

Umgekehrt, durch Change in der Combobox kannst du das Blatt neu berechnenen lassen.

Oder kann ich in der Sub ComboBox1_change() eine
Variable deklarieren, in die ich den Wert der Kombobox, also
ActiveSheet.ComboBox1.Value, speichere und diese Variable in
der Funktion verwenden?

In der Funktion kannst du doch direkt auf den Wert der Combobox zugreifen.

Function Kosten()
Kosten=activesheet.combobox1.value * Range(„A1“)

Gruß
Reinhard

Mit dem Funktion aufrufen aus der sub Combobox1_change komme ich nicht weiter.

Ich habe die Datei mal hochgeladen mit dem Code in vereinfachter Form.
In Zelle „D3“ rufe ich die Funktion auf. Man muss das Sub CB_Füllen irgendwie manuell ausführen, damit die combobox befüllt wird.

Vielen Dank für die ganze Mühe die ihr (vor allem Reinhard) euch hier macht :smile:

Hier der Link: http://rapidshare.com/files/351470163/Kosten.xlsm.html

Gruß
Chris

Hallo Christian,

In Zelle „D3“ rufe ich die Funktion auf. Man muss das Sub
CB_Füllen irgendwie manuell ausführen, damit die combobox
befüllt wird.

schreibe in das Modul „DieseArbeitsmappe“:

Private Sub Workbook_Open()
Call CB_Fuellen
End Sub

Das Problem ist, Änderung der CB ruft keine automatische Neuberechnung der Funktionen hervor. Man müßte danach F9 drücken, ist natürlich unpraktisch (außer bei Performance-Problemen, siehe später bei Volatile)

Schreibe in das Modul „Tabelle1“:

Private Sub ComboBox1_Change()
Application.Calculate
End Sub

(Normalerweise würde man in das Change-Ereignis auch die Berechnung von D3 reinschreiben aber du willst ja warum auch immer eine Funktion.)

Diese mußt du jetzt noch abändern und Volatile einfügen:

Function Kosten(Faktor As Single) As Single
Application.Volatile
If ActiveSheet.ComboBox1.Value = "Kohlenstoffstahl" Then
 Kosten = 10 \* Faktor
ElseIf ActiveSheet.ComboBox1.Value = "Edelstahl" Then
 Kosten = 20 \* Faktor
ElseIf ActiveSheet.ComboBox1.Value = "Titan" Then
 Kosten = 30 \* Faktor
End If
End Function

Volatile ist nicht unkritisch, es bedeutet die Funktion wirdimmer berechnet auch wenn du in einem anderen Blatt etwas änderst.
Das kann die Performance herabsetzen bei großen Tabellen mit vielen Formeln.
Zumindest weißt du dann wonach du suchen mußt wenn der Rechner nach eder Eingabe erstmal ne Minute am Rechnen ist und du in der Zeit nix machen kannst.

Gruß
Reinhard

Juhu es klappt!! Du bist der beste Reinhard :smile:

Vielen Dank!!

Gruß
Chris