Autor
|
Thema: dynamische Combobox: letzten Eintrag auslesen (4856 mal gelesen)
|
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 20. Okt. 2014 09:41 <-- editieren / zitieren --> Unities abgeben:
Hallo, ich bin ein VBA-Änfänger und habe versucht mir über "Code-Schnipsel" aus diesem Forum ein Makro zu erstellen. Dies hat auch unerwartet gut funktioniert. Leider hänge ich jetzt an einem Problem fest, wo ich auf eure Hilfe hoffe. Basis: Ich habe eine Userform1 mit 2 Buttons (Typauswahl über Anwender) über die dann eine zweite Userform aufgerufen wird. Userform2:Beim Drücken auf den Button von Userform1 wird eine Exceltabelle im Hintergrund geöffnet und dynamische Multipages in die Userform2 eingefügt in Äbhängigkeit der Anzahl/ Namen der Tabellenblätter der Exceldatei (ist in der Exceldatei variabel, daher dynamische Multipages). Weiterhin wird über die Funktion in jede Multipage eine Combobox (NewBox) erstellt welche zugeordnet zu dem jeweiligen Tabellenblatt einen bestimmten Tabellenbereich ausliest und die Combobox damit füllt. Funktioniert bis hierhin auch wunderbar. Nun möchte ich beim Schliessen der Userform2 den letzten Eintrag der Combobox in eine txt-Datei schreiben um diesen "Listindex" beim erneuten öffnen des Makros wieder angezeigt zubekommen (abhängig von der jeweilig ausgewählten Page). Das funktioniert irgendwie nicht er zeigt immer den 1.Eintrag (Listindex =0). Hat jemand eine Idee wie ich das hinkriege? Hier mal mein Code. Bin für jede Hilfe dankbar. Vielelicht ist ja auch mein Ansatz völlig falsch. Function config_Multi_Page() Dim i, j, y As Integer Dim Rows As Long Dim NewPage As Page Dim NewBox As ListBox 'Registerkarten (Pages) in MultiPage1 anlegen für jedes Excel-Sheet Userform2.MultiPage1.Pages.Clear For i = 1 To objXL.Sheets.Count objXL.Sheets(i).Select SheetName = objXL.ActiveSheet.Name Set NewPage = Userform2.MultiPage1.Add("Page" & i, SheetName, i - 1) 'ListBox in die gerade erstellte Page einfügen Set NewBox = NewPage.Controls.Add("Forms.ComboBox.1", "CB_Bereich" & i, True) NewBox.Left = 10 NewBox.Top = 10 NewBox.Width = 115 NewBox.Height = 18 NewBox.SpecialEffect = fmSpecialEffectFlat '---------------------------------- 'Zeilen mit Inhalt im dafür vorgesehenen Bereich (also verfügbare Varianten) zählen 'Array anlegen mit der Zeilenanzahl als Dimension, zuweisen der Variantennamen, übertragen in gerade erstellte ListBox Rows = 0 For j = 5 To 10 If objXL.ActiveSheet.range("A" & j).Value Like "" = False Then Rows = Rows + 1 End If Next If Rows >= 1 Then Dim ListArray() ReDim ListArray(Rows - 1) For j = 5 To 10 Dim Zelle As String Zelle = objXL.ActiveSheet.range("A" & j).Value If Zelle Like "" = False Then ListArray(j - 5) = Zelle End If Next 'Hier wird die neue Listbox gefüllt NewBox.List() = ListArray End If On Error Resume Next ' erster Eintrag im Kombinationsfeld "CB_Bereich" ' Speicherpfad der txt-Datei definieren txtpath = CATIA.SystemService.Environ("CATUSERSETTINGPATH") ' Listeneintrag aus dem Textfile auslesen ' Name/-Speicherpfad der txt-Datei mtxt = Mname & ".txt" txtName = txtpath & "\" & mtxt ' pruefen ob Datei existiert wCheck = CATIA.FileSystem.FileExists(txtName) If wCheck = "True" Or wCheck = "Wahr" Then ' wenn ja, Zeile der Datei auslesen sLine = ReadLine(txtName, 1) ' Falls die Zeile leer ist 1.Eintrag verwenden If (Len(sLine) < 2) Then NewBox.ListIndex = 0 Else ' Zeile zerlegen und Eintrag-Index auslesen wzeile = Split(sLine, ";") BoxName = wzeile(1) NewBox.ListIndex = 0 = BoxName End If ' 1.Eintrag falls die txt-Datei noch nicht existiert Else NewBox.ListIndex = 0 End If Next End Function --------------------------------------------------------------- Private Sub C_Abbrechen_Click() BoxName = NewBox.ListIndex ' Name/-Speicherpfad der txt-Datei mtxt = Mname & ".txt" txtName = txtpath & "\" & mtxt
' pruefen ob Datei bereits im angegebenen Verzeichnis existiert uCheck = CATIA.FileSystem.FileExists(txtName) If uCheck = "False" Or uCheck = "Falsch" Then ' Falls txt-Datei nicht existiert diese erzeugen und zuletzt ausgewaehlten Listeneintraeg von der Combobox "CB_Bereich" in die Zeile schreiben txt_WriteLine "pos_" & Mname & ".txt", 1, Mname & ";" & BoxName & vbLf Else ' zuletzt ausgewaehlten Listeneintraeg von der Combobox "CB_Bereich in die Zeile schreiben txt_WriteLine "pos_" & Mname & ".txt", 4, Mname & ";" & BoxName & ";" & vbLf End If Unload Me End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 20. Okt. 2014 09:50 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Willkommen im Forum. Bitte Systeminfo ergänzen. Was funktioniert nicht? Klappt das abspeichern und auslesen des Wertes? Ändere mal testweise folgende Zeile: Code: NewBox.ListIndex = CInt(BoxName)
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 20. Okt. 2014 10:13 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, danke für den Hinweis (sorry bin halt neu hier). Wo genau meinst Du soll ich deinen Code-Vorschlag einfügen? Habe den Code nochmal komplett durchlaufen lassen der Fehler scheint darin beim Schreiben des aktuellen Listeintrages zu liegen. Wenn ich den Button Abrechen drücke kommt an der Stelle: Private Sub C_Abbrechen_Click() BoxName = NewBox.ListIndex Eine Fehlermeldung: Run-time-error '424': objekt required Muß ich den aktuellen Eintrag anders auslesen. Liegt es evtl. daran das die Combobox dynamisch erstellt wird und er daher den Index nicht auslesen kann? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 20. Okt. 2014 10:40 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Die ListBox "NewBox" ist in dieser Sub nicht "bekannt". Diese wurde in der Funktion definiert/erstellt. Dies kann man schön im Watch- bzw Local-Fenster beobachten. Ggf das Objekt NewBox als global definieren Oder die Listbox nicht neu anlegen, sondern eine bestehende erweitern. Dann kannst du zB über den Name darauf zugreifen. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 20. Okt. 2014 11:04 <-- editieren / zitieren --> Unities abgeben:
Hi, hmm... wie gesagt bin noch ein "VBA-Einsteiger" und kenne mich daher nicht so detailliert mit VBA aus. Habe unter (General)/ (Declarations) die NewBox als Public NewBox eingetragen meinst Du das? Bzw. wie meinst Du das mit dem nicht neu erstellen sondern erweitern? Die Anzahl der Multipages ist variabel (je nach Anzahl der Tabellenblätter in der Exceldatei) und je nach Auswahl der Multipage soll in der Listbox der Bereich aus dem entsprechendem Tabellenblatt angezeigt werden. Wenn ich z. B. beim Beenden des Makros die Multipage 2(Fzg.) mit dem Listeneintrag3 (Marke) ausgewählt hatte möchte ich beim erneuten starten des Makros auch diese Einstellung erhalten. Weiß nicht wie ich das durch erweietrn einer bestehenden Listbox realsieren soll? Sorry, das ich dich bitten muß etwas weiter auszuholen und es Anfängerverständlich zu formulieren. Danke Dir vorab schon mal für deine mühen. Gruß Matze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 20. Okt. 2014 13:01 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Du musst zunächst die aktive Page der Multipage abfragen und darin die Listbox abfragen. zB (ungetestet) Code: dim aktivePage as Integer aktivePage = UserForm2.MultiPage1.Valuedim Page Set Page= serForm2.MultiPage1.pages.item(aktivePage) dim ListBox Set Listbox = Page.control.item(1) 'oder über den Namen dim aktIndex aktIndex = Listbox.ListIndex
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 20. Okt. 2014 13:25 <-- editieren / zitieren --> Unities abgeben:
wo genau muß die Abfrage den plaziert sein (in der Funktion nach dem Auslesen der txt-Datei oder im Sub vom Beenden-Button)? Habe es mal probiert in dem SUB vom Beenden-Button die aktive Multi-Page wird auch einwandfrei wiedergegeben. Aber in der Zeile: Set ListBox = Page.control.Item (1) läuft er auf folgenden Fehler "Object doesn't support this property or method" Ist denn die Abfrage mit ListBox korrekt? habe ja ComboBox der Code "Set ComboBox = Page.Control.Item(1)" liefert allerdings den selben Fehler. Muß der Code evtl. woanders plaziert werden oder ist der Name hier relevant (NewBox)? Wenn er die MultiPage findet müßte er doch auch die darauf erstellte Combobox finden oder was genau fragt er mit der Zeile ab? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 20. Okt. 2014 16:14 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Zu deinen Fragen: werde dir mal klar wie dein Makro arbeitet. (ich hätte jetzt gedacht dass mein geposteter Code in die "C_Abbrechen_Click" gehört) In meinem Code muss es ggf nur Control s statt Cotorol heißen. Einfach mal den Code schrittweise abarbeiten und im Wischfester die Objekte beim Arbeiten betrachten. Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 21. Okt. 2014 06:27 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, hatte den Code ja wie oben beschrieben in "C_Abrechen_Click" eingefügt. Denn Schreibfehler hatte ich selber schon gefunden/korrigiert. Nichts desto trotz läuft er in der besagten Zeile ("Set ListBox = Page.Controls.Item(1)")immer auf einen Fehler ("invalid argument"). Danke Dir trotzdem für die Hilfe. Gruß Matze Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 21. Okt. 2014 12:09 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
|
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 21. Okt. 2014 13:04 <-- editieren / zitieren --> Unities abgeben:
Hi, hilft leider auch nicht....Jetzt kommt die Fehlermeldung "Could not find the specified objekt". Bin schon etwas am verzweifeln. Vielleicht muß ich das mit den dynamischen MultiPage lassen und einfach eine zusätzl. Combobox als "Ersatz" für die Multipage in die Userform einfügen und dann die anderen Comboboxen in Abhängigkeit zu einander setzen. Ist aber nicht das was ich möchte. Finde die MultiPage komfortabler (Anwenderfreundlicher) und da die Tabellenblätter flexibel erweiterbar sind diese halt dynamisch sein müssen. Ist evt. mein Ansatz falsch? Eigentlich möchte ich nur den zuletzt ausgewählten Eintrag, welcher beim erneuten öffnen vom Makro in der Combobox angezeigt wird..... Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 30. Okt. 2014 06:57 <-- editieren / zitieren --> Unities abgeben:
Hallo, da das Auslesen vom Index bei der dynamisch erstellten ComboBox nicht funktionieren wollte habe ich jetzt eine "fesstehende" ComboBox in die Userform2 eingefügt. Diese läßt sich auch wunderbar aus der Exceldatei befüllen bzw. wechselt den Inhalt beim ändern der Multipageauswahl. So jetzt habe ich eine Zweite ComboBox, welche sich mit einem bestimmten Bereich der Exceldatei (Zelle, Spalte)je nach dem aktuell ausgewählten Index der 1sten Box befüllen soll. Das bedeutet ich muß die aktuelle Multipage und den Index der 1sten Box verwenden um dann den Bereich zu definieren , welcher in der 2ten Box aufgelistet werden soll. da die ausgewählte Multipage das Tabellenblatt bestimmt und in Abhängigkeit vom Index der 1sten Box der Zellenbereich auf diesem Blatt bestimmt werden soll welcher in der 2ten Box aufgelistet wird. Irgendwie bekomme ich es nicht hin den Index mit einzubinden. Im Moment liest er mir abhängig von der aktiven Multipage die Zeilen/ Spaltenbereich auf dem Tabellenblatt aus wie bestimme ich jetzt noch den Bereich anhand des definierten Index aus Box1 z.B. Box1= Index 5 dann in Box2 die Werte(B5:B20) Box1= Index 6 " " Box2 " " (B25:B35) Hoffe es ist verständlich was ich meine und mir kann jemand helfen. Danke schon mal Gruß Matze Hier mal mein Code-Auszug: ' Auflistung der 2ten Box abhaengig vom akt. Index der 1sten Box bestimmen ' Index der 1.sten ComboBox ermitteln ObjSheet = ComboBox1.ListIndex + 2 ' aktuell ausgewaehlte Multiseite auslesen aktivePage = Userform2.MultiPage1.Value ' Ein weiter zaehlen, da es keine Tabellenblatt "Null" gibt WorkSheet = aktivePage + 1 ' Auflistung auslesen ComboBox2.Clear ' in der 5ten Zeile und Spalte B beginnen bis Leere Zelle kommt x = 5 While (objXL.Sheets(WorkSheet).Cells(x, 2).Value <> "") Or x > 150 ComboBox2.AddItem objXL.Sheets(WorkSheet).Cells(x, 2).Value x = x + 1 Wend End Sub Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Okt. 2014 07:29 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Auf den ersten Blick sieht das gut aus. Kommt eine Fehlermeldung? Wird die Schliefe ausgeführt? Gibt es die ComboBox? (Schrittweises ausführen und ggf mit MsgBox die werte aus der Exceltabelle anzeigen lassen) Gruß Bernd PS: Solche allgemeinen VBA-Fragen passen ggf auch ins Programmier-Forum oder Excel-Forum. EDIT: Programmierst von Catia aus oder von Excel aus? ggf reicht es "objXL.ActiveWorkbook.Sheets(WorkSheet)" zu ergänzen. ------------------ Warum einfach, wenn es auch kompliziert geht. [Diese Nachricht wurde von bgrittmann am 30. Okt. 2014 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 30. Okt. 2014 09:23 <-- editieren / zitieren --> Unities abgeben:
Hi, von Catia aus auf die Exceldatei zugreifen. Wie gesagt das Befüllen klappt alles wunderbar. Auch das beim wechseln der Multipage in der Userform2 das korrekte Tabellenblatt ausgelesen wird Jetzt möchte ich aber das von diesem Tabellenblatt nur ein bestimmter Bereich aufgelistet wird und dies in Abhängigkeit von dem Listindex aus der ersten Kombobox. Daher mein Beispiel: Combobox1.ListIndex = 0 Dann in Combobox2 = (B5:B20) Combobox1.ListIndex = 1 Dann in Combobox2 = (B25:B35) Wie gesagt bis jetzt liest er die kompl. Spalte B aus unabhängig welcher Index in der Combobox1 steht. Hier möchte ich den Bereich in Spalte B aber abhängig vom Index der Combobox1 definieren. Der gezeigte Code müßte also um das Einbinden des ListIndex und damit definieren des Zeilenbereichs in Spalte B erweitert werden. Wie mache ich das bzw. wie muß hier die Code-Ergänzung aussehen? Hoffe dies war etwas verständlicher formuliert. Danke! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Okt. 2014 10:07 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Dann musst du nur den Startwert für die Schleife ändern. zB (geht mit Sicherheit schöner): Code: if Combobox1.ListIndex = 0 then Startwert = 5 else Startwert = 25 end iffor x = Startwert to (Startwert + 20) if (objXL.Sheets(WorkSheet).Cells(x, 2).Value <> "") then ComboBox2.AddItem objXL.Sheets(WorkSheet).Cells(x, 2).Value end if next
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 30. Okt. 2014 11:00 <-- editieren / zitieren --> Unities abgeben:
Hallo, ja das sieht schon gar nicht so schlecht aus auf die Idee mit einer Schleife bin ich nicht gekommen. Es kommt aber noch hinzu das die Anzahl der Zeilen variiert je nachdem welches Tabellenblatt (Multipageseite) und welcher Index (Combobox1) ausgewählt wird. Zur Erklärung: in Spalte A (ab Zeile 5) stehen die Einträge, mit denen die Combobox1 befüllt wird. In Spalte B stehen die Werte welche je nach Indexauswahl (Zelle Spalte A) einen Bereich in Spalte B definieren welcher in Combobox2 aufgelistet werden soll. Die Anzahl in Spalte A und B kann je nach Tabellenblatt variieren. Daher dachte ich immer einen bestimmte "Startzelle" zu definieren und ab da bis zu einer Leerzelle diese Spalte ausliest (unabhängig ob ich in Spalte B je nach Index 10 oder 15 Einträge habe). Z.B. Multipage1 Combobox1 (A5:A10) ComboboxListIndex = 0 = (B5:B15) = Inhalt Combobox2 ComboboxListIndex = 1 = (B17:B25)= Inhalt Combobox2 usw. bis Zelle A10 Multipage2 Combobox1 (A5:A8) ComboboxListIndex = 0 = (B5:B10) = Inhalt Combobox2 ComboboxListIndex = 1 = (B17:B30)= Inhalt Combobox2 usw. bis Zelle A8 Wie ändere ich die Schleife das er die Zellen dann immer bis zur Leerzeile ausliest bzw. geht das auf diesem Weg überhaupt? Hoffe konnte so die Problematik etwas deutlicher darstellen. Sorry wenn das alles "Excel-Lastig" klingt. Habe eine Exceltabelle in der diverse Einträge/ Werte stehen welche ausgelesen werden um dem User (über Multipage/ Combobox) eine gewisse Auswahl zu ermöglichen. Die Weiterverabreitung anhand dieser Auswahl wird in Catia (Part/-Produktumgebung) gemacht. Zur besseren Übersicht habe ich diesen Code-Teil hier weggelassen, da dieser auch weitesgehend funktioniert Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Okt. 2014 11:15 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
|
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 30. Okt. 2014 13:48 <-- editieren / zitieren --> Unities abgeben:
Hi, ja genau und da hakt es. Ich bekomme es einfach nicht hin diese beiden Schleifen miteinander zu "verschachteln". Scheinbar sind meine VBA-Anfängerkenntnisse noch geringer als vermutet. Hast Du hier mal eine Idee wie man die beiden Abfragen miteinander kombinieren kann? Wäre dir super dankbar, da dies die letzte Hürde zu seien scheint um das Makro zum laufen zu bringen (so wie es soll). Gruß Matze
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 30. Okt. 2014 13:57 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Code:
if Combobox1.ListIndex = 0 then Startwert = 5 else Startwert = 25 end ifx = Startwert While (objXL.Sheets(WorkSheet).Cells(x, 2).Value <> "") Or x > 150 ComboBox2.AddItem objXL.Sheets(WorkSheet).Cells(x, 2).Value x = x + 1 Wend
Gruß Bernd ------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 30. Okt. 2014 14:21 <-- editieren / zitieren --> Unities abgeben:
super , genau so..... jetzt nur noch die Ergänzung das ich ja in Spalte A eine unterschiedl. Anzahl an Einträgen habe (bis max.10)je nach Tabellenblatt auf welches ich gerade zugreife. Die Schleife fragt ja nur zwei Bedingungen ab (Zelle 5 oder Zelle 25)muß ich die jetzt mit "ElseIf" endlos erweitern um allen Indexwerten (0-9) einen jeweiligen Zellenbereich zuzuordnen?? Nicht nur den Index 0(Zeile5) und Index 1(Zeile 25) oder geht dies einfacher/ komfortabler über eine Auflistung (irgendwo habe ich hier mal was von "Case" gelesen)o.ä.? Oder völlig flasche Richtung? Wie gesagt ist ja auch eine unterschiedl Anzahl je nach Tabellenblatt. Sind dem Ziel erstaunlich nah und bin begeistert wie das Makro bis hier hin funktioniert vielleicht kannst Du mir ja auf der "Zielgeraden noch ein wenig Hilfe zukommen lassen wäre super. Danke! Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 30. Okt. 2014 15:37 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
PMFJI Hallo Matze, wenn Du in einer freien Zeile 'Select' eingibst, den Cursor draufstellst und F1 drückst, sagt Dir die Online-Hilfe alles zu 'Select Case'. Wenn Du dann noch ein kleines Programm strickst um die Arbeitsweise und die Syntax auszustesten, lernst Du wie's eingesetzt wird. (So haben's alle anderen auch gelernt.) Danach sollte es Dir selbst gelingen, das Makro zu vollenden. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 06. Nov. 2014 08:35 <-- editieren / zitieren --> Unities abgeben:
Hi, habe versucht mittels der Online-Hilfe eine Select Case-Anweisung als Ersatz für die "If Else-Variante" zu basteln (leider ist mein Englisch nicht so gut um den angezeigten Text einwandfrei übersetzt/ interpretiert zu haben). Dahe rwill ich nicht ausschliessen etwas falsch verstanden zu haben. Anbei mal der Code-Auszug, welchen ich erzeugt habe. Leider funktioniert dieser nicht. Wenn ich das Makro durchlaufen lasse kommt die Meldung "Nichts ausgewählt" (aus der Case Else MsgBox) bzw. er geht anschließend in den "Debugger-Modus". Kann mir jemand sagen was ich falsch gemacht habe? Select Case Combobox1.ListIndex Case 0 Startwert = 5 Case 1 Startwert = 25 Case 2 Startwert = 45 Case 3 Startwert = 95 Case 4 Startwert = 105 Case Else: MsgBox "Nichts gewählt" End Select x = Startwert While (objXL.Sheets(WS).Cells(x, 2).Value <> "") Or x > 150 ComboBox2.AddItem objXL.Sheets(WS).Cells(x, 2).Value x = x + 1 Wend Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bgrittmann Moderator Konstrukteur
Beiträge: 11780 Registriert: 30.11.2006 CATIA V5R19
|
erstellt am: 06. Nov. 2014 08:47 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Servus Der Code sieht auf den ersten Blick gut aus. Wann wird der Code ausgeführt? Ist zu diesem Zeitpunkt was in der Combobox selektiert? ggf beim Hinzufügen der Elemente in die Combobox gleich ein Element aktivieren. Gruß Bernd
------------------ Warum einfach, wenn es auch kompliziert geht. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
Matze10 Mitglied
Beiträge: 13 Registriert: 20.10.2014 Win-7 Catia V5 R19SP9
|
erstellt am: 06. Nov. 2014 09:08 <-- editieren / zitieren --> Unities abgeben:
Hallo Bernd, habe den Code etwas gekürzt gepostet, da ich die Select Case-Anweisung an die Stelle der If-Else-Anweisung gesetzt habe. Hier der ausführliche Code bzw. in welchem Ereignis (Object-Prozedur) ich ihn eingefügt habe. Eigentlich kann nichts in der Box sein, da ich ja vorher den "clear-Befehl" ausführe. Meinst Du der Code steht evtl. an der falschen Stelle? P.S.: scheinbar bit Du der einzige der mir hier echt weiterhelfen kann. Danke Dir für deine Geduld und Mühen mir zu helfen.....(Doppel-Danke ). Private Sub ComboBox1_Change()
Dim ObjSheet As Integer Dim WS As Integer ' Exceldatei auslesen Set objXL = CreateObject(ExcelWb)
' Auflistung der 2ten Box abhaengig vom akt. Index der 1sten Box bestimmen ' Index der 1.sten ComboBox ermitteln ObjSheet = ComboBox1.ListIndex + 2 ' aktuell ausgewaehlte Multiseite auslesen aktivePage = Userform2.MultiPage1.Value ' Ein weiter zaehlen, da es keine Tabellenblatt "Null" gibt WS = aktivePage + 1 ' bisherige Eintraege loeschen ComboBox2.Clear ' Auflistung auslesen ' in der 5ten Zeile und Spalte B beginnen bis Leere Zelle kommt Select Case Combobox1.ListIndex Case 0 Startwert = 5 Case 1 Startwert = 25 Case 2 Startwert = 45 Case 3 Startwert = 95 Case 4 Startwert = 105 Case Else: MsgBox "Nichts gewählt" End Select x = Startwert While (objXL.Sheets(WorkSheet).Cells(x, 2).Value <> "") Or x > 150 ComboBox2.AddItem objXL.Sheets(WorkSheet).Cells(x, 2).Value x = x + 1 Wend UserForm2.ComboBox2.ListIndex = 0 + 1 End Sub
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
joehz Moderator Freiberuflicher Konstrukteur
Beiträge: 1057 Registriert: 25.11.2006 Win7 Pro 64 + Ubuntu + Irix6.5.20 Dell Precision M6600 i7-2960XM 2.7GHz 16GB NVidia Quadro M5010 Catia V5R19 VB6Pro.SP6/VBA 6.5.1053
|
erstellt am: 06. Nov. 2014 14:14 <-- editieren / zitieren --> Unities abgeben: Nur für Matze10
Hallo Matze, bei Deinem Code irritieren mich zwei Stellen: Zitat:
' Auflistung der 2ten Box abhaengig vom akt. Index der 1sten Box bestimmen ' Index der 1.sten ComboBox ermitteln ObjSheet = ComboBox1.ListIndex + 2
Damit ermittelst Du nix, Du erhöhst nur den Index - effektiv ändest Du die Auswahl in der ComboBox. und
Zitat:
UserForm2.ComboBox2.ListIndex = 0 + 1
Hier gilt dasselbe. Du wählst _immer_ den zweiten Wert der Combo aus. Um den aktuell ausgewählten Wert auszulesen, verwende Combo1.List(Combo1.ListIndex) Zu Deinem Rant:
Es reicht gewöhnlich, wenn jemandem 1x richtig geantwortet wird. Ein zweites Mal die gleiche Antwort zu geben ist eher unsinnig. Prinzipiell geht's um Hilfe zur Selbsthilfe. Tschau, Joe Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |