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 
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 
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 
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 
Vielen Dank!!
Gruß
Chris