Microsoft Excel

Herbers Excel/VBA-Archiv

MultiPage UserForm

Betrifft: MultiPage UserForm von: Pete
Geschrieben am: 13.08.2020 21:45:08

Hallo,

Ich habe eine UF (UserForm1) mit diversen Textboxen und einem Listenfeld.

Den Namen (Labels) für die entsprechenden Textboxen , für die UserForm und die Columns der Listbox holt ich über das zugrundeliegende Worksheet (tbl_DATA)


Da ich merke das die ganze Sache etwas größer wird dachte ich ich führe eine MultPage Seite ein.

Hab ich gemacht (vgl fm_Daten)

Auf Page 1 hab ich die gleichen Felder wie in UF1. Nur diesesmal bedkomme ich es nicht gebacken das die Namen für die Labels sich aus dem Sheet ziehen

Was mache ich falsch?

Bitte um Hilfe

File kann ich derzeit nicht uploaden
ier ist ein 404-Fehler aufgetreten, bitte gehen Sie auf die Startseite https://www.herber.de/
Hier der Codfe für die UF

Private Sub UserForm_Initialize()
 Dim i As Integer
 
 With tbl_DATA
  'Überschrift der Userform aus Zelle A1 holen
  Me.Caption = .Range("A1").Value
  
  For i = 1 To 10
    Me.Controls("Label" & i).Caption = .Cells(2, i).Value
  Next i
  
  'Überschrift der ListBox aus Tabelle holen
  For i = 1 To 8
    Me.Controls("Label" & i + 10).Caption = .Cells(2, i).Value
  Next i
 End With
 
 'ListBox einstellen
 With Me.ListBox1
  .ColumnCount = 10                    'Spaltenanzahl festlegen
  .ColumnWidths = "80;80;80;80;80;80;80;80;80;10" 'Spaltenbreiten definieren
 End With
 
 'Cursor standardmäßig in die erste TextBox setzen
 Me.TextBox1.SetFocus
 
End Sub


Allen besten Dank im Voraus

Betrifft: versuchs gleich nochmal mit der datei.
von: ralf_b
Geschrieben am: 13.08.2020 21:56:56

nur geraten: du mußt vielleicht die controls über das multipage control referenzieren, weil die da drin sind.

Betrifft: AW: MultiPage UserForm
von: Werner
Geschrieben am: 13.08.2020 22:09:03

Hallo,

lass mal das Me. weg. Me ist die Userform auf die du damit referenzierst.
Deine Steuerelemente sind aber nicht auf der Userform sondern auf einer Multipage auf der Userform.
 For i = 1 To 10
    Controls("Label" & i).Caption = .Cells(2, i).Value
Next i
Dein SetFocus könnte aber Probleme machen. Das Control kann nur den Focus bekommen, wenn auch die entsprechende Multipage aktiv ist.

Gruß Werner

Betrifft: AW: MultiPage UserForm
von: Pete
Geschrieben am: 13.08.2020 22:29:03

Wow.. das ging schnell.
Werner.. Ich hab die "Me" entfernt und bekomme jetzt den Laufzeitfehler 450

Betrifft: AW: MultiPage UserForm
von: ralf_b
Geschrieben am: 13.08.2020 22:35:11

du weist schon das es daran liegt

Set Labels = MultiPage1.Pages(0).Controls.Add

Betrifft: AW: MultiPage UserForm
von: Pete
Geschrieben am: 13.08.2020 22:09:48

https://www.herber.de/bbs/user/139619.xlsm

Betrifft: AW: MultiPage UserForm
von: Werner
Geschrieben am: 13.08.2020 22:42:38

Hallo,
Private Sub UserForm_Initialize()
Dim i As Integer, wks As Worksheet

Set wks = tbl_DATA

With tbl_DATA
    MultiPage1.Pages(0).Caption = .Range("A1").Value
    'Überschrift der Userform aus Zelle A1 holen
    Me.Caption = .Range("A1").Value
    For i = 1 To 10
        Controls("Label" & i).Caption = .Cells(2, i).Value
    Next i
    'Überschrift der ListBox aus Tabelle holen
    For i = 1 To 5
        Controls("Label" & i + 10).Caption = .Cells(2, i).Value
    Next i
End With

'ListBox einstellen
With ListBox1
    .ColumnCount = 6                    'Spaltenanzahl festlegen
    .ColumnWidths = "80;80;80;80;80;10" 'Spaltenbreiten definieren
End With

'zu Sicherheit Seite1 der Multipage wählen
MultiPage1.Value = 0
'Cursor standardmäßig in die erste TextBox setzen
TextBox1.SetFocus

End Sub
Gruß Werner

Betrifft: AW: MultiPage UserForm
von: Pete
Geschrieben am: 13.08.2020 23:22:12

Hi Werner,.. zunächst hab recht herlichen dank! Kann ich mich morgen melden? hab im Moment keinen klaren KOpf mehr.. Sprich.. muss schlafen :-)
Auf alle Fälle recht herzlichen Dank!
Gruß,
peter

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 14.08.2020 20:34:49

Hallo Werner,
dieesmal etwas fitter in der Birne :-)
Kaum hattest geschrieben.. hatte ich den Fehler entdeckt . Du hattest recht mit den Set Labels...
Jetz funktioniert das Makro einwandfrei. Hab recht herzlichen Dank dafür
Darf ich Dich noch etwas fragen?

Gruß,
Peter

Betrifft: versuch es doch einfach. o.w.T.
von: Werner
Geschrieben am: 14.08.2020 21:23:41



Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 14.08.2020 22:19:32

Werner,.. also.. ich hab zuerst ne UF gebastelt. Bin dann auf die Idee gekommen wie gesagt, eine Multipage einzubauen.

Bin aber dann an der "Aufgabe" gescheitert den Datensatz über die Listbox und Data sheet zu ändern.

DEshalb hab ich eine neue UF gebastelt um den Zusammenhang zu verstehen.

Nun.. Dank Deiner Hilfe habe ich den Zusammenhang zwischen der Multipage und der UF verstanden.

Das hab ich jetzt versucht in der "Alten" UF umzusetzen. Und scheitere wieder.

Ich denke ich scheitere deshalb weil in der alten UF die Labels als auch Textboxen selbst mit Namen versehen habe. Anders als in der neuen UF. Hier holen sich die nummerierten Labels den Namen aus dem Sheet.



Was mache ich in der alten UF

In Frame 3 gebe ich als Bspl die Nummer 123456 ein. Wenn ich den cmd Button links davon triggere dann wird die LBx gefüllt. Wenn ich jetzt den CmdButton Re (Kreiseldarstellung ) triggere dann bekomme ich nen Bug. Er findet das Objekt nicht. (Wohl eweil ich die Labels umbenannt habe.

Anbei das File

Gruß,

Peter

Wie kann ich das jetzt in der alten UF umsetzen? welchen Fehler mache ich dort?

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 14.08.2020 22:20:00

Werner,.. also.. ich hab zuerst ne UF gebastelt. Bin dann auf die Idee gekommen wie gesagt, eine Multipage einzubauen.

Bin aber dann an der "Aufgabe" gescheitert den Datensatz über die Listbox und Data sheet zu ändern.

DEshalb hab ich eine neue UF gebastelt um den Zusammenhang zu verstehen.

Nun.. Dank Deiner Hilfe habe ich den Zusammenhang zwischen der Multipage und der UF verstanden.

Das hab ich jetzt versucht in der "Alten" UF umzusetzen. Und scheitere wieder.

Ich denke ich scheitere deshalb weil in der alten UF die Labels als auch Textboxen selbst mit Namen versehen habe. Anders als in der neuen UF. Hier holen sich die nummerierten Labels den Namen aus dem Sheet.



Was mache ich in der alten UF

In Frame 3 gebe ich als Bspl die Nummer 123456 ein. Wenn ich den cmd Button links davon triggere dann wird die LBx gefüllt. Wenn ich jetzt den CmdButton Re (Kreiseldarstellung ) triggere dann bekomme ich nen Bug. Er findet das Objekt nicht. (Wohl eweil ich die Labels umbenannt habe.

Anbei das File

Gruß,

Peter

Wie kann ich das jetzt in der alten UF umsetzen? welchen Fehler mache ich dort?

https://www.herber.de/bbs/user/139645.xlsm

Betrifft: AW: Sachstand Bearbeitung
von: ralf_b
Geschrieben am: 15.08.2020 11:57:02

weil es dort keine "Textbox1" gibt
i ist 1
Controls("TextBox" & i).Value
Und die Auswertung deiner Optionbutton "Lieferanten" ist auch murks.

zum Einen Überschreibst du mehrfach den Zellinhalt, anstatt den ausgewählten Optionbutton zu ermitteln.
die Objektbezeichnungen stimmen auch nicht überein. txt.DHL ist nicht txt_D

Betrifft: AW: Sachstand Bearbeitung
von: Matthias
Geschrieben am: 15.08.2020 12:18:16

Moin!
Wie Ralf schon schrieb, ist das Problem (u.a.) das deine Controls nun einen anderen Namen haben. Das könntest du beheben, in dem du entweder wie beim LIstbox_Click die Felder fest reinschreibst oder du legst dir ein Array mit den Namen an und durchläufst dieses Array und nimmst die Namen für deine Controls. Damit könntest du bei der Schleife bleiben.
Beim Zurückschreiben wird es aber noch ein anderes Problem geben.
Iim Code für das Zurückschreiben nimmst die Zeilennnummer mit der Zeile hier
lngZeile = ListBox3.Column(9, ListBox3.ListIndex)

Das ist aber nicht die Zeile des Datensatzes sondern der Eintrag der Spalte Q (KST NUmmer). Bei deinem Beispiel (wennman es so eingibt), steht dort dann 669810. DA deine Daten aber nur 150 Zeilen sind, ist das nicht gewollt. Da der Wert auch mehrfach vorkommt, wirst du damit nicht den richtigen Datensatz finden können. Um das sicherer zu machen, biete sich da immer an, in die Listbox die aktuelle Zeile mit aufzunehmen. Die Spalte musst du ja nicht mit anzeigen lassen. Wenn du dann eine Zeile selektierst, kann du die Zeile im Blatt auslesen und direkt auf den DAtensaz zugreifen. Da aber der Hinweis. Bei Additem kann die Listbox nur 10 Spalten haben (bei dir wäre die Spalte 2 noch frei). Wenn du da mehr Spalten brauchst, müsstest du ggf. die LIste anders befüllen.
Hört sich vllt. kompliziert an, ist aber eigentlich nicht so schwer.
FAlls du da noch Tipps / Hinweise / Beispiel brauchst, einfach melden.
VG

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 15.08.2020 18:37:30

Hallo Matthias,
Danke für den Hinweis
Ds mit den Cotrls habe ich soweit verstanden. Entsprechend habe ich den Code geändert.
Als Newbe in Schen VBA hab ich mich mit dem Array noch nicht so befasst. (obwohl ich vermute das dies der elegantere und übersichtlicher Code wäre).. doch die ösung dafür hab ich nicht.
Das mit
lngZeile = ListBox3.Column(9, ListBox3.ListIndex)hab ich auch schon bemerkt. Doch ehrlich gesagt .. ganz hab ich es nicht vertanden. beim Rest steh ich im Moment wie der "Ochs" vorm Berg :-)
Hier mal der Code hinsichtlich den Controls (wobei ich denke das die Schleife und damit der Text im Code .Cells(lngZeile,i) raus muss
Private Sub CommandButton3_Click()

Dim lngZeile As Long
  Dim i As Integer
  Dim wks As Worksheet
  
  
  'Zuerst prüfen, ob überhaupt ein Datensatz im Listenfeld markiert ist
  If ListBox3.ListIndex >= 0 Then
   lngZeile = ListBox3.Column(9, ListBox3.ListIndex)

   For i = 1 To 9

 Worksheets("DATA").Cells(lngZeile, i).Value = Me.Vorname.Value
 
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.FName.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.KST.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.OrgaCode.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.TeleNr.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.MailAdress.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.MailCC.Value
 Worksheets("DATA").Cells(lngZeile, i).Value = Me.MailBCC.Value
 
 
 
    Next i
   'Zurückschreiben in die ListBox
   For i = 1 To 9

    ListBox3.Column(i, ListBox3.ListIndex) = Controls("TextBox" & i + 1).Value

   Next i

  Else
   MsgBox "Bitte markiere einen Datensatz im Listenfeld!"
  End If

End Sub


Betrifft: AW: Sachstand Bearbeitung
von: Matthias
Geschrieben am: 15.08.2020 20:39:34

Moin!
Also von der Art her richtig. Damit weist du fest die Werte zu. Du musst nur noch bei dem cells die Spalte mit angeben. Die SChleife dort hilft nichts. Die braucht man bei dem Vorgehen nicht und bei deinem Code würde er immer alles in die selbe Zelle schreiben und dann zur nächsten gehen und wieder alles eintragen. Müsste so aussehen (nur einen Teil)
 If ListBox3.ListIndex >= 0 Then
   lngZeile = ListBox3.Column(0, ListBox3.ListIndex)'dass komm in der Datei 

Worksheets("DATA").Cells(lngZeile, 10).Value = Me.FName.Value
 Worksheets("DATA").Cells(lngZeile, 11).Value = Me.KST.Value

Bzgl der Nummer zum Eintragen, hier mal an deinem Code erklärt.
https://www.herber.de/bbs/user/139649.xlsm
Habe es mal in die Datei eingebaut. Änderungen bzw. erklären habe ich mal kommentiert. Geht aber nur um den LB Click den Button 34 und den Übertragebutton.
Ich habe dabei die Anordnung in der Listbox geändert. In Spalte 0 kommt jetzt die Zeilennummer. Die ist aber ausgeblendet und wird in der Box nicht mit angezeigt (habe da für Spalte 0 die Breite auf 0 gesetzt und den Rest macht VBA automatisch). In Spalte 1 kommt dann die Nummer und dann der Name. Musst da nur aufpassen, wenn sich noch andere Code darauf bezieht (in der Datei ist alles daran angepasst).
Zusätzlich lasse ich noch die Listbox leeren, da sonst beim zweiten Click der Text unten wieder angefügt wird.
Die Nummer fehlt übringes noch im Code. Da hast du der Textbox auch keinen Namen gegeben. Apropo Namen. Zur Verdeutlichung habe ich mal die Array Methode gewählt. Damit kann ich auch die Schleife wieder nutzen.
Kannst es dir ja mal anschauen.
VG

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 15.08.2020 22:22:23

Hallo Matthias,

jetzt habe ich weiteres dazu gelernt.. Die Sache mit dem Array. Danke schön!

In der Sache seelbst ist es so das ich mit dem cmd Button 34 eine Nummer suchen möchte

Bspl ich geb die 123456 ein triggere den Button und der füllt mir die LBx. In column 1 der Litsbox stehr dann die Nummer in Colm 2 der Name etc die Zeile kann dann am Schluß stehen.

Wenn ich jetzt den Eintrag mit der Nummer 123456 anklicke füllt er mir oben die Textboxen. Hintergrund ist das ich zBspl aus dem Vornamem Pipi Pipi Q machen oder aus Langstrumpf ; Lang

Sprich.. ich will irgendeinen Eintrag in der Textbox ändern.

Das will ich gern mit dem cmd Btn 3 erreichen

Wenn ich ihn triggere dann übernimmt er mir die Änderung in der LB als auch im Sheet Data

Mit Deiner Hilfe bin ich da schon recht weit gekommen. Was er aber bislang macht ist das er die Änderung in der Textbox zwar auch übernimmt aber dann in eine andere Column der Listbox schreibt. Und schon gar nicht die Änderung im Worksheet DaTA vornimmt. Das hab ich noch nicht recht verstanden

Betrifft: AW: Sachstand Bearbeitung
von: Matthias
Geschrieben am: 16.08.2020 19:45:00

Moin!
Also in der Datei gestern, hatte ich die Zeillennummer in die 1. Spalte der Listbox (mit dem INdex 0 ) gepackt. Hintergrund ist / war der, dass man dabei am Code nicht zuviel ändern musste und die 1. Stelle ist immer am besten. So kann man beliebig die LB nach rechts (also bis zu insg. 10 Spalten sonst anders) erweitern und braucht sich nicht um die Spalte mit den NUmmer kümmern (die ist immer am Anfang). Würde ich bei dir auch lassen. Ansonsten müssen man die Zuordnung für die Spalten 3 bis 9 ändern.
Zum Button CB3. Den hatte ich gestern in der Datei schon mit geändert. Habe eben nochmal geschaut. Bei mir macht er die Änderung beim Anklicken sowohl im Blatt als auch der LB. Also eigentlich sollte das passen. Wenn du das Beispiel von gestern in deine Datei eingebaut hast, dann poste die bitte nochmal. Dann kann man schauen, woran es liegt. Ansonsten mal ein Knackpunkt. HIer
Worksheets("DATA").Cells(lngZeile, i + 8).Value = mycontr(i) 'Controls("TextBox" & i).Value

Musst du bei dem Cells noch einen Versatz (hier die + 8) mitgeben. Da dort der Einfachheit halber beim cells und dem array der selbe INdex (i) genutzt wird, die aber an verschiedenen Stellen anfangen ( im Array bei 2 und auf dem Blatt bei 10), musst da noch die + 8 hinzu. Ansonsten startet der Eintrag die 8 Spalten zu früh.
Wie gesagt, teste nochmal mit der Datei von mir gestern und / oder poste mal bitte deine mit dem Fehler. Aber beachte, dass die LB bei Spalte 0 die Zeile hat, dann die Nummer kommt, Dann der Name und dann wie bei dir.
VG

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 17.08.2020 06:49:39

Moin Matthias! Hey! Danke für die Geduld, Erklärung , Tipps als auch Unterstützung!
Hat mir echt viel geholfen!
Ich habs nach langem probieren dann doch hinbekommen. Hab recht herzlichen Dank!
Ich schick Dir gerne das was ich nun habe.
Womit ich mich noch befassen muss ist der sog. Listindex .. den sollte ich noch tiefer verstehen.
Anbei die Datei
VG
Pete

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 17.08.2020 06:52:27

Moin Matthias! Hey! Danke für die Geduld, Erklärung , Tipps als auch Unterstützung!
Hat mir echt viel geholfen!
Ich habs nach langem probieren dann doch hinbekommen. Hab recht herzlichen Dank!
Ich schick Dir gerne das was ich nun habe.
Womit ich mich noch befassen muss ist der sog. Listindex .. den sollte ich noch tiefer verstehen.
Anbei die Datei
VG
Pete
https://www.herber.de/bbs/user/139658.xlsm

Betrifft: AW: Sachstand Bearbeitung
von: Matthias
Geschrieben am: 17.08.2020 23:43:58

Moin!

Schön, wenn es läuft. Da keine wirklichen Fragen mehr aufkamen, hier noch schnell eine Erklärung zum Listindex.

Der kommt bei Comboboxen, Listboxen und anderen vor. Damit kannst du auswerten, welcher Wert der Eintragungen ausgewählt wurde. Bei listindex = -1 ist nichts ausgewählt. Ansonsten geht die Auswahl bei 0 los (0 basiert). Das heißt der erste Eintrag hat den Index 0 der zweite den INdex 1 usw.. Da muss man ggf. immer eins dazu addieren.

Aber ein Hinweise. Bei LIstboxen kann man auch multiselect auswählen und damit mehrere Felder auswählen. Da geht dann kein listindex, da VBA ja nur einen Wert zurück gibt, dies aber bei mehreren nicht möglich ist. In diesem Fall musst du die Liste durchgehen und mit der Eigenschaft selected prüfen, ob der Eintrag ausgewählt wurde.

Sollten noch mehr Fragen bestehen, dann einfach melden.

Weiterhin viel Spaß.

VG

Betrifft: AW: Sachstand Bearbeitung
von: Pete
Geschrieben am: 19.08.2020 18:46:11

HI Matthias!
Jetzt habe ich die Sache auch mit dem Listindex verstanden
Entweder ich wähle keinen Eintrag aus der Listbox aus (LNdex -1)oder ich wähle einen Eintrag aus
( Lndex 1) 2 Einträge etc (Lndex 2) usw
Ich kann mir aber die Nummerierung mittels Multiselect "sparen" (und damit, zunächst, VBA Code)
Dann allerdings muss ich der "Maschine" sagen welch Einträg er wählen, beachten soll ("selected")

zu Fragen :-) Ja habe ich :-)
ich vermute mal das ich einen weiteren Thread öffen muss / sollte
denn dem Grunde nach geht es da darum ein bestimmtes File in einem bestimmten Ordner der sich auf einem anderen Laufwerk befindet, zu finden und entweder auf den Desktop oder in ein geöffnetes Re Mail (bedeutet ..habe die Mail des Senders geöffnet und habe auf Re oder bearbeiten geklickt)
mtes File das in einem Ordner in einem anderen Pfad liegt