ich bin relativ neu auf dem VBA Gebiet und bin gerade dabei eine kleine Aufgabe zu lösen. Ich bastel im Grunde gerade an einem Produktkonfigurator rum, um Preise für Arbeitstische zu ermitteln. In Tabelle1 stehen also die Preise und Features etc, in Tabelle2 öffnen sich Userforms, bei denen man auswählen kann, welche Features man für seinen Arbeitsplatz haben will. Im Hintergrund werden von Tabelle2 die Preise aufgelistet, die ich durch das Aufzeichnen eines Makros für den jeweiligen Commandbutton eingefügt habe.
=> Jetzt zu meiner Frage. Die ganze Nummer ist ziemlich komplex, Tabelle1 hat ca500 Zeilen und 35 Spalten, dass sich da bald was ändert ist sehr wahrscheinlich. Wenn ich da jetzt zwingendermaßen eine Zeile einfügen muss, steht der gesuchte Wert bspw. nicht mehr in C2 sondern in C3 und die ganze Rechnung stimmt nicht mehr. Hat jemand eine andere Idee wie man durch das Klicken eines Commandbutton in einer Userform einen bestimmten Wert auf einem Tabellenblatt erscheinen lassen kann?
(08.01.2015, 21:48)Travis5002 schrieb: ...In Tabelle1 stehen also die Preise und Features etc, in Tabelle2 öffnen sich Userforms, bei denen man auswählen kann, welche Features man für seinen Arbeitsplatz haben will. Im Hintergrund werden von Tabelle2 die Preise aufgelistet, die ich durch das Aufzeichnen eines Makros für den jeweiligen Commandbutton eingefügt habe...
Hi,
etwas verwirrend Deine Beschreibung. In Tabelle 1 stehen Preise, in Tabelle 2 findet eine Auswahl statt und dann werden die Preise von Tabelle 2 aufgelistet?
Ich nehme aber an, Du hast in Tabelle 1 so etwas wie Artikelnummern für "Baugruppen/Elemente". Nun willst Du irgendwo in Tabelle 2 den Preis für die ausgewählten Elemente ermitteln. Das sollte am einfachsten über die Artikelnummer funktionieren. Sprich man wählt ein Element aus, das im Idealfall eine eindeutige Artikelnummer in Tabelle 1 hat. Hierüber könnte man den entsprechenden Preis aus Tabelle 1 auslesen.
Das ist aber alles sehr theoretisch und ohne den Aufbau und die Struktur Deiner Daten zu kennen, in den blauen Dunst hinein kaum zu bewerkstelligen. Vielleicht ist es Dir möglich, eine anonymisierte Beispieldatei hier einzustellen? Wie das geht steht hier: http://www.clever-excel-forum.de/thread-326.html
Gruß Max
Folgende(r) 1 Nutzer sagt Danke an Max für diesen Beitrag:1 Nutzer sagt Danke an Max für diesen Beitrag 28 • Travis5002
du hast recht, nach erneutem Lesen sind auch mir einige Unklarheiten in meiner Beschreibung aufgefallen, sorry dafür, war ein langer Tag heute
Im Grunde soll der Nutzer nicht nach einer Artikelnummer suchen, sondern sich nach Belieben einen individuellen Tisch konfigurieren können.
Habe soeben eine stark vereinfachte Beispieldatei erstellt. Komme bei dieser Datei schon auf 17 aufgezeichnete Makros die jeweils auf eine exakte Zelle im Nachbarblatt verweisen und somit etwaige Änderungen im Quelltabellenblatt unmöglich machen. Gibt es da nicht eine einfachere bzw. klügere Lösung?
09.01.2015, 09:21 (Dieser Beitrag wurde zuletzt bearbeitet: 09.01.2015, 11:20 von Rabe.)
Hi,
(08.01.2015, 23:54)Travis5002 schrieb: Im Grunde soll der Nutzer nicht nach einer Artikelnummer suchen, sondern sich nach Belieben einen individuellen Tisch konfigurieren können.
ich würde es so aufbauen, daß ich die Auswahlmöglichkeiten nicht in einzelne Userforms lege, sondern in eine gemeinsame Userform und dort die Möglichkeiten jeweils als Listbox. Dann die Zellbereiche in den Listboxen aufzählen.
Also für Dein Einfachbeispiel: 1 Userform mit 3 Listboxen.
Hier das Makro dazu:
Code:
Option Explicit
Private Sub UserForm_Initialize() Dim loLetzte As Long With ListBox1 .ColumnCount = 2 'Anzahl Spalten .ColumnWidths = "1cm;1cm" 'Spaltenbreite .ColumnHeads = True 'Spalten-Überschriften loLetzte = Sheets("Tabelle2").Range("A65536").End(xlUp).Row ListBox1.RowSource = "Tabelle2!B2:C" & loLetzte 'oder: ' ListBox1.RowSource = "Tabelle2!B2:C10" 'Quellbereich End With With ListBox2 .ColumnCount = 2 .ColumnWidths = "3cm;1,5cm" .ColumnHeads = True loLetzte = Sheets("Tabelle2").Range("E65536").End(xlUp).Row ListBox2.RowSource = "Tabelle2!E2:F" & loLetzte End With With ListBox3 .ColumnCount = 2 .ColumnWidths = "1,5cm;1,5cm" .ColumnHeads = True loLetzte = Sheets("Tabelle2").Range("H65536").End(xlUp).Row ListBox3.RowSource = "Tabelle2!H2:I" & loLetzte End With End Sub
Private Sub CommandButton1_Click() 'OK-Button 'hier die Übernahme der Auswahl in die Tabelle1 Sheets("Tabelle1").Range("B2").Value = ListBox1.List(ListBox1.ListIndex, 0) Sheets("Tabelle1").Range("B3").Value = ListBox2.List(ListBox2.ListIndex, 0) Sheets("Tabelle1").Range("B4").Value = ListBox3.List(ListBox3.ListIndex, 0) Sheets("Tabelle1").Range("C2").Value = ListBox1.List(ListBox1.ListIndex, 1) Sheets("Tabelle1").Range("C3").Value = ListBox2.List(ListBox2.ListIndex, 1) Sheets("Tabelle1").Range("C4").Value = ListBox3.List(ListBox3.ListIndex, 1)
UserForm4.Hide 'Ausblenden der Userform (gewählte Werte bleiben für neue Auswahl markiert) End Sub
Private Sub CommandButton2_Click() 'Abbruch Unload Me 'Schließen der Userform End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then MsgBox "Userform mit OK - oder Abbruch - Button beenden", vbInformation, "Hinweis" Cancel = True End If End Sub
Und immer so weiter bis Du Deine 35 Konfigurationsmöglichkeiten hast. Wenn es nur 2-3 Auswahlpunkte sind, könnten dann auch Checkboxen verwendet werden statt einer Listbox. Wenn es zu viele Listboxen werden, kannst Du die dann auch über Multipages verteilen. Oder mehrere Userformen hintereinander aufrufen, so wie Du es momentan machst.
Folgende(r) 1 Nutzer sagt Danke an Rabe für diesen Beitrag:1 Nutzer sagt Danke an Rabe für diesen Beitrag 28 • Travis5002
09.01.2015, 10:29 (Dieser Beitrag wurde zuletzt bearbeitet: 09.01.2015, 10:49 von atilla.)
Hallo,
unten ein Lösungsvorschlag für Deine Beispielmappe. Bitte alles Code hinter den Userformen löschen und die unten aufgeführten einfügen:
Code für Userform1:
Code:
Option Explicit
Private Sub CommandButton1_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton10_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton11_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton12_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton13_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton14_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton7_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton8_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub CommandButton9_Click() Call tischPreis Unload Me UserForm2.Show End Sub
Private Sub tischPreis() Dim x With Sheets("Tabelle2") x = Application.Match(CDbl(ActiveControl.Caption), .Columns(2), 0) Range("B2") = CDbl(ActiveControl.Caption) Range("C2") = .Cells(x, 3) End With End Sub
Code für Userform2:
Code:
Option Explicit
Private Sub CommandButton1_Click() ' ' Wellenmontage Makro ' Call Montagekit Unload Me UserForm3.Show End Sub
Private Sub CommandButton3_Click() ' ' Elektrikmontage Makro ' Call Montagekit Unload Me UserForm3.Show End Sub
Private Sub CommandButton4_Click() ' ' Rädermontage Makro ' Call Montagekit Unload Me UserForm3.Show End Sub
Private Sub CommandButton5_Click() ' ' Deckelmontage Makro ' Call Montagekit Unload Me UserForm3.Show End Sub
Private Sub Montagekit() Dim x With Sheets("Tabelle2") x = Application.Match(ActiveControl.Caption, .Columns(5), 0) Range("B3") = ActiveControl.Caption Range("C3") = .Cells(x, 6) End With End Sub
Code für Userform3:
Code:
Option Explicit
Private Sub CommandButton1_Click() ' ' Teststation Makro '
' Call Extras Unload Me
End Sub
Private Sub CommandButton2_Click() ' ' Lampe Makro '
' Call Extras Unload Me End Sub
Private Sub CommandButton3_Click() ' ' Lötstation Makro '
' Call Extras Unload Me End Sub
Private Sub CommandButton4_Click() Range("B4").ClearContents Range("C4").ClearContents Unload Me End Sub
Private Sub Extras() Dim x With Sheets("Tabelle2") x = Application.Match(ActiveControl.Caption, .Columns(8), 0) Range("B4") = ActiveControl.Caption Range("C4") = .Cells(x, 9) End With End Sub
Die Schaltflächen müssen genauso benannt sein, wie die Bezeichnungen in der Tabelle, sonst kommt es zum Fehler. Z.B: Userform2 Schaltfläche 3 heißt "Elektrickmontage" in der Tabelle steht: "Elektrikmontage"
ich schließe mich Ralf an. Dann ist es auch egal, ob Du später irgendwann mal weitere Positionen ergänzt, da sich die Listboxen bei öffnen der Userform füllen.
Allerdings ist Dein Beispiel vielleicht auch zu simplifiziert, denn Du schreibst oben
Zitat:...Tabelle1 hat ca500 Zeilen und 35 Spalten...
In Deiner Beispieldatei kommst Du gerade auf 3 Spalten. Alternativ könnte man so etwas auch über Dropdowns lösen.
Zitat:Ich halte meine Lösung für deutlich flexibler und es ist bedeutend weniger Aufwand als die Lösung mit Deinen vielen Userforms.
das sind nicht meine Userforms. Ich habe lediglich den Code für das eingestellte Beispiel beigesteuert. Wenn ich selber so etwas bräuchte, dann würde ich es auch so wie Du aufziehen oder mit Comboboxen arbeiten.
Ich weiß aber nicht was der TE möchte. So etwas könnte man z.B. seinen Kunden auf einem Touchscreen anbieten, auf dem man dann nur drauf klicken muss. Das ist dann auch sehr anwenderfreundlich. Wenn dann mehr Schaltflächen ins Spiel kommen, dann geht das auch einfach per Klassenprogrammierung.