Hallo!
Ich habe mir eine Lösung erarbeitet.
Da es sich bei mir hier um eine Liste mit Kunden handelt (extra Tabellenblatt) - die sich nicht ständig verändert - habe ich folgende Strategie gewählt:
1.) Es gibt ein eigenes Tabellenblatt namens "Setup" - dort wird an definiertes Stelle die Anzahl der Zeilen der Kundendaten hinterlegt
2.) Zum Programmstart wird diese Variable ausgelesen und die Gültigkeit überprüft
3.) Gültigkeit liegt vor, wenn dieser Eintrag auf eine belegte Zelle verweist (letzter Eintrag) und die nächste Zeile leer ist (erster leerer Datensatz)
4.) Bei Gültigkeit wird das Ergebnis in eine globale Variable geschrieben und die Routine verlassen
5.) Sonst wird nochmals jede Zeile von Anfang an ausgelesen, solange bis die erste leere Zeile vorliegt
6.) Das gefundene Ergebnis wird fürs nächste Mal ins Setup geschrieben.
Vorteil: Wenn sich nichts verändert geht die Abfrage sehr schnell - die lange Prozedur ist nur einmalig nach Veränderung notwendig.
Code: Alles auswählen
Public KundenAnzahl%
Public DOC_A, DOC_B As Object
SUB MAIN
Doc_B = ThisComponent
oDesktop = createUnoService("com.sun.star.frame.Desktop")
Url = ConvertToUrl ("C:\Daten\MDB\MDB-Daten.ods")
dim p(0) as new com.sun.star.beans.PropertyValue
p(0).Name = "Hidden"
p(0).Value = true
Doc_A = StarDesktop.loadComponentFromURL(Url, "_default", 0, p())
call Kundenanzahl_auslesen
END SUB
'------------------------------------------------------------------------------------------------------------------------
SUB Kundenanzahl_auslesen
'Wenn die gespeicherte Kundenanzahl stimmt, dann Ende, sonst neu bestimmen!
call ReadSetup(KundenSatz$,5,2)
KundenAnzahl%=val(KundenSatz$)
if KundenAnzahl%<1 then KundenAnzahl%=1
call ReadKunden(LetztDaten$,KundenAnzahl%,2)
call ReadKunden(ErstLeer$,KundenAnzahl%+1,2)
if (LetztDaten$<>"") and (ErstLeer$="") then exit SUB
for zeile%=1 to 30000
call ReadKunden(KundenDaten$,zeile%,2)
if KundenDaten$="" then KundenAnzahl%=zeile%-1:exit for
next zeile%
KundenSatz$=str$(KundenAnzahl%)
call WriteSetup(KundenSatz$,5,2)
END SUB
'------------------------------------------------------------------------------------------------------------------------
SUB ReadSetup(text$,zeile%,spalte%)
text$= Doc_A.Sheets.GetByName("Setup").getCellByPosition(spalte%-1,zeile%-1).string
END SUB
'------------------------------------------------------------------------------------------------------------------------
SUB WriteSetup(text$,zeile%,spalte%)
Doc_A.Sheets.GetByName("Setup").getCellByPosition(spalte%-1,zeile%-1).string=text$
END SUB
'------------------------------------------------------------------------------------------------------------------------
SUB ReadKunden(text$,zeile%,spalte%)
text$= Doc_A.Sheets.GetByName("Kunden").getCellByPosition(spalte%-1,zeile%-1).string
END SUB
Gibt es noch Verbesserungsvorschläge?
Oktobaer