Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1216to1220
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

CommandButton Bezeichnung aus Zelle pp.

CommandButton Bezeichnung aus Zelle pp.
Dietmar
Hallo in die Abendrunde,
mit nachfolgendem Code, der durch die Betätigung eines CommandButtons ausgelöst wird, möchte ich Artikel erfassen. Der Code steht exemplarisch für eine ganze Reihe von gleichartigen Buttons.
Im Tabellenblatt -Verkauf-, in dem sich die Buttons befinden, wird ein kleines Journal geführt, das zwischendurch immer wieder geleert wird. Und auf einer Seite -Protokoll- werden alle Daten fortlaufend erfasst.
Private Sub CommandButton1_Click()
CommandButton1.Caption = Cells(2, 3).Value
Dim rng As Range
With Worksheets("Verkauf")
For Each rng In .Range("h2:h20")
If rng.Value = "" Then
rng = Worksheets("Verkauf").Range("C2").Value
rng.Offset(, 1) = CLng(Worksheets("Verkauf").Range("D2").Value)
Exit For
End If
Next
End With
With Worksheets("Protokoll")
For Each rng In .Range("a2:a2000")
If rng.Value = "" Then
rng = Worksheets("Verkauf").Range("C2").Value
rng.Offset(, 1) = CLng(Worksheets("Verkauf").Range("D2").Value)
Exit For
End If
Next
End With
End Sub

Der Code läuft soweit ganz gut durch, aber mir gefallen drei Dingen noch nicht:
a) Die Bezeichnung des CommandButtons aus der Zelle C2 wird erst im Button sichtbar, wenn dieser betätigt
wurde. Es soll aber so sein, dass die Bezeichnung geändert wird, sobald der Eintrag in der Zelle geschehen
ist.
b) Beim wiederholten Betätigen des gleichen Buttons soll keine neue Zeile beschrieben werden, sondern in der
Spalte Offset (, 3) die Anzahl der Betätigungen angegeben werden.
c) und dann gefällt mir der Code insgesamt noch nicht. Kann man den besser zusammenfassen?
Danke für jede Idee!
Viele Grüße
Dietmar
Teilantwort ...
20.06.2011 23:41:12
Matthias
Hallo
zu a.)
Die Bezeichnung des CommandButtons aus der Zelle C2 wird erst im Button sichtbar, wenn dieser betätigt
wurde. Es soll aber so sein, dass die Bezeichnung geändert wird, sobald der Eintrag in der Zelle geschehen
ist.

Dann solltest Du nicht das Click-Ereignis des Button benutzen,
sondern das Worksheet_Change-Ereignis der Tabelle
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
With Tabelle1
.CommandButton1.Caption = .Range("B2")
End With
End Sub

oder so:
Private Sub Worksheet_Change(ByVal Target As Range)
With Tabelle1
If Target.Address = .Range("B2").Address Then
.CommandButton1.Caption = .Range("B2")
End If
End With
End Sub

oder besser gleich so:
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then
Tabelle1.CommandButton1.Caption = Range("B2")
End If
End Sub

Userbild
Anzeige
1. Teilantwort Prima!
21.06.2011 12:52:45
DietmarZ
Hallo Matthias,
vielen Dank! insbesondere auch für die Beispeildatei.
Das sieht gut aus, damit komme ich bestens klar!
Hoffe nun, dass sich noch jemand für den 2. Teil meiner Frage findet, sonst müsste ich den Betrag wohl nochmals splitten.
Herzliche Grüße
Dietmar
AW: 1. Teilantwort Prima!
21.06.2011 15:06:40
hary
Hallo Dietmar
Hab mal Matthias seinen Code ausgeliehen. Machs mit einem zaehler.

Option Explicit
Dim zaehler As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then
Tabelle1.CommandButton1.Caption = Range("B2")
End If
End Sub
Private Sub CommandButton1_Click()
With Tabelle1
If zaehler = 0 Then
.Range("B7") = .CommandButton1.Caption
zaehler = zaehler + 1
Else
zaehler = zaehler + 1
.Range("B7").Offset(, 3) = zaehler
End If
End With
End Sub

gruss hary
Anzeige
Komme noch nicht klar, hier mein Code
21.06.2011 22:02:54
Dietmar
Hallo Harry,
herzlichen Dank!
Bzgl. der Bezeichnung des CMD bin ich nun klar.
Allerdings bekomme ich es noch nicht hin, dass beim wiederholten Betätigen eines CMD hochgezählt wird. Deinen Vorschlag kann ich irgendwie nicht richtig verarbeiten.
Zur Erklärung:
Ich bediene mit dem CMD zunächst ein einfachen Kassen-Bon-Bereich auf der gleichen Seite (Verkauf), auf der sich die Steuerelemente befinden. Die dazugehörigen Daten (=Produkte) beziehe ich aus der Seite "Listen". Der Kassen-Bon-Bereich auf der Verkaufsseite geht von A11:A20.
Gleichzeitig wird auf der Seite "Protokoll" endlos (hier beispielhaft bis Zeile 2000) jede Buchung erfasst.
Nun soll es so sein, dass beim wiederholten Betätigen des gleichen Buttons die Buchung nicht in eine neue Zeile geschrieben wird, sondern (da es ja das gleiche Produkt ist) die Anzahl in der gleichen Zeile hochgezählt wird.
Hier mein Code für 1 Button (letztlich sollen es ca. 50 werden).
Ich brauchte jetzt noch einen Offset (, 2)-Eintrag auf der Verkaufsseite und auf der Protokollseite, der die Anzahl hochzählt; und zwar so oft wie der gleiche Button gedrückt wird (vorliegend nur dieser eine).
Private Sub CommandButton2_Click()
Dim rng As Range
With Worksheets("Verkauf")
For Each rng In .Range("a11:a20")
If rng.Value = "" Then
rng = Worksheets("Listen").Range("A3").Value                           'hier steht das  _
Produkt
rng.Offset(, 1) = CLng(Worksheets("Listen").Range("C3").Value) 'hier wird der Preis des  _
Produktes bezogen
'>>>hier fehlt m.E. nun noch ein Zähler mit Offset(, 2), der hochzählt, wenn der Button  _
hintereinander nochmals gedrückt wird
Exit For
End If
Next
End With
With Worksheets("Protokoll")
For Each rng In .Range("a2:a2000")
If rng.Value = "" Then
rng = Worksheets("Listen").Range("A3").Value
rng.Offset(, 1) = CLng(Worksheets("Listen").Range("C3").Value)
'>>>hier fehlt m.E. nun noch ein Zähler mit Offset(, 2), der hochzählt, wenn der Button  _
hintereinander nochmals gedrückt wird
Exit For
End If
Next
End With
End Sub
Ich bin sehr gespannt, ob das geht.
Vielen Dank!
Viele Grüße
Dietmar
Anzeige
AW: Komme noch nicht klar, hier mein Code
22.06.2011 08:09:13
Dirk
Hallo!
Du musst definieren, wann hochgezaehlt werden soll und wann das Makro ausgefuehrt werden soll (da muss dann entsprechend verzweigt werden). Ich gehe mal davon aus das beim zweiten Klick nur der Zaehler hochgezaehlt werden soll.
Damit das Makro wieder laeuft, musst Du ueber einen Vergleich (z.B. Datum) die variable Btn2_Klicked wieder auf False setzen.
Koennte man ueber eine boolean Abfrage machen.
koennte so gehen (ungetestet)
In ein Modul folgende Befehle:
Global Btn2_Klicked as Boolean
Global Btn2KlickCnt as long
Private Sub CommandButton2_Click()
Dim rng As Range
if Btn2_Klicked = True then
Btn2KlickCnt=Btn2KlickCnt+1
exit sub
else
Btn2_Klicked = True
Btn2KlickCnt=1
end if
With Worksheets("Verkauf")
For Each rng In .Range("a11:a20")
If rng.Value = "" Then
rng = Worksheets("Listen").Range("A3").Value                           'hier steht das  _
Produkt
rng.Offset(, 1) = CLng(Worksheets("Listen").Range("C3").Value) 'hier wird der Preis des   _
_
Produktes bezogen
Exit For
End If
Next
End With
With Worksheets("Protokoll")
For Each rng In .Range("a2:a2000")
If rng.Value = "" Then
rng = Worksheets("Listen").Range("A3").Value
rng.Offset(, 1) = CLng(Worksheets("Listen").Range("C3").Value)
Exit For
End If
Next
End With
End Sub

Anzeige
Beispieldatei dabei
22.06.2011 12:40:25
Dietmar
Hallo Dirk,
vielen Dank, aber ich hab's nicht hinbekommen. Vielleicht drücke ich mich auch nicht genau genug aus.
Habe meine Beispieldatei deshalb mal beigefügt.
Könntest Du mir mal Deine Ergänzungen einbauen.
Herzlichen Dank!
https://www.herber.de/bbs/user/75404.xls
Viele Grüße
Dietmar
SUPER !
22.06.2011 18:38:49
Dietmar
Hallo Dirk,
ganz lieben Dank! Das ist schon echt stark! So sollte es funktionieren.
Begeisterte Grüße nach Dubai
Dietmar aus Aachen
Anzeige
Nun doch noch eine Frage
22.06.2011 21:18:52
Dietmar
Hallo Dirk,
habe den Code nun einmal etwas genauer ansehen können. Dabei stoße ich auf eine Schwierigkeit für meine Belange.
Ich möchte die Nutzer der Verkaufsseite zukünftig mit einem Update immer auf neuestem Stand halten. Das geht aber nur, wenn alle Daten in Code selbst variabel gehalten werden, da ich per Update nicht in den code kann/möchte.
Es ist dann so, dass der Button "Butter" und die dazugehörigen Daten sich zukünftig ändern werden. Dann möchte ich über die Änderung der Daten im Tabellenblatt "Listen" alles steuern können.
Deshalb habe ich auch die Namensgebung der Steuerelement über den Bezug zum Sheet "Listen" geregelt.
Daher meine Frage:
Lassen sich die in Deinem Code verwendeten Begriffe wie "Butter", "Reis" pp. auch über eine Range-Bezeichnung variabel gestalten?
Vielen Dank!
Verregnete Grüße aus Aachen
Dietmar
Anzeige
AW: Nun doch noch eine Frage
23.06.2011 10:04:01
Dirk
Hallo Dietmar,
neue Version mit einigen Anpassungen. Alles dynamisch und zusaetzlich farbliche Markierung der unterschiedlichen Kassenbons im Protokoll.
https://www.herber.de/bbs/user/75419.xls
Gruss
Dirk aus Dubai
AW: Nun doch noch eine Frage
23.06.2011 14:30:11
Dirk
Hallo nochmal,
hier nochmal vereinfacht. Da kannst Du die notwendigen zusaetzlichen Buttons ganz einfach dazu nehmen.
https://www.herber.de/bbs/user/75426.xls
Lass' hoeren, ob ok.
Gruss
Dirk aus Dubai
einfach nur genial!
23.06.2011 21:58:13
Dietmar
Hallo Dirk,
ganz lieben Dank!
Die Idee mit der farblichen Unterlegung der einzelnen Buchungen, die ins Protokoll übertragen werden ist einfach klasse!
Insbesondere auch, dass nun bei einer wiederholten Buchung die Anzahl hochgezählt wird auch wenn zwischendurch ein anderer Button betätigt wurde.
Ich werde mich jetzt dransetzen, die gesamte Produktpalette zu erfassen. Wenn's auch viel Arbeit ist - ich freu mich schon drauf, da Dein Code-Konzept optimal ist!
Da es erforderlich ist, auch die Protokolldatei am Ende eines Tages zu bereinigen, habe ich nachfolgenden Code vorgesehen. Dieser berücksichtigt allerdings nicht den genutzten Bereich, sondern den Bereich pauschal bis Zeile 2000. Das ist m.E. auch ok. Oder sollte ich das besser anders angehen?
Sub ProtokollLeeren()
With ActiveSheet
.Range("A2:D2000").ClearContents
.Range("A2:D2000").Interior.ColorIndex = xlNone
End With
End Sub
Liebe Grüße
Dietmar aus Aachen
Anzeige
Vorsicht! mit ActiveSheet ...
24.06.2011 08:23:53
Matthias
Hallo
Wenn schon dann so:
With Worksheets("Protokoll")
...
also benutze auch das richtige Blatt,
Denn wenn Du Dich im Blatt("Verkauf") befindest und den Code ausführst
ist Dein Kassenbon futsch ;-)
Userbild
AW: Vorsicht! mit ActiveSheet ...
24.06.2011 13:20:42
Dirk
Hallo Dietmar,
habe noch mal nachgedacht und noch etwas verbessert. Das macht dann die Datenpflege und anpassung einfacher fuer Dich
https://www.herber.de/bbs/user/75437.xls
Gruesse aus der Hitze
Dirk aus Dubai
Anzeige
Achtung bei i-1 !
25.06.2011 08:00:31
Matthias
Hallo Dirk
Also erstmal Respekt! Gut gelungen :o)
Ich habe das natürlich alles mitverfolgt.
Mir ist aufgefallen das beim Klick auf "Bon leeren" zwingend etwas im Protokoll stehem muß
Ich gehe mal davon aus das Dietmar mit einem leeren Protokoll beginnen will.
Lösche mal das Protokoll händisch (bis auf die Überschrift)und entferne auch die Hintergrundfarbe.
Jetzt klicke mal auf "Bon leeren" (auch wenn der Bon noch leer ist)


Dadurch hat hier:
  If .Cells(i, 1).Interior.ColorIndex .Cells(i - 1, 1).Interior.ColorIndex Then
i den Wert 1 (Cells(i - 1, 1)) - Das geht aber nicht, also meckert VBA !


Dietmar wollte ja noch einen Code mit "Protokoll leeren" einbauen
Das solltest Du noch anpassen, um dann im Vorfeld diesen Fehler zu vermeiden.
Trotzdem, Super gelungenes Projekt :o)
Userbild
Anzeige
Wow! mir fehlen die Worte ...
25.06.2011 11:15:23
Dietmar
Hallo Dirk,
meine Begeisterung war schon am oberen Level angelangt ... und nun diese TOP-Lösung!
Habe Deinen Code gerade freudig-kopfschüttelnd bewundert! Das scheint mir unschlagbar zu sein!
Bei dieser Lösung überlege ich, eine Erweiterung vorzunehmen. Dann werden es aber mehr als 100 Buttons
werden; die Obergrenze wären ca. 250; ein bisschen scrollen wäre dann aber nicht schlimm. An welcher Schraube müsste ich drehen?
Hast Du Dir mal meine Idee zur notwendigen Löschung des Protokolls angeschaut? Wirk noch etwas unbeholfen, geht aber. Ich werde den Rat von Matthias allerdings befolgen und ohne ActiveSheet arbeiten.
Hier nun erste Boten eines Wetterumschwungs - Mo. 34 Grad.
Wünsche Dir ein schönes WE!
Begeisterte Grüße nach Dubai
Dietmar aus Aachen
Hallo Dirk ...
25.06.2011 11:19:21
Dietmar
Hallo Dirk ...
schau mal bitte in die Antwort Rtg. Matthias. Habe nicht aufgepasst, als ich im Taumel meiner Begeisterung einfach drauf los getippt hatte. :-)
Dort steht auch meine neue Idee, die durch Deine Lösung bzgl. der komfortablen Pflegemöglichkeit entstanden ist.
Herzliche Grüße
Dietmar aus Aachen
Danke für den Tipp ...
25.06.2011 11:21:05
Dietmar
Hallo Matthias,
das werde ich jedenfalls so machen, denn die Gefahr ist sonst sicherlich zu groß, dass ein falscher Bereich gelöscht wird.
Danke und ein schönes WE!
Viele Grüße
Dietmar aus Aachen
Enträtselung Deines Codes ...
25.06.2011 23:13:04
Dietmar
Hallo Dirk,
ich bin dabei Deinen Code mit meinen bescheidenen VBA-Kenntnissen zu analysieren.
Teilweise gelingt mir dies bereits.
Was ich noch nicht herausgefunden habe:
Ich habe in "Listen" eine neue Spalte (Spalte B) eingefügt, in die ich eine "Produktbezeichnung lang" eintrage. Alles andere rückt dann nach rechts.
Auf dem Button selbst soll unverändert Name der Spalte A erscheinen (dies soll die Kurzbezeichnung sein, um Platz zu sparen). Im KassenBon und im Protokoll soll aber der ausführliche "Produktname lang" stehen.
Habe es schon in etwa herausgefunden.
Es hapert aber noch daran, dass dann die Anzahl hochgezählt wird, wenn der entsprechende Button mehrmals betätigt wird. Die diesbezüglichen Abhängigkeiten habe ich noch nicht ganz herausgefunden.
Wenn's nicht zuviel Mühe macht, würde mir eine kurze Erläuterung hinter den einzelnen VBA-Schritten sehr helfen.
Viele Grüße
Dietmar
AW: Enträtselung Deines Codes ...
26.06.2011 11:12:10
Dirk
Hallo Dietmar,
hier eine angepasste Datei. Ich habe mal ein wenig veraendert, damit es leichter verstaendlich ist.
Spaltendefinition fuer kurzname, langname verkaufseinheit sowie Preis werden als Konstanten im Modul deklariert. Wenn listen leer sind, werden die loeschbuttons deaktiviert, damit kein Schaden durch falsche Benutzung angerichtet wird.
Schau Dir das mal an. Falls Du viele Buttons erzeugen musst, waere es angebracht, dafuer ein Makro zu erstellen. Koennte dann gestartet werden, wenn die Liste geaendert wird.
https://www.herber.de/bbs/user/75458.xls
Gruss
Dirk aus Dubai
gekonnt ist eben gekonnt!
26.06.2011 12:38:31
Dietmar
Hallo Dirk,
die Frage ist eigentlich nicht mehr offen, ich habe den Haken aber nochmal gesetzt, da ich davon ausgehe, dass die Benachrichtigung dann in Deine Richtung aktiv initiiert wird (genau weiß ich das aber gar nicht, wie das hier funktioniert).
Gut dass Dubai durch die Möglichkeiten hier im Forum so nah ist!
DANKE für Deine Geduld und Deine Kreativität!
Ich werde nun mal die vergangenen Codes mit dem aktuellen vergleichen und werde dann sicherlich die Logik erkennen, da es erforderlich werden wird, den Bereich des Kassenbons in einen anderen Bereich zu verlegen.
Ich denke aber, dass dies lediglich eine Sache der Offset-Bezüge (pp.) ist. Das bekomme ich dann schon hin.
The story goes on :-)
Drei Dinge will ich nun noch einbauen:
1.) Ich überlege wie ich es bewerkstelligen kann, dass eine Buchung storniert werden kann; und zwar für zwei
Varianten:
Variante A: Die Buchung wurde noch nicht mit dem Button "Kassen-Bon leeren" vom Kassenbon gelöscht.
D.h. der Kunden steht noch vor mir.
(Löschbutton rechts neben jeder Bon-Lesezeile tuts ja nicht, da jeder Eintrag bereits im
Protokoll vorkommt).
Varainte B: Die Buchung wurde bereits verarbeitet und ist nicht mehr im Kassen-Bon sichtbar; d.h. der
Kunde kommt nach einiger Zeit zurück und gibt Produkt zurück (bzw. kauft was anderes).
2.) Im Tabellenblatt "Listen" eine Spalte für den ProduktCode einfügen, der dann aber nur im Protokoll erscheint
3.) Und beim Klick auf einen Button soll ein Beep-Ton erzeugt werden.
Du siehst, wenn erst einmal das Grundkonzept steht, dann kommen weitere Ideen hinzu.
Ich melde mich dann, wenn ich's fertig habe, damit du mal drüber schaust.
Unabhängig davon schaue ich natürlich hier täglich rein ... :-)
Dir noch einen schönen Sonntag.
Liebe Grüße
Dietmar aus Aachen
AW: gekonnt ist eben gekonnt!
26.06.2011 16:07:37
Dirk
Hallo Dietmar,
zum Rueckgaengigmachen von Buchungen musst Du eine Historie der Buchungen alegen, damit das funktioniert. Die Historie bleibt so lange bestehen bis der 'bon leeren' Knopf gedrueckt wird und kann dann zurueckgesetzt werden. Damit ist es moeglich, schrittweise Eintraege rueckgaengig zu machen (koennt ueber ein Array erfolgen)
Falls Du das mit storno-knoepfen neben den Eintraegen machen moechtest, auch ok. Da brauchst Du dann ein Makro, welches entweder den kompletten Zeileneintrag im Bon und Protokoll entfernt oder diesen Eintrag bei Knopfbetaetigung herunterzaehlt.
Fuer Variante B brauchst Du eine eindeutige Vorgangsnummer, welche Du auch dem Kunden zuordnen musst.
Diese koenntest Du erzeugen (datevalue) und mit dem Buchungsvorgang im Protokoll speichern. Bei Storno musst du halt diese nummer suchen und dann die Buchung entsprechend verarbeiten.
Sollte nicht so schwierig sein.
Gruss
Dirk aus Dubai
...wollte es ein bisschen anders angehen
26.06.2011 21:41:44
Dietmar
Hallo Dirk,
die Pogrammierung einer Historie wollte ich eigentlich nicht machen, da die Buchung, die zurückgenommen wird durchaus erhalten bleiben soll.
Ich dachte da eher an einen Schalter, der als Grundeinstellung "Buchung" hat und nach Betätigung "Storno" ausweist. Sodann sollte die dann vorzunehmende Buchung mittels eines Produktbuttons entweder eine Buchung oder eine Stornierung bewirken.
Mit einem Optionsbutton oder einem Häkchen-Button (Wahr - Falsch) sollte es gehen.
Ich schau mal.
Danke nochmals für Deine tolle Vorabeit!
Viele Grüße
Dietmar aus Aachen

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige