2.5k Aufrufe
Gefragt in Tabellenkalkulation von paul1 Experte (4.9k Punkte)
Hallo Allseits,

Ich hätte wieder einmal eine Frage:

ComboBox
RowSource: C1:C7


Nach Auswahl eines der Inhalte vom C1:C7 werden Zahlen oder Text tadellos in die Zelle D1 eingefügt, beim nächsten anklicken wird der vorherige durch den neuen Eintrag ersetzt so weit so gut.

Wäre es möglich die in der ComboBox ausgewählten Inhalte fortlaufend in D1, D2, D3... usw..., ohne den Umweg über die Textbox, Erfassungsbutton etc. aufzunehmen.

Mit diesem Code geht es nur in D1:

Option Explicit

Private Sub ComboBox1_Change()
Worksheets("Tabelle1").Range("D1").Value = Me.ComboBox1.Value
End Sub

Über Tipps, Hinweise, eventuell Lösung würde ich mich freuen und bedanke mich bereits im Voraus.

Gruß

Paul1

7 Antworten

0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Evtl. auf den ersten Blick schwer durchschaubar, aber folgendes sollte funktionieren:
Private Sub ComboBox1_Change()
With Worksheets("Tabelle1")
.Range("D" & IIf(IsEmpty(.Range("D1")), 1, _
IIf(IsEmpty(.Range("D" & .Rows.Count)), _
.Range("D" & .Rows.Count).End(xlUp).Row + 1, _
.Rows.Count))) _
.Value = Me.ComboBox1.Value
End With
End Sub


Cu TheBlackBird ®
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo TheBlackBird,

Herzlichen Dank für die gekonnte Lösung und die damit verbundene Mühe.

Um das zu durchschauen fehlt mir derzeit noch der Durchblick, aber ich lerne doch was dazu (mühsam ernährt sich das Eichhörnchen!).

Nochmals besten Dank

schönen Tag noch
mit Gruß

Paul1
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Dann will ich mal eine kleine Taschenlampe mit dazulegen ;-), um evtl. etwas Licht ins Dunkel zu bringen.

Du wolltest fortlaufend in Spalte D eintragen.
In
.Range("D?").Value =
suchst Du also das ?.
Als erstes muss das ? also einmal abgetrennt werden um einzeln interpretiert werden zu koennen.
=>
.Range("D" & ?).Value =

Fuer das ? steht nun in #1 also:
IIf(IsEmpty(.Range("D1")), 1, _
IIf(IsEmpty(.Range("D" & .Rows.Count)), _
.Range("D" & .Rows.Count).End(xlUp).Row + 1, _
.Rows.Count)))


Als PseudoFormel:
Wenn(D1=LEER;1;
Wenn("LetzteZelleInD"=LEER;
Zeile("VonLetzterZelleInD" StrgPfeilnachOben)+1;
Zeile("LetzteZelleInD")


Nachteil der Sache: Ist die LetzteZelleInD bereits beschrieben/befuellt, wird diese Zelle immer und immer wieder ueberschrieben. Aber der Code laeuft wenigstens nicht in einen Fehler. (Liesse sich bei Bedarf aber auch abfangen.)

Fuer zukuenftigen Gebrauch leichter anzupassen (wenn eine andere Spalte herhalten muss) waere dann evtl. folgende Version:
Const strSpalte As String = "D"
With Worksheets("Tabelle1")
.Range(strSpalte & IIf(IsEmpty(.Range(strSpalte & 1)), 1, _
IIf(IsEmpty(.Range(strSpalte & .Rows.Count)), _
.Range(strSpalte & .Rows.Count).End(xlUp).Row + 1, _
.Rows.Count))) _
.Value = Me.ComboBox1.Value
End With


Somit waere fuer eine andere Spalte der Konstanten nur ein anderer Buchstabe zuzuweisen.

Cu
TheBlackBird ®
... der hofft, Dich nicht noch mehr verwirrt zu haben ;-)
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo TheBlackBird,

Ich danke Dir für die hervorragenden und kompetenten Ausführungen, damit hast Du mir meine ersten Gehversuche mit VBA erheblich erleichtert .

Werde es übers Wochende in Ruhe durchgehen.

Nochmals vielen Dank für alles!!!


mit besten Gruß

Paul1
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo TheBlackBird,

Es läuft alles super, nur übernimmt er Zahlen mit Kommastellen aus Spalte C in Spalte D als Text, ich weiß das hatten wir schon einmal, aber ich bin nicht fähig das "CDbl" in den Code an der richtigen Stelle einzufügen.

Vielleicht kannst Du mir das noch übermitteln.

besten Dank im Voraus


Gruß

Paul1
0 Punkte
Beantwortet von theblackbird_ Mitglied (605 Punkte)
Moin,

Es wuerde dafuer ein
= CDbl(Me.ComboBox1.Value)
reichen, um den Wert aus der ComboBox zur Zahl zu machen. Nur bekommst Du dann ein Problem wenn sich in C1:C7 doch mal ein Buchstabe etc. verirrt.
Du solltest im Code also auch hier wieder pruefen, ob sich der Inhalt der ComboBox als Zahl interpretieren laesst. (isnumeric). Abhaengig vom Ergebnis dann halt wandeln (CDbl) oder eben nicht.
Um die ZielZellen-Ermittlung nun nicht doppelt schreiben zu muessen (Kostet bei groesseren Projecten dann ja auch etwas Laufzeit...) wuerde ich die Pruefung/Wandlung als Erstes vornehmen, und den (gewandelten?) Wert in eine Variable speichern. Diese wuerde ich dann wiederum zum Eintrag in die ZielZelle heranziehen. Da die Variable nun, abhaengig von Wandlung/NichtWandlung, eine Zahl oder Text aufnehmen muss, bietet sich dafuer eine vom Typ Variant an, da diese nahezu alle DatenTypen aufnehmen kann. Das saehe in Code umgesetzt dann aus wie folgt:
Private Sub ComboBox1_Change()
Const strSpalte As String = "D"
Dim vntWert As Variant
With Worksheets("Tabelle1")
If IsNumeric(Me.ComboBox1.Value) Then
vntWert = CDbl(Me.ComboBox1.Value)
Else
vntWert = Me.ComboBox1.Value
End If
.Range(strSpalte & IIf(IsEmpty(.Range(strSpalte & 1)), 1, _
IIf(IsEmpty(.Range(strSpalte & .Rows.Count)), _
.Range(strSpalte & .Rows.Count).End(xlUp).Row + 1, _
.Rows.Count))) _
.Value = vntWert
End With
End Sub


Cu
TheBlackBird ®
0 Punkte
Beantwortet von paul1 Experte (4.9k Punkte)
Hallo TheBlackBird,

Nur mit größter Mühe war ich schon soweit selbst den Code abzuändern, dass zwar alle Zahlen (auch Kommazahlen) korrekt übernommen wurden, aber wie gesagt bei Texten gab es einen Laufzeitfehler.

Für die mir jetzt übermittelte perfekte Lösung samt den für mich genau so wichtigen Ausführungen deinerseits bedanke ich mich hiermit nochmals herzlichst.

schönes Wochenende
mit Gruß

Paul1
...