Listbox im Dialog auslesen und weiterverarbeiten
Moderator: Moderatoren
Listbox im Dialog auslesen und weiterverarbeiten
Hallo liebe Gemeinde,
obwohl ich mehrere Wochen hier im Forum gelesen habe, finde ich keine Lösung.
Bei der Suche nach einer Lösung habe ich einige andere Anwendungen hier im Forum gefunden, die ich umsetzen konnte. Nur in diesem speziellen Fall fand ich nichts Brauchbares:
In meinem Dialog habe ich eine Listbox, die ich mit Nachnamen aus einer Spalte gefüllt habe.
Nun soll bei Auswahl eines Namens die restlichen Felder des Dialogs der betreffenden Zeile gefüllt werden.
Mit der Inputbox habe ich es, Dank eurer Hilfe, hinbekommen.
Da aber häufig Namensgleichheit besteht, muss ich auch noch mindestens den Vornamen in die Selektion mit einschließen.
Wie soll dies gehen ? Find Next oder so ?
Könnt ihr mir dabei helfen, denn ich bin noch blutiger Anfänger und möchte mir dieses Grundwissen aneignen ?
Wenn ich mir Bruchstücke von Andrew Pitonyak, Dannhöfer und Co zusammen suche, hakt es dann immer irgendwo.
Ich befürchte, wenn ich mir Bücher dazu kaufe, wird es ähnlich sein.
In der angehängten Datei seht ihr nur ein paar der vielen kläglichen Versuche, die ich gestartet habe.
obwohl ich mehrere Wochen hier im Forum gelesen habe, finde ich keine Lösung.
Bei der Suche nach einer Lösung habe ich einige andere Anwendungen hier im Forum gefunden, die ich umsetzen konnte. Nur in diesem speziellen Fall fand ich nichts Brauchbares:
In meinem Dialog habe ich eine Listbox, die ich mit Nachnamen aus einer Spalte gefüllt habe.
Nun soll bei Auswahl eines Namens die restlichen Felder des Dialogs der betreffenden Zeile gefüllt werden.
Mit der Inputbox habe ich es, Dank eurer Hilfe, hinbekommen.
Da aber häufig Namensgleichheit besteht, muss ich auch noch mindestens den Vornamen in die Selektion mit einschließen.
Wie soll dies gehen ? Find Next oder so ?
Könnt ihr mir dabei helfen, denn ich bin noch blutiger Anfänger und möchte mir dieses Grundwissen aneignen ?
Wenn ich mir Bruchstücke von Andrew Pitonyak, Dannhöfer und Co zusammen suche, hakt es dann immer irgendwo.
Ich befürchte, wenn ich mir Bücher dazu kaufe, wird es ähnlich sein.
In der angehängten Datei seht ihr nur ein paar der vielen kläglichen Versuche, die ich gestartet habe.
- Dateianhänge
-
- Listbox 1 Forum.ods
- (25.93 KiB) 157-mal heruntergeladen
Win 10
Re: Listbox im Dialog auslesen und weiterverarbeiten
Es ist eine Frage der konkreten Daten und weniger der Programmierung das man in Deiner Beispieldatei eigentlich keine Listboxen verwenden sollte, weil das inhaltlich nicht so sinnvoll ist, da ja immer ein konkreter Datensatz geändert werden soll und man Namen, Vorname und Ort nur dann in einer Listbox anbieten kann wenn man alle denkbaren Namen und Ort in die Listbox aufnehmen würde, denn zum Ändern reicht es ja nicht nur die Namen und Orte wählen zu können die bereits in der Datentabelle sind.
In der angehängten Datei habe ich das Startmakro entsprechend angepasst, die übrigen Makros müssen ggf. noch angepasst werden.
Gruß
Stephan
Code: Alles auswählen
Sub Person_bearbeiten()
oDoc = thisComponent
oSheet = ThisComponent.Sheets().getByName("Tabelle1")
DialogLibraries.LoadLibrary( "Standard" )
DlgPersAendern = CreateUnoDialog( DialogLibraries.Standard.DlgPersAendern)
With ThisComponent.getCurrentSelection
If .supportsService("com.sun.star.sheet.SheetCell") then
akt_zeile = .RangeAddress.Startrow
ELse
Msgbox "Bitte nur eine Zelle in gewünschter Zeile markieren",16,"Falsche Selektion"
Exit Sub
End If
End With
With ThisComponent.CurrentController.ActiveSheet
DlgPersAendern.getControl("CB3").Text = .getCellByPosition(3, akt_zeile).String
DlgPersAendern.getControl("txt_vorname").Text = .getCellByPosition(4, akt_zeile).String
DlgPersAendern.getControl("txt_nachname").Text = .getCellByPosition(5, akt_zeile).String
DlgPersAendern.getControl("date_geburtsdatum").Text = .getCellByPosition(6, akt_zeile).FormulaLocal
DlgPersAendern.getControl("TField14").Text = .getCellByPosition(7, akt_zeile).String
End With
DlgPersAendern.Execute()
End sub
Gruß
Stephan
- Dateianhänge
-
- Listbox 1 Forum_überarbeitet.ods
- (25.21 KiB) 132-mal heruntergeladen
Re: Listbox im Dialog auslesen und weiterverarbeiten
Hallo Stephan,
nachdem ich Textfelder im Dialog erstellt habe, werden die betreffenden Daten auch im Dialog übernommen.
Dazu muss der Cursor allerdings bereits in der Zeile stehen !
Ich hatte gedacht, dass durch die Auswahl des Namens in der Listbox, der Cursor zunächst in die erste gefundene Zelle springt und die Daten holt. Wenn dies dann nicht zutreffend ist, sollte der der nächste Satz geholt werden.
Aber ok, dann versuche ich es einmal so, wie Du es geschrieben hast. Vielen Dank
Da ich ungern mit "getCellByPosition" arbeite ( ich muss ja zählen ), werde ich die vielleicht noch umschreiben in getCellByName. Dies dürfte kein Problem werden.
Zum Abspeichern muss ich noch Änderungen vornehmen.
Vielen Dank, bis morgen
kalle
nachdem ich Textfelder im Dialog erstellt habe, werden die betreffenden Daten auch im Dialog übernommen.
Dazu muss der Cursor allerdings bereits in der Zeile stehen !
Ich hatte gedacht, dass durch die Auswahl des Namens in der Listbox, der Cursor zunächst in die erste gefundene Zelle springt und die Daten holt. Wenn dies dann nicht zutreffend ist, sollte der der nächste Satz geholt werden.
Aber ok, dann versuche ich es einmal so, wie Du es geschrieben hast. Vielen Dank
Da ich ungern mit "getCellByPosition" arbeite ( ich muss ja zählen ), werde ich die vielleicht noch umschreiben in getCellByName. Dies dürfte kein Problem werden.
Zum Abspeichern muss ich noch Änderungen vornehmen.
Vielen Dank, bis morgen
kalle
Win 10
Re: Listbox im Dialog auslesen und weiterverarbeiten
Es ist, wie schon angedeutet, kein Programmierproblem (man könnte das also so machen) sondern eine Frage der Zweckmäßigkeit, denn wozu willst Du mehrfach weiter klicken, wenn der Name "Meier" ist und Du den letzten "Meiner"-Eintrag brauchst. Da ist es doch viel bequemer gleich den richtigen Meier zu wählen.Ich hatte gedacht, dass durch die Auswahl des Namens in der Listbox, der Cursor zunächst in die erste gefundene Zelle springt und die Daten holt. Wenn dies dann nicht zutreffend ist, sollte der der nächste Satz geholt werden.
Wenn es hingegen stört das nach jedem Bearbeiten eines Datensatzes der Dialog neu gestartet werden muss ist das eine andere Frage, dann könnte man z.B. alle Einträge mit jeweils Nachname, Vorname, Ort in einer Listbox zusammenfassen. Die anhängende Datei zeigt das Prinzip, hat aber noch reichlich Verbesserungsbedarf.
Code: Alles auswählen
Sub Person_bearbeiten()
oDoc = thisComponent
oSheet = ThisComponent.Sheets().getByName("Tabelle1")
DialogLibraries.LoadLibrary( "Standard" )
DlgPersAendern = CreateUnoDialog( DialogLibraries.Standard.DlgPersAendern)
ausgangsdaten = ThisComponent.CurrentController.ActiveSheet.getCellRangeByName("C5:H100").getDataArray
Dim alle()
For i = 0 To UBOUND(ausgangsdaten())
If ausgangsdaten(i) (0) <> "" Then
Redim Preserve alle(i)
alle(i) = ausgangsdaten(i) (3) & ", " & ausgangsdaten(i) (2) & ", " & ausgangsdaten(i) (5) & " #" & ausgangsdaten(i) (0)
End If
Next i
DlgPersAendern.Model.getByName("lst_alle").StringItemList = alle()
DlgPersAendern.Execute()
End sub
Sub zu_Datensatz_springen()
erg = Split(DlgPersAendern.getControl("lst_alle").selectedItem, "#")
ds_nummer = erg(1)
For i = 0 To 99
If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+3).FormulaLOcal = ds_nummer Then
j = i+3
Exit For
End If
Next i
With ThisComponent.CurrentController.ActiveSheet
DlgPersAendern.getControl("CB3").Text = .getCellByPosition(3, j).String
DlgPersAendern.getControl("txt_vorname").Text = .getCellByPosition(4, j).String
DlgPersAendern.getControl("txt_nachname").Text = .getCellByPosition(5, j).String
DlgPersAendern.getControl("date_geburtsdatum").Text = .getCellByPosition(6, j).FormulaLocal
DlgPersAendern.getControl("TField14").Text = .getCellByPosition(7, j).String
End With
End Sub
https://forum.openoffice.org/en/forum/v ... 96#p365635
- Dateianhänge
-
- Listbox 1 Forum_überarbeitet2.ods
- (25.55 KiB) 126-mal heruntergeladen
Re: Listbox im Dialog auslesen und weiterverarbeiten
Hallo Stephan,
soooo habe ich mir dies vorgestellt. Vielen Dank
Da ich etwas lernen möchte habe ich noch ein paar Fragen:
Sehe ich es richtig , dass das Lattenkreuz als Platzhalter dient ?
Was bedeutet "erg", ist dies frei wählbar ?
Mit "i" sind sicherlich die Zeilen gemeint, doch was bedeutet "j" ?
Und mit
ist dann die Spalte D (Spalte A = 0) gemeint ?
Was bedeutet Mich irritiert die Position 2(Lfd.-Nr.) in Verbindung mit i+3
Vielen Dank für Deinen Code. Nun habe ich einiges aufzuarbeiten.
Gruß Kalle
soooo habe ich mir dies vorgestellt. Vielen Dank
Da ich etwas lernen möchte habe ich noch ein paar Fragen:
Sehe ich es richtig , dass das Lattenkreuz als Platzhalter dient ?
Was bedeutet "erg", ist dies frei wählbar ?
Mit "i" sind sicherlich die Zeilen gemeint, doch was bedeutet "j" ?
Und mit
Code: Alles auswählen
alle(i) = ausgangsdaten(i) (3)
Was bedeutet
Code: Alles auswählen
getCellByPosition(2, i+3)
Vielen Dank für Deinen Code. Nun habe ich einiges aufzuarbeiten.
Gruß Kalle
Win 10
Re: Listbox im Dialog auslesen und weiterverarbeiten
Das 'Lattenkreuz' (Raute) dient nur dazu ein eindeutige Trennstelle zwischen der laufenden Nummer und dem Rest zu schaffen, damit die lfd. Numnmer bequem per Split()-Anweisung abgetrennt werden kann.Sehe ich es richtig , dass das Lattenkreuz als Platzhalter dient ?
Die laufende NUmmer ihrerseits wird gebraucht um den Datensatz in der Calc-Tabelle ein-eindeutig zu identifizieren.
Das Ganze ist ein wenig 'hemdsärmlig' programmiert, erfüllt aber zunächst seinen Zweck.
erg ist nur ein Variablennasme, im Konkreten einer Variable die ein Array zugewiesen bekommt, welchjes aus der Split-Anweisung resultiert. Ja, der Name "erg" ist frei wählbar, einzig sollte/darf es kein 'Wort' sein was Teil der Basic-Programmiersprache ist.Was bedeutet "erg", ist dies frei wählbar ?
Ja, i meint hier die Zeilen (den Index der Zeilen), und zwar einmal die Zeilen eines Array():Mit "i" sind sicherlich die Zeilen gemeint, doch was bedeutet "j" ?
Code: Alles auswählen
For i = 0 To UBOUND(ausgangsdaten())
If ausgangsdaten(i) (0) <> "" Then
Redim Preserve alle(i)
alle(i) = ausgangsdaten(i) (3) & ", " & ausgangsdaten(i) (2) & ", " & ausgangsdaten(i) (5) & " #" & ausgangsdaten(i) (0)
End If
Next i
Code: Alles auswählen
For i = 0 To 99
If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+3).FormulaLOcal = ds_nummer Then
j = i+3
Exit For
End If
Next i
j ist wieder nur der Name einer Variable, man könnte das auch "x" oder "erg2" oder "BlaBla" oder sonstwie nennen. Sinnvoll ist es aber Variablennamen zu verwenden die etwas über das sagen was die Variable beeinhaltet, z.B. die zwei Variablen "alle" und "ausgangsdaten" sagen etwas über den Inhalt, "j" tut das nicht, ist also eigentlich kein günstiger Variiablenname.
Links steht wieder eine Variable (in Form eines Array) hierbei wird der i-ten Zelle dieses Arrays der 3. Wert des Arrays zugewiesen das in der i-ten Zelle des Arrays "ausgangsdaten" steht.alle(i) = ausgangsdaten(i) (3)
Nein, das entspricht, hier im KOnkreten, nicht Spalte D (der Calc-Tabelle) weil das Array die Spalten C bis H der Calc-Tabelle rerpresentiert. Die 3. Spalte dieses Arrays (Zählung auch bei 0 beginnend) entspricht somit der Spalte F der Calc-Tabelle.
Das alles ist hier nur deshalb so weil DEine Calc-Tabelle nicht in Spalte A beginnte, sondern erst in Spalte C.
2 bedeutet Spalte C (3. Spalte, weil Zählung bei 0 beginnt).getCellByPosition(2, i+3)
i+3 ist ein Schreibfehler, in der Beispieldatei selbst steht richtigerweise i+4, das bedeutet das in Zeile 5 (Index = 4) der Calc-Tabelle begonnen wird weil dort die erste Datenzeile steht.
Man kann das aber variabel schreiben, z.B. ist:
Code: Alles auswählen
For i = 0 To 99
If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i+4).FormulaLOcal = ds_nummer Then
j = i+4
Exit For
End If
Next i
Code: Alles auswählen
For i = 4 To 103
If ThisComponent.CurrentController.ActiveSheet.getCellByPOsition(2, i).FormulaLOcal = ds_nummer Then
j = i
Exit For
End If
Next i
Gruß
Stephan
Re: Listbox im Dialog auslesen und weiterverarbeiten
Hallo Stephan,
Deine Ausführungen sind sehr ausführlich. Dies muss ich wohl mehrfach lesen und üben, bis ich dies verstehe.
Nachdem ich meinen Müll entsorgt habe, wollte ich Änderungen vornehmen. Doch ich stoße schon wieder an meine Grenzen.
Bei der Sub "Änderung speichern" werden die Änderungen in Spalte G1 und H1 geschrieben und nicht in die dazugehörenden Zeile.
Bis auf Nachname habe ich in den Feldern Nur Lesen auf Nein gesetzt.
Kannst Du mir noch einmal helfen ?
Gruß Kalle
Deine Ausführungen sind sehr ausführlich. Dies muss ich wohl mehrfach lesen und üben, bis ich dies verstehe.
Nachdem ich meinen Müll entsorgt habe, wollte ich Änderungen vornehmen. Doch ich stoße schon wieder an meine Grenzen.
Bei der Sub "Änderung speichern" werden die Änderungen in Spalte G1 und H1 geschrieben und nicht in die dazugehörenden Zeile.
Bis auf Nachname habe ich in den Feldern Nur Lesen auf Nein gesetzt.
Kannst Du mir noch einmal helfen ?
Gruß Kalle
- Dateianhänge
-
- Listbox Forum_überarbeitet2.ods
- (19.78 KiB) 133-mal heruntergeladen
Win 10
Re: Listbox im Dialog auslesen und weiterverarbeiten
Wahrscheinlich liegt es nur daran das j nicht deklariert ist und deshalb den Wert nur innerhalb des jeweiligen Makros behalt. ("Wahrscheinlich" weil es bei mir komischerweise ohne Deklaration funktioniert.)
Füge also im Kopf des Moduls hinzu:
Gruß
Stephan
Füge also im Kopf des Moduls hinzu:
Code: Alles auswählen
Dim j As Integer
Gruß
Stephan
- Dateianhänge
-
- Listbox 1 Forum_überarbeitet3.ods
- (27.64 KiB) 144-mal heruntergeladen
Re: Listbox im Dialog auslesen und weiterverarbeiten
Hallo Stephan,
jetzt funktioniert die Datei, bis auf den letzten Eintrag in der Listbox. Hier werden die Felder nicht geladen.
Ich habe selbst versucht, dies in der Sub zu_Datensatz_springen zu ändern, doch Fehlanzeige. Ich kann sicherlich in meiner OriginalDatei einen fiktiven Namen eintragen und das Problem wäre erledigt. Doch auch Du wirst der Meinung sein, dass dies unschön wäre.
Über Grid habe ich schon einiges hier im Forum gelesen. Und für die Datei bedanke ich mich. Ich mache nur noch
Dies sieht natürlich eleganter aus.
Doch bevor ich mich mit Grid auseinander setze, werde ich erst einmal 23 Spalten bearbeiten.
Vielen Dank und noch einen schönen Sonntag
kalle
jetzt funktioniert die Datei, bis auf den letzten Eintrag in der Listbox. Hier werden die Felder nicht geladen.
Ich habe selbst versucht, dies in der Sub zu_Datensatz_springen zu ändern, doch Fehlanzeige. Ich kann sicherlich in meiner OriginalDatei einen fiktiven Namen eintragen und das Problem wäre erledigt. Doch auch Du wirst der Meinung sein, dass dies unschön wäre.
Über Grid habe ich schon einiges hier im Forum gelesen. Und für die Datei bedanke ich mich. Ich mache nur noch
Dies sieht natürlich eleganter aus.
Doch bevor ich mich mit Grid auseinander setze, werde ich erst einmal 23 Spalten bearbeiten.
Vielen Dank und noch einen schönen Sonntag
kalle
Win 10
Re: Listbox im Dialog auslesen und weiterverarbeiten
Hallo Stephan,
ich muss mich korrigieren.
Durch läuft es jetzt perfekt.
Ich hatte nicht daran gedacht die Datei zu schliessen und wieder zu öffnen - Sorry.
Gruß
Kalle
ich muss mich korrigieren.
Durch
Code: Alles auswählen
Dim j As Integer
Ich hatte nicht daran gedacht die Datei zu schliessen und wieder zu öffnen - Sorry.
Gruß
Kalle
Win 10