Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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
Inhaltsverzeichnis

Am Lernen

Am Lernen
25.05.2021 20:41:57
Eberhard
Guten Abend
Ich bin etwas am Üben und Testen. Doch ist irgendwo der Wurm begraben? Was mach ich falsch?
Besten Dank für die Unterstützung.
Gruss Daniel
https://www.herber.de/bbs/user/146366.xlsm

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Am Lernen
25.05.2021 20:55:54
Hajo_Zi
Hallo Daniel,
ich suche nun nicht was falsch istr, das hast Du schon festgestellt.

Option Explicit
Public Function Test(UF As Object, cBox As Long)
Dim strBreite As String
Dim letzteZeile As String
Dim i As Long
With Worksheets("Tabelle1")
letzteZeile = .Cells(Rows.Count, 10).End(xlUp).Row
strBreite = Columns(10).Width + 24
With UserForm_Lager.ComboBox1(cBox)
.Clear
.Font.Size = 12
.FontName = "Tahoma"
.Width = strBreite
.Height = 20
End With
For i = 2 To letzteZeile
UF.ComboBox(cBox).AddItem .Cells(i, 10).Value
Next i
End With
End Function
GrußformelHomepage
Anzeige
AW: Am Lernen
25.05.2021 21:23:21
Eberhard
Hallo Hajo
Vielen Dank. Meine Idee wäre, die Function Test bei anderen UF zu benutzen. So sieht die Combobox immer gleich aus und muss den Code nicht immer neu schreiben! Doch haben die UF und die Combobox immer einen anderen Name. Deshalb war die Idee mit der Function die Namen entsprechend anzupassen.
Aber irgendwie krieg ich das nicht hin?
Gruss Daniel
AW: Am Lernen
25.05.2021 21:38:40
Yal
Hallo Eberhadt-Daniel,
es gibt keine Auflistung der ComboBox. Wenn schon, würde es ComboBoxes heissen. Auflistung sind aus ihren Plural zu erkennen.
Du kannst aber die Auflistung Controls ansprechen. Dafür übergibst Du den Name des Controls (<- bei diesem "s" in "Controls" handelt es sich um einen deutschen Genetiv. :-)

Private Sub Test(UF As Object, cBox As String)
Dim strBreite As String
Dim letzteZeile As String
Dim i As Long
With Worksheets("Tabelle1")
letzteZeile = .Cells(Rows.Count, 10).End(xlUp).Row
strBreite = Columns(10).Width + 24
With UF.Controls(cBox)
.Clear
.Font.Size = 12
.FontName = "Tahoma"
.Width = strBreite
.Height = 20
End With
For i = 2 To letzteZeile
UF.Controls(cBox).AddItem .Cells(i, 10).Value
Next i
End With
End Sub
VG
Yal
Anzeige
AW: Am Lernen
26.05.2021 06:41:20
Eberhard
Guten Morgen
Vielen Dank für den Deutschkurs. :-) Noch was dazu gelernt. Doch funktioniert auch der Code oben nicht wie er sollte.
Muss es wirklich "Private Sub Test" heissen und nicht Function? Wie rufe ich dann die Sub in einem anderen Modul auf?
AW: Am Lernen
26.05.2021 12:44:23
Yal
Hallo Eberhard,
Zuerst bitte ich um Entschuldigung, das ich vorher 2 Fehler beim Schreiben deines Namens gemacht habe. Es ist mir peinlich.
Zweitens auch Entschuldigung für mein versehen: ich hatte die function/sub in die Codepane des Userforms versetzt, bevor ich gelesen habe, dass Du es eben separat haben wolltest.
Daher sollte es nicht Private sondern Public sein. Sonst ist ein Modul-übergreifender Aufruf nicht möglich.
Eine Function und eine Sub sind gleichwertig. Nur dass eine Function die zusätzliche Aufgabe hat, eine Werte zurückzugeben. Und nach meiner Vorstellung nichts anderes, als eine Werte zurückgeben, also keine Zustandsänderungen. Gibt den Code-Schnipsel keine Werte zurück, muss es/sollte es keine Function sein.
Es ist eigentlich nicht besonders relevant. Es funktioniert trotzdem. Aber ich habe mich gewöhnt, so mehr Struktur in meinem Code reinzubringen.
VG
Yal
Anzeige
AW: Am Lernen
26.05.2021 14:13:28
Eberhard
Hallo Yal
Ist doch kein Problem. Habe auch erst vor zwei Wochen erfahren, dass es in Deutschland Eberhard & Daniel als Vor- und Nachname gibt. Bei uns in der Schweiz ist Eberhard der Nachname und Vorname Daniel.
Dann würde also eine Public Sub reichen? Aber wie muss ich diese aufrufen? Bekomme immer einen Fehler! Habe schon diverse Varianten versucht!
Gruss Daniel
AW: Am Lernen
26.05.2021 18:32:51
Yal
Hallo Daniel (im Forum spricht man sich üblicherweise mit Vornamen an... Jetzt, dass ich weiß, dass deinen nicht Eberhard ist :-)
im Code der Userform habe ich

Private Sub UserForm_Initialize()
Call Test(UserForm_Lager, "ComboBox1")
End Sub
im Modul1

Public Sub Test(ByRef UF As Object, cBox As String)
Dim strBreite As String
Dim letzteZeile As String
Dim i As Long
With Worksheets("Tabelle1")
letzteZeile = .Cells(Rows.Count, 10).End(xlUp).Row
strBreite = Columns(10).Width + 24
With UF.Controls(cBox)
.Clear
.Font.Size = 12
.FontName = "Tahoma"
.Width = strBreite
.Height = 20
End With
For i = 2 To letzteZeile
UF.Controls(cBox).AddItem .Cells(i, 10).Value
Next i
End With
End Sub
Die Formatierung der Combobox (Breite, usw.) würde ich aber weiterhin in dem Userform abgelegen. So dass die sub "Test" sich nur noch um die Versorgung der Daten kümmert, nach der Prinzip "eine Aufgabe pro Sub/Function".
Noch puristischer wäre, diese "Test"-Sub liefert nur die Adresse der Bereich, wo die Daten, die den ComboBox befüllen sollen, liegen. Das Befüllen selbst würde dem ComboBox, bzw. Userform behalten bleiben. Dann würde es eine Rückgabewert geben und es müsste dann eine Function sein.
Es würde ungefähr so aussehen:
beim Initialisieren die Adresse der Liste abrufen, dann per Schleife die Inhalt der Zelle lesen. Dabei die max. Textlänge ermitteln, um daraus mit einem Faktor (1.2 ist meine Erfindung. Da musste man prüfen, ob es passt) die Breite der Combobox ermitteln.

Private Sub UserForm_Initialize()
Dim Z As Range
Dim Liste As Range
Dim TextBreite As Integer
With UF.Controls(cBox)
.Clear
Set Liste = ListenBereich_übergeben
For Each Z In Liste.Cells
UF.Controls(cBox).AddItem Z.Value
TextBreite = WorksheetFunction.Max(TextBreite, Len(Z.Value))
Next
.Width = TextBreite * 1.2
.Height = 20
End With
End Sub
Die aufgerufene Function ListenBereich_übergeben gibt eine "Range"-Objekt zurück, das man als eine Auflistung von Zellen betrachten kann.

Public Function ListenBereich_übergeben() As Range
With Worksheets("Tabelle1")
Set ListenBereich_übergeben = .Range(.Range("J2"), .Cells(Rows.Count, 10).End(xlUp))
End With
End Function
VG
Yal
Anzeige
AW: Am Lernen
27.05.2021 20:02:51
Eberhard
Hallo Yal
Vielen Dank für die Erklärung. Werde mir dies mal in Ruhe anschauen.
Melde mich wieder, wenn weitere Fragen auftauchen.
Wünsche einen schönen Abend.
Gruss Daniel
AW: Am Lernen
26.05.2021 05:23:25
Hajo_Zi
zu Deinen Gedanken konnte ich nichts schreiben, da ich nicht in Deinen Kopf schaue.
Ich bin dann raus, Dazu habe ich keinen Ansatz.
Gruß Hajo

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige