Dieses Forum nutzt Cookies
Dieses Forum verwendet Cookies, um deine Login-Informationen zu speichern, wenn du registriert bist, und deinen letzten Besuch, wenn du es nicht bist. Cookies sind kleine Textdokumente, die auf deinem Computer gespeichert werden. Die von diesem Forum gesetzten Cookies werden nur auf dieser Website verwendet und stellen kein Sicherheitsrisiko dar. Cookies aus diesem Forum speichern auch die spezifischen Themen, die du gelesen hast und wann du zum letzten Mal gelesen hast. Bitte bestätige, ob du diese Cookies akzeptierst oder ablehnst.

Ein Cookie wird in deinem Browser unabhängig von der Wahl gespeichert, um zu verhindern, dass dir diese Frage erneut gestellt wird. Du kannst deine Cookie-Einstellungen jederzeit über den Link in der Fußzeile ändern.

VBA CommandButton verknüpfen mit Zelle
#1
Hallo Excel- Freunde,

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.
Zitat:
ActiveCell.FormulaR1C1 = "=Tabelle2!R[1]C"
Range("C2").Select
ActiveCell.FormulaR1C1 = "=Tabelle2!R[1]C"
Range("C3").Select


=> 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?


Über eine Antwort freue ich mich sehr.

MfG und einen schönen Abend noch!
Antworten Top
#2
(08.01.2015, 20: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?Huh

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:
  • Travis5002
Antworten Top
#3
Hallo Max,

du hast recht, nach erneutem Lesen sind auch mir einige Unklarheiten in meiner Beschreibung aufgefallen, sorry dafür, war ein langer Tag heuteIdea

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?

Schau es dir am besten selbst mal an.

Dankend,

Travis5002


Angehängte Dateien
.xlsm   VBA Versuch.xlsm (Größe: 33,81 KB / Downloads: 11)
Antworten Top
#4
Hi,

(08.01.2015, 22: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:
  • Travis5002
Antworten Top
#5
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"

Dann habe ich die Tabelle2 so umgestellt:

Arbeitsblatt mit dem Namen 'Tabelle2'
 ABCDEFGHI
1NameBreitePreis AusführungenPreis ExtrasPreis
2Tisch1600700,00 € Wellenmontage1.000,00 € Teststand600
3Tisch2800800,00 € Deckelmontage1.100,00 € Lötstation700
4Tisch31000900,00 € Elektrikmontage1.200,00 € Lampe120
5Tisch412001.000,00 € Rädermontage1.300,00 €   
6Tisch514001.100,00 €      
7Tisch615001.200,00 €      
8Tisch716001.300,00 €      
9Tisch818001.400,00 €      
10Tisch920001.500,00 €      
Diese Tabelle wurde mit Tab2Html (v2.4.1) erstellt. ©Gerd alias Bamberg

Genauso muss sie aufgebaut sein, damit der eingestellte Code funktioniert.

Hier Deine Testmappe:


.xlsm   VBA Versuch.xlsm (Größe: 30,09 KB / Downloads: 9)
Gruß Atilla
[-] Folgende(r) 1 Nutzer sagt Danke an atilla für diesen Beitrag:
  • Travis5002
Antworten Top
#6
Hallo,

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.

Gruß
Max
Antworten Top
#7
Hi,

(09.01.2015, 09:29)atilla schrieb: Genauso muss sie aufgebaut sein, damit der eingestellte Code funktioniert.

ja, das ist auch für meinen Vorschlag der beste Aufbau, dann können beliebig viele Auswahlpunkte pro Parameter untereinander stehen.

Ich halte meine Lösung für deutlich flexibler und es ist bedeutend weniger Aufwand als die Lösung mit Deinen vielen Userforms.

.xlsm   VBA Versuch - Rabe.xlsm (Größe: 36,93 KB / Downloads: 6)
Antworten Top
#8
Hallo Ralf,

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.
Gruß Atilla
Antworten Top
#9
Hi Atilla,

(09.01.2015, 10:28)atilla schrieb: das sind nicht meine Userforms. Ich habe lediglich den Code für das eingestellte Beispiel beigesteuert.

ich weiß, denn ich hatte mit "Deinen Userforms" seine (TE) und nicht Deine (atilla) gemeint.
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste