Autor
|
Thema: Optionsfeld kopieren (4866 mal gelesen)
|
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 31. Mai. 2009 20:46 <-- editieren / zitieren --> Unities abgeben:
Guten Abend, ich habe mir als Berechnungsvorlage ein Tabellenblatt erstellt, das u.a. 2 Optionsfelder (aus der Steuerelemetbox) zur Auswahl der gewünschten Berechnungsart enthält. Diese Vorlage möchte ich nun (mehrfach) kopieren und in der gleichen Excelmappe wieder einfügen, um mehrere Berechnungen durchführen/abspeichern zu können. Leider wird beim kopierten Blatt der "group name", der die Zusammengehörigkeit der Optionsfelder zu einer Gruppe festlegt, nicht automatisch geändert. D.h., wenn ich auf dem neuen kopierten Blatt einen Button aktiviere werden die beiden buttons auf dem Ursprungsblatt beide deaktiviert. Das will ich natürlich nicht, sondern es sollen immer nur die 2 buttons auf jedem Blatt zusammengehören und nicht alle Buttons auf allen Blättern. Gibts da eine Möglichkeit ohne dass man auf jedem neu eingefügten Blatt händisch den group name ändern muss? Mit den Elementen aus der Formularleiste funktioniert es über ein Gruppenfeld, aber ich möchte lieber bei den Active-x Elementen bleiben. In der gleichen Berechnungsvorlage habe ich noch ein zweites Problem: ich habe dort zusätzlich auch eine Combobox eingebaut, die mit Hilfe des folgenden codes gefüllt wird:
Code:
Private Sub ComboBox1_GotFocus() ComboBox1.ListFillRange = "Listeninhalt" End Sub
Komischerweise ist jedesmal, wenn ich die Mappe neu öffne kein Eintrag in der Combobox ausgewählt (d.h. die Anzeigezeile ist leer), obwohl vor dem letzten speichern der Mappe ein Eintrag ausgewählt war. Mittlerweile habe ich herausgefunden, dass es daran zu liegen scheint, dass ich die Eigenschaft BoundColumn auf "0" gesetzt habe, da ich nicht den Listeneintrag selbst sondern seine Listenpositionsnummer ausgegeben haben möchte. Stelle ich BoundColumn auf "1" tritt dieses Phänomen nicht auf. Kann man etwas tun, damit auch bei BoundColumn "0" der vor dem speichern gewählte Eintrag der Combobox wieder angezeigt wird?
------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 01. Jun. 2009 10:31 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Hallo stefga, Zitat: ... ohne dass man auf jedem neu eingefügten Blatt händisch den group name ändern muss?
Hm... Als schnell-und-schmutzig-Gedanke: Per VBA eine Schleife bauen, die Dir die GroupNames durchnummeriert; diese Sub kannst Du auskommentieren, wenn Deine Mappe fertig gebastelt ist..? Die Sache mit BoundColumn lässt sich nachvollziehen: Die Hilfe zu xls03 erwähnt im Zusammenhang mit BoundColumn "mehrspaltiges Kombinationsfeld-Steuerelement". Wenn ich eine Cbo-Box einbaue, einen Wert auswähle, schließe und wieder öffne, so bleibt der vorher gewählte Wert erhalten, falls BoundColumn = 1 (Voreinstellung). Zu BoundColumn selbst kann ich wenig sagen. Geht es nur um die Position? Vielleicht kannst Du die Voreinstellung beibehalten (=1). Eine Hilfe, um die Listenpositionsnummer zu ermitteln, gibt es in diesem Beitrag. ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 01. Jun. 2009 12:41 <-- editieren / zitieren --> Unities abgeben:
Danke für Deine Antwort Paulchen und Glückwunsch zur Schnapszahl . Zitat: Original erstellt von Paulchen: ...Per VBA eine Schleife bauen, die Dir die GroupNames durchnummeriert...
Deinem VBA-Vorschlag entnehme ich, dass es auf einfache Art und Weise, d.h. durch setzten des richtigen Schalters, den ich bisher einfach übersehen hatte, nicht geht. Dann ist es für mich wohl einfacher auf die Elemente aus der Formularleiste auszuweichen, da hat man das Problem nicht. Zitat: Geht es nur um die Position?
Ja, theoretisch kann ich auch mit dem tatsächlichen Listeneintrag (also was Boundcolumn=1 ausspuckt) leben, ist aber unübersichtlicher. Ich möche den Comboboxausgabewert in mehreren WENN-Formeln weiterverwenden in etwa so: wenn(A1=0;"tu dies";wenn(A1=1;"tu das";...)) (wobei A1 die linked cell der cbobox ist) und da ist es übersichtlicher/änderungsfreundlicher, nur Zahlen als Bedingung zu haben statt eines relativ langen Textes. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 01. Jun. 2009 15:10 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Zitat: ... möche den Comboboxausgabewert in mehreren WENN-Formeln...
Nimm die Excel-Funktion WAHL - das macht zumindest diesen Teil übersichtlicher ;-). Umständliche, aber mögliche Überlegung: Wenn Du ComboBox1.List mit ComboBox1.Text vergleichst, müsste sich doch die Pos.-Nr. (in einer Schleife) ermitteln lassen. Ungetesteter Ansatz: Code: ... With ComboBox1 For Each varCbo In .List If varCbo = .Text Then Exit For i = 1 + i Next varCbo Range(.LinkedCell) = i + 1 End With
------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 01. Jun. 2009 19:19 <-- editieren / zitieren --> Unities abgeben:
Zitat: Nimm die Excel-Funktion WAHL - das macht zumindest diesen Teil übersichtlicher
Stimmt, aber für WAHL brauche ich zwingend die Listenpositionsnummer, mit WENN komme ich auch mit dem Listeneintrag zurecht. Und den werde ich wohl oder übel verwenden, da die Ausgabe der Positionsnummer über BoundColumn=0 nicht wie gewünscht funktioniert. Deinen anderen Ansatz teste ich noch, aber ich glaube das wird zu aufwendig für mich. Gerade fällt mir noch eine Alternative ein: Am einfachsten wir sein die Combobox aus der Formularleiste zu nehmen, die spuckt ja auch die Listenposition aus. Für meine einfache Anwendung hier scheinen die Elemente der Formularleise besser geeignet zu sein.
------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
MWN Mitglied Dipl.-Ing.
Beiträge: 492 Registriert: 14.02.2007
|
erstellt am: 02. Jun. 2009 07:44 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Guten Morgen Stefan, wenn ich das richtig lese, speicherst du doch die Listenposition in einer linked Cell der ComboBox, oder? Wieso machst du dann nicht folgendes? Du nimmst dir den Event für das Öffnen deiner Mappe und schreibst dort hinein, dass er den Index der ComboBox der in der linked Cell enthalten ist, in dieser anzeigen soll? Zu dem Thema mit den Optionsfeldern: ich würde mir wahrscheinlich einen Button einbauen, der mir zum ersten ein neues Blatt erzeugt und zum zweiten die Steuerelemente des ersten (oder verdeckten Musterblattes) auf das neue Blatt kopiert und dann die Gruppe der Optionsfelder mit einem EinEindeutigen Namen versieht (in dem könnte der Blattnamen enthalten sein). Ist ja eigentlich kein Problem. Du brauchst einfach nur alle Controls zu durchlaufen und dabei auf das neue Blatt zu kopieren! Viel spass beim probieren! Grüße Tobias Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 02. Jun. 2009 21:40 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von MWN: ...wenn ich das richtig lese, speicherst du doch die Listenposition in einer linked Cell der ComboBox, oder?
Ich gebe die Listenpositionsnummer aus der Combobox in die linked cell mittels der Eigenschaft "BoundColumn" =0 aus. Dies führt aber dazu, dass nach dem abspeichen und neu öffnen der Mappe in der Combobox der vor dem speichern ausgewählte Eintrag nicht mehr angezeigt wird. Wieso das so ist, ist mir schleierhaft. Bei boundcolumn=1 wird nach dem speichern der zuletzt angewählte Eintrag wieder angezeigt. Jetzt habe ich 3 Möglichkeiten: 1. statt der Positionsnummer direkt den Eintrag ausgeben (mit boundcolumn=1) -->funktioniert, ist aber unübersichtlicher in der weiteren Verarbeitung da statt einer Zahl der ganze Text als Bedingung in WENN-Formeln verwurstet werden muss 2.mittels VBA etwas stricken (siehe eure Vorschläge) 3.die Box aus der Formularleiste nehmen, die gibt ohne Probleme die Positionsnummer aus Ich habe mich jetzt unter Zeitdruck für Variante 3 entschieden, das scheint mir das einfachste.
Zitat: Zu dem Thema mit den Optionsfeldern: ich würde mir wahrscheinlich einen Button einbauen, der mir zum ersten ein neues Blatt erzeugt und zum zweiten die Steuerelemente des ersten (oder verdeckten Musterblattes) auf das neue Blatt kopiert und dann die Gruppe der Optionsfelder mit einem EinEindeutigen Namen versieht (in dem könnte der Blattnamen enthalten sein). Ist ja eigentlich kein Problem. Du brauchst einfach nur alle Controls zu durchlaufen und dabei auf das neue Blatt zu kopieren! Viel spass beim probieren!
Danke für den Vorschlag Tobias, bei Gelegenheit probiere ich es aus. Generell aber scheint man größeren Aufwand treiben zu müssen, wenn man hier mit den Active-X buttons arbeiten möchte. Die Optionsfelder aus der Formularleiste scheinen mir hier geeigneter zu sein, weshalb ich mich vorerst für diese Variante entschieden habe. Dort gibts kein Problem mir blattübergreifender Zusammengehörigkeit. Besten Dank an alle Ratgeber.
------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Paulchen Mitglied Bauing./SW-Entwickler
Beiträge: 1227 Registriert: 19.08.2004 Büro: Win10 Enterprise 64bit, Office Professional Plus 2013 - Privat: Linux Mint 15, LibreOffice
|
erstellt am: 03. Jun. 2009 08:52 <-- editieren / zitieren --> Unities abgeben: Nur für stefga
Hallo stefga, noch eine Ergänzung zu 1) mit 2). Du möchtest wahrscheinlich aus gutem Grund auf das GotFocus-Ereignis reagieren? Der Wert in der .LinkedCell bleibt beim Speichern erhalten. BoundColumn ist auf 0 gesetzt - der Herr weiß, warum -, und Du kannst die Pos.-Nummern direkt an WAHL übergeben. Der Zähler im .ListIndex beginnt allerdings bei Null. Entweder, Du erhöhst .LinkedCell künstlich um eins - oder nimmst als Formel =WAHL(LinkedCell+1;Dann1;Dann2;Dann3). Kontrolle: =INDEX(Listeninhalt;LinkedCell+1;1) sollte wieder den in der Cbo gewählten Eintrag ergeben. Getestet in xls07. Nachteil: Beim Öffnen der Mappe erscheint die Cbo "leer", da sie erst beim Setzen des Focus auf die Box gefüllt wird. Willst Du das so haben? Das kann irritieren. Vielleicht magst Du die Sub bei Workbook.Open oder Worksheet.Activate verbauen? So wird beim Klick auf die Box der vorherige Wert angezeigt. Code: Private Sub ComboBox2_GotFocus() With ComboBox2 .ListFillRange = "Listeninhalt" .ListIndex = Range(.LinkedCell) End With End Sub
Die Formular-Elemente sind einfacher in der Handhabe; dafür aber weniger mächtig, da stößt man schnell auf Grenzen. Optik, Reaktion auf Ereignisse, (interaktives) Ein- und Ausblenden uvm. klappt mit Formular-Elementen wenig bis gar nicht. ActiveX kann deutlich mehr und ist IMHO flexibler. HTH ------------------ DIN1055.de | Lastannahmen für Anwender NEU: Foren zu DIN 1055 Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
stefga Mitglied
Beiträge: 138 Registriert: 17.05.2007 Excel97
|
erstellt am: 03. Jun. 2009 22:19 <-- editieren / zitieren --> Unities abgeben:
Hallo Paulchen, find ich super wie Du dich reinhängst. Aber ich glaube wir haben bisher aneinander vorbei geredet. Zitat:
Beim Öffnen der Mappe erscheint die Cbo "leer", da sie erst beim Setzen des Focus auf die Box gefüllt wird. Willst Du das so haben?
Nein, genau das will ich nicht! Ich möchte beim öffnen der Mappe den vor dem speichern ausgewählten Eintrag sichtbar haben, da es wie Du sagst sonst sehr irritiert. Solange ich unter "Eigenschaften-Boundcolumn" eine 1 eintrage (bzw. das ist schon voreingestellt) klappt das auch. Nur wenn ich selbst den Wert bei boundcolumn von 1 durch 0 ersetze (um in der linked cell nicht den Listeneintrag selbst sondern seine Positionsnummer ausgegeben zu bekommen) und die Mappe speichere, erscheint die Cbo beim öffnen wie von Dir beschrieben leer. Excel selbst hat den zuletzt gewählten Eintrag wohl schon noch gespeichert, denn in der Zelle, die ich als "linked cell" bei den Eigenschaften eingetragen habe steht noch die richtige Positionsnummer des vor dem speichern angewählten Cbo-Eintrags. Aber die leere Cbo-Anzeige irritiert eben sehr. Zitat: ...da sie erst beim Setzen des Focus auf die Box gefüllt wird...
Solange boundcolumn=1 ist und man speichert die Mappe, erscheint nach dem erneuten öffnen auch der zuletzt gewählte Eintrag wieder. Die Cbo wurde ja vor dem speichern schon gefüllt, also darf doch nach dem speichern der inhalt nicht weg sein und erst nach erneutem setzen des focus wieder erscheinen?
Zitat: Du möchtest wahrscheinlich aus gutem Grund auf das GotFocus-Ereignis reagieren?
Nein, einen besonderen Grund habe ich nicht. Ich verwende grundsätzlich zum füllen einer Combobox GotFocus, da mir hier im Forum vor einiger Zeit freundlicherweise dazu geraten wurde. Und bisher hat das auch immer funktioniert, allerdings habe ich auch noch nie die boundcolum Eigenschaft auf 0 gesetzt. Ob sich was ändert wenn ich die Cbo z.b. mit "ComboBox1_change()" fülle kann ich gerade leider nicht testen, da mein Excel spinnt und permanent abstürzt. Zitat: So wird beim Klick auf die Box der vorherige Wert angezeigt...
Deine sub funktioniert, aber wie gesagt sollte der Eintrag direkt nach dem öffnen wieder angezeigt werden. Zitat: Die Formular-Elemente sind einfacher in der Handhabe; dafür aber weniger mächtig, da stößt man schnell auf Grenzen. Optik, Reaktion auf Ereignisse, (interaktives) Ein- und Ausblenden uvm. klappt mit Formular-Elementen wenig bis gar nicht. ActiveX kann deutlich mehr und ist IMHO flexibler.
Du bist nicht der erste, der mir das sagt und Du hast ganz sicher recht. Und eigentlich wollte ich mir auch angewöhnen, immer die Active-X Elemente zu verwenden. Aber wenn man dann auf Probleme wie in diesem Fall stößt, muss man leider sagen, dass die Formularelemete hier besser passen. Sich dann umständlich die Active-x Elemente per VBA-Code so hinzudrehen, dass Sie auch das gewünschte tun, ist IMHO mit Kanonen auf Spatzen geschossen. ------------------ Gruß Stefan Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
| Anzeige.:
Anzeige: (Infos zum Werbeplatz >>)
|