Listenfeld aus Dialog in Tabellenblatt übertragen
Moderator: Moderatoren
Listenfeld aus Dialog in Tabellenblatt übertragen
Hallo Liebe Gemeinde
Ich habe zwar so ein bissl Ahnung von Calc, aber nun habe ich mich an Dialoge und Makros gewagt und ich bin seit Tagen einfach nur verzweifelt.
Ich habe eine Datei mit einem selbst erstellten Dialog, der ein Listenfeld mit ca. 850 Einträge enthält. Mein Gedanke war, dass wenn ich über das Listenfeld in dem Dialog (Über den dicken Button "Hersteller bearbeiten" aufzurufen) einen Hersteller auswähle und dann die weiteren Buttons bei Status, Team, Saison setze, dass es mir die entsprechenden Spalten in der Tabelle bei dem ausgewählten Hersteller ausfüllt.
Also ich wähle über das Listenfeld z.B. den Hersteller 100% aus und setze den Button bei inaktiv und suche mir ein Team aus und eine Saison. Dann möchte ich gerne, dass mir das in die Tabelle eingetragen wird. Und vorhandene Eintragungen gelöscht werden (bis auf den Hersteller)
Ich habe keinen Plan wie ich das per Makro umsetzen kann (bin da auch wirklcih nicht sehr erfahren mit). Oder ob das überhaupt umzusetzen geht. Am coolsten wäre es, wenn es eine Möglichkeit gäbe, das wie mit dem Datenformular zu lösen. Nur gibt es da keine Suchfunktion und sich durch über 800 Datensätze durchklicken ist auch nicht die Lösung. Ich bin nicht auf den selbst erstellten Dialog angewiesen.
Kann mir bitte wer helfen?
Liebe Grüße
PS: LibreOffice Base ist keine Alternative.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
Ich habe zwar so ein bissl Ahnung von Calc, aber nun habe ich mich an Dialoge und Makros gewagt und ich bin seit Tagen einfach nur verzweifelt.
Ich habe eine Datei mit einem selbst erstellten Dialog, der ein Listenfeld mit ca. 850 Einträge enthält. Mein Gedanke war, dass wenn ich über das Listenfeld in dem Dialog (Über den dicken Button "Hersteller bearbeiten" aufzurufen) einen Hersteller auswähle und dann die weiteren Buttons bei Status, Team, Saison setze, dass es mir die entsprechenden Spalten in der Tabelle bei dem ausgewählten Hersteller ausfüllt.
Also ich wähle über das Listenfeld z.B. den Hersteller 100% aus und setze den Button bei inaktiv und suche mir ein Team aus und eine Saison. Dann möchte ich gerne, dass mir das in die Tabelle eingetragen wird. Und vorhandene Eintragungen gelöscht werden (bis auf den Hersteller)
Ich habe keinen Plan wie ich das per Makro umsetzen kann (bin da auch wirklcih nicht sehr erfahren mit). Oder ob das überhaupt umzusetzen geht. Am coolsten wäre es, wenn es eine Möglichkeit gäbe, das wie mit dem Datenformular zu lösen. Nur gibt es da keine Suchfunktion und sich durch über 800 Datensätze durchklicken ist auch nicht die Lösung. Ich bin nicht auf den selbst erstellten Dialog angewiesen.
Kann mir bitte wer helfen?
Liebe Grüße
PS: LibreOffice Base ist keine Alternative.
Moderation,4: verschoben in BASIC-Unterbereich, wo alle Makro-Fragen hin gehören
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
z.B. für das Merkmal "Status"
(etwas 'langatmiger' Code, aber so wohl leichter zu verstehen)
Gruß
Stephan
Code: Alles auswählen
Sub Eintragen()
If Dlg_Hersteller.getControl("OBaktiv").State = True Then
For i = 1 To 1000
If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "aktiv"
Exit Sub
End If
Next i
Else
For i = 1 To 1000
If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "inaktiv"
Exit Sub
End If
Next i
End If
End Sub
Gruß
Stephan
- Dateianhänge
-
- Hersteller2a.ods
- (32.66 KiB) 100-mal heruntergeladen
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
SSSUUUUUUUUPPPPPPERRRRR! Du bist mein Retter
Das klappt. Und meine anderen Codes (das war nur ein Auszug aus der eigentlichen Datei) sind viel länger und noch verworrener.
Ich danke Dir wie verrückt.
Das klappt. Und meine anderen Codes (das war nur ein Auszug aus der eigentlichen Datei) sind viel länger und noch verworrener.
Ich danke Dir wie verrückt.
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Ich nochmal
Ich habe jetzt das Makro soweit bearbeitet, dass es alles macht was ich möchte. Es füllt mir jede Spalte aus in dem Blatt "Hersteller". Das Makro ist laaang und es dauert bis es fertig ausgeführt ist, aber es funzt (Wenn es fertig ist, kommt eine Masagebox, dass der Hersteller bearbeitet wurde...)
Nun möchte ich, dass mir die Hersteller in die Datenblätter verteilt werden. Und zwar in die wo auch ein "X" gesetzt ist. Also bei Hersteller 100% sind bei 2015, 2016 und 2017 X gesetzt, dann soll der Hersteller zu Datenblatt 2015, Datenblatt 2016 und Datenblatt 2017 usw.... Mit einer Wenn-Funktion klappt das nicht, weil es dann ziwschen den Herstellern Lücken gibt. Und ich habe keine Ahnung wie is es überhaupt anfangen soll...ob mit Makro oder Funktion...
Ein zweites Problem:
Über den Button "Neuer Hersteller" kann man einen neuen Hersteller hinzufügen. Das macht er bis jetzt ganz am Ende der Tabelle, weil das so im Makro steht. Kann man das Makro denn auch so schreiben, dass der Hersteller alphabetisch eingefügt wird? Bzw. kann man ein Makro schreiben, dass im Nachhinein das ganze Blatt duch sortiert und zwar so, dass alle Spalten berücksichtigt werden?
Zum besseren Verständnis hänge ich die Datei nochmal mit an. Ich hoffe es kann mir wieder so super schnell geholfen werden.
Schon mal Danke im Vorraus
Ich habe jetzt das Makro soweit bearbeitet, dass es alles macht was ich möchte. Es füllt mir jede Spalte aus in dem Blatt "Hersteller". Das Makro ist laaang und es dauert bis es fertig ausgeführt ist, aber es funzt (Wenn es fertig ist, kommt eine Masagebox, dass der Hersteller bearbeitet wurde...)
Nun möchte ich, dass mir die Hersteller in die Datenblätter verteilt werden. Und zwar in die wo auch ein "X" gesetzt ist. Also bei Hersteller 100% sind bei 2015, 2016 und 2017 X gesetzt, dann soll der Hersteller zu Datenblatt 2015, Datenblatt 2016 und Datenblatt 2017 usw.... Mit einer Wenn-Funktion klappt das nicht, weil es dann ziwschen den Herstellern Lücken gibt. Und ich habe keine Ahnung wie is es überhaupt anfangen soll...ob mit Makro oder Funktion...
Ein zweites Problem:
Über den Button "Neuer Hersteller" kann man einen neuen Hersteller hinzufügen. Das macht er bis jetzt ganz am Ende der Tabelle, weil das so im Makro steht. Kann man das Makro denn auch so schreiben, dass der Hersteller alphabetisch eingefügt wird? Bzw. kann man ein Makro schreiben, dass im Nachhinein das ganze Blatt duch sortiert und zwar so, dass alle Spalten berücksichtigt werden?
Zum besseren Verständnis hänge ich die Datei nochmal mit an. Ich hoffe es kann mir wieder so super schnell geholfen werden.
Schon mal Danke im Vorraus
- Dateianhänge
-
- test2 - Kopie.ods
- (48 KiB) 87-mal heruntergeladen
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
das kann an den Schleifen in meinem Makro liegen, falls die in Deinem Makro mehrfach durchlaufen werden, wenn das die Ursache ist müsste das Makro anders implementiert werden unter Verwendung der Methode .getDataArray, Beispiel dazu z.B. in der letzten Datei/Link in:Das Makro ist laaang und es dauert bis es fertig ausgeführt ist
viewtopic.php?f=18&t=1553
Es gibt 18 der Checkboxen, also:Nun möchte ich, dass mir die Hersteller in die Datenblätter verteilt werden. Und zwar in die wo auch ein "X" gesetzt ist. Also bei Hersteller 100% sind bei 2015, 2016 und 2017 X gesetzt, dann soll der Hersteller zu Datenblatt 2015, Datenblatt 2016 und Datenblatt 2017 usw.... Mit einer Wenn-Funktion klappt das nicht, weil es dann ziwschen den Herstellern Lücken gibt.
namenAllerCheckboxen = Array("Name1", "Name2", ...)
For i = 0 To 17
If <die Checkbox namens "namenAllerCheckboxen(i)" aktiv> Then
'tue was zu tun ist
End If
Next i
da gibt es keine Lücken.
ich würde erst eintrage und dann sortieren. Eintragen ist klar, für Sortieren ist hier ein Beispiel:Kann man das Makro denn auch so schreiben, dass der Hersteller alphabetisch eingefügt wird? Bzw. kann man ein Makro schreiben, dass im Nachhinein das ganze Blatt duch sortiert und zwar so, dass alle Spalten berücksichtigt werden?
https://sites.google.com/site/satuperai ... sort-sheet
Gruß
Stephan
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Hallo Stephan
Danke für deine letzte Antwort. Da muss ich mich erstmal rein lesen...das hab ich bis jetzt noch nicht gemacht.
Ich feil noch an einem anderen Problem, wo ich nicht weiß wie ich es angehen soll. Ist es möglich, dass ich mir die Eintragungen, die in dem Tabellenblatt Hersteller stehen in dem dazugehörogen Dialog anzeigen lassen kann, wenn ich ihn aufegrufen habe? Und wenn ja...wie?! Also sozusagen das ganze umgekehrt. Falls das in einen neuen Thread müsste...dann tut es mir leid.
LG
Danke für deine letzte Antwort. Da muss ich mich erstmal rein lesen...das hab ich bis jetzt noch nicht gemacht.
Ich feil noch an einem anderen Problem, wo ich nicht weiß wie ich es angehen soll. Ist es möglich, dass ich mir die Eintragungen, die in dem Tabellenblatt Hersteller stehen in dem dazugehörogen Dialog anzeigen lassen kann, wenn ich ihn aufegrufen habe? Und wenn ja...wie?! Also sozusagen das ganze umgekehrt. Falls das in einen neuen Thread müsste...dann tut es mir leid.
LG
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Das steht auch in der schon genannten Datei unter:Ist es möglich, dass ich mir die Eintragungen, die in dem Tabellenblatt Hersteller stehen in dem dazugehörogen Dialog anzeigen lassen kann, wenn ich ihn aufegrufen habe? Und wenn ja...wie?!
viewtopic.php?f=18&t=1553
z.B.:
Code: Alles auswählen
Sub Dlg_Hersteller_bearbeiten
DialogLibraries.loadLibrary("Standard")
oForm = DialogLibraries.Standard.Dlg_Hersteller
Dlg_Hersteller = CreateUnoDialog(oForm)
Dlg_Hersteller.title = "Hersteller bearbeiten"
Ctl_Hersteller = Dlg_Hersteller.GetControl("Hersteller")
'Ctl_Status = Dlg_Hersteller.GetControl("Status")
'Ctl_Team = Dlg_Hersteller.GetControl("Team")
oDoc = ThisComponent
'-->Listbox füllen---------------------------
eintraege = ThisComponent.Sheets().GetByName("Tabelle1").getCellRangeByName("A2:A1000").getDataArray()
Dim liste(UBOUND(eintraege()))
For i = 0 To UBOUND(eintraege())
tmp = eintraege(i)
liste(i) = tmp(0)
Next i
Dlg_Hersteller.Model.GetByName("ListBox_Herst").StringItemList = liste()
'-----------------------------------------<--
Dlg_Hersteller.execute
end sub
Stephan
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Hallo Stephan
Trotzdem vielen Dank für deine Antwort ich hatte mir die Datei zwar schon mal angeschaut. Aber dachte, dass es nicht das richtige ist, da es 1. eine Combobox ist und 2. die Combobox mit den Werten aus B14:B20 gefüllt wird. Meine Listbox ist ja schon "gefüllt". Ich möchte nur, dass es die anderen Kontrollfelder füllt, wenn ich einen Hersteller in der Listbox ausgewählt habe.
Und wenn ich das Makro aus der Datei versuche in meine Datei einzubauen, dann meckert er wegen der "drawpage". Ich habe bei mir keine Drawpage...geschweige denn weiß ich nicht genau was das ist
Ich habe dein Makro ausprobiert und da kommt in der Zeile
folgender Fehlercode:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: .
LG
Trotzdem vielen Dank für deine Antwort ich hatte mir die Datei zwar schon mal angeschaut. Aber dachte, dass es nicht das richtige ist, da es 1. eine Combobox ist und 2. die Combobox mit den Werten aus B14:B20 gefüllt wird. Meine Listbox ist ja schon "gefüllt". Ich möchte nur, dass es die anderen Kontrollfelder füllt, wenn ich einen Hersteller in der Listbox ausgewählt habe.
Und wenn ich das Makro aus der Datei versuche in meine Datei einzubauen, dann meckert er wegen der "drawpage". Ich habe bei mir keine Drawpage...geschweige denn weiß ich nicht genau was das ist
Ich habe dein Makro ausprobiert und da kommt in der Zeile
Code: Alles auswählen
Dlg_Hersteller.Model.GetByName("ListBox_Herst").StringItemList = liste()
folgender Fehlercode:
BASIC-Laufzeitfehler.
Es ist eine Ausnahme aufgetreten
Type: com.sun.star.lang.IllegalArgumentException
Message: .
LG
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
dazu kann ich nichts sagen, die Funktion ist bei mir einwandfrei, was ich natürlich auch geprüft habe ehe ich meinen Post geschrieben habe.Ich habe dein Makro ausprobiert und da kommt in der Zeile [...]
Gruß
Stephan
- Dateianhänge
-
- Hersteller2b.ods
- (32.79 KiB) 86-mal heruntergeladen
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
ah...ok. Ich glaube wir haben aneinander vorbeigeschrieben
Mein Gedanke war nicht die Listbox für die Hersteller zu füllen...sondern die ganzen anderen Krontrollfelder (Status, Team, Saisons...) und zwar anhand der Daten, die irgendwann mal in den Zellen drin stehen werden. Also wenn bei Hersteller 100% Status aktiv, Team Parts, Saison 2015 X drin steht, dann müsste das in dem Dialog, der aufgeht, wenn man auf Hersteller bearbeiten (bzw in dieser Datei noch Neuer Hersteller) klickt und den Hersteller 100% auswählt, schon vorausgewählt sein. Damit derjenige, der die Daten des Herstellers mal ändern muss, weiß was schon drin steht und das auch wieder reingeschrieben wird, wenn eine Änderung bzw. "Hinzufügung" vorgenommen wurde.
Ich wollte auch nicht sagen, dass dein Makro falsch ist....ich bin nur einfach zu blöde
LG
Mein Gedanke war nicht die Listbox für die Hersteller zu füllen...sondern die ganzen anderen Krontrollfelder (Status, Team, Saisons...) und zwar anhand der Daten, die irgendwann mal in den Zellen drin stehen werden. Also wenn bei Hersteller 100% Status aktiv, Team Parts, Saison 2015 X drin steht, dann müsste das in dem Dialog, der aufgeht, wenn man auf Hersteller bearbeiten (bzw in dieser Datei noch Neuer Hersteller) klickt und den Hersteller 100% auswählt, schon vorausgewählt sein. Damit derjenige, der die Daten des Herstellers mal ändern muss, weiß was schon drin steht und das auch wieder reingeschrieben wird, wenn eine Änderung bzw. "Hinzufügung" vorgenommen wurde.
Ich wollte auch nicht sagen, dass dein Makro falsch ist....ich bin nur einfach zu blöde
LG
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Das Schreiben von Werte in den Dialog aus dem Tabellenblatt ist doch nur die Umkehrung des schon erläuterten Schreibens in das Tabellenblatt.
Beispielhaft für die zwei Radiobuttons aktiv/inaktiv also:
Dieses Makro muss einem passenden Ereignis der Listbox, hier also beispielsweise dem Ereignis "Status geändert" zugewiesen werden.
Gruß
Stephan
Beispielhaft für die zwei Radiobuttons aktiv/inaktiv also:
Code: Alles auswählen
Sub einlesen()
For i = 1 To 1000
If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(0,i).String = _
Dlg_Hersteller.getControl("ListBox_Herst").SelectedItem Then
If ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "aktiv" Then
Dlg_Hersteller.getControl("OBaktiv").State = True
ElseIf ThisComponent.Sheets().GetByName("Tabelle1").getCellByPosition(1,i).String = "inaktiv" Then
Dlg_Hersteller.getControl("OBinaktiv").State = True
End If
End If
Next i
End Sub
Gruß
Stephan
- Dateianhänge
-
- Hersteller2c.ods
- (32.96 KiB) 105-mal heruntergeladen
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Hallo Stephan
Nach längerem drüber nachdenken gestern Abend kam mir die "Idee" auch in den Kopf. Ich dachte nur, dass es da vielleicht einen kürzeren Weg gibt, da das Makro ja schon so lang ist. Aber ich werde es probieren. Ich danke dir.
LG und schönes Wochenende
Nach längerem drüber nachdenken gestern Abend kam mir die "Idee" auch in den Kopf. Ich dachte nur, dass es da vielleicht einen kürzeren Weg gibt, da das Makro ja schon so lang ist. Aber ich werde es probieren. Ich danke dir.
LG und schönes Wochenende
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Nochmal Hallo
Ich habe dein Makro jetzt soweit an meine angepasst. Funzt alles prima. Jetzt hab ich nur noch ein Problem mit einer anderen Listbox in einem anderen Dialog. Wie muss ich das Calc Basic denn begreiflich machen, dass er mir den Eintrag in der Listbox markieren soll, wenn der in der entsprechende Zelle steht.
Hier mal ein Ausschnitt aus diesem Makro.
Ich bekomme so keine Fehlermeldung. Es wird einfach nur nix in der Listbox markiert.
Vielleicht kannst du mir ja hier nochmal helfen?! Ich bin dann auch bald fertig mit meinem "kleinen" Projekt
Danke schon mal
LG
Ich habe dein Makro jetzt soweit an meine angepasst. Funzt alles prima. Jetzt hab ich nur noch ein Problem mit einer anderen Listbox in einem anderen Dialog. Wie muss ich das Calc Basic denn begreiflich machen, dass er mir den Eintrag in der Listbox markieren soll, wenn der in der entsprechende Zelle steht.
Hier mal ein Ausschnitt aus diesem Makro.
Code: Alles auswählen
For i = 1 To 1000
If ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(1,i).String = _
Dlg_neuer_Eintrag.getControl("ListBox_Herst_Eintrag").SelectedItem Then
If ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String <> "" Then
Dlg_neuer_Eintrag.getControl("ListBox_Pfleger").getSelectedItem = ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String
ElseIf ThisComponent.Sheets().GetByName("Datenblatt 2015").getCellByPosition(13,i).String = "" Then
Dlg_neuer_Eintrag.getControl("ListBox_Pfleger").getSelectedItem = ""
End If
End If
Next i
Vielleicht kannst du mir ja hier nochmal helfen?! Ich bin dann auch bald fertig mit meinem "kleinen" Projekt
Danke schon mal
LG
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
ich sehe in Deinem Code nicht die Stelle wo in der Listbox selektiert werden soll.
Ein Eintrag in der Listbox wird jedoch allgemein so selektiert, z.B. der Eintrag "ACROS":
Gruß
Stephan
Ein Eintrag in der Listbox wird jedoch allgemein so selektiert, z.B. der Eintrag "ACROS":
Code: Alles auswählen
Dlg_Hersteller.getControl("ListBox_Herst").selectItem("ACROS", True)
Stephan
Re: Listenfeld aus Dialog in Tabellenblatt übertragen
Es geht. Ich danke dir vielmals.