Seite 1 von 1

GELÖST - Suchergebnisse in eine Listbox übertragen

Verfasst: So, 08.04.2012 02:44
von Ralf.H
Hallo zusammen,

ich bin bei der Beschäftigung mit Arrays und Suchen irgendwie in einer Sackgasse gelandet und stehe auf dem Schlauch.
Folgendes Problem:
In einem Tabellenblatt habe ich als Spalten: lfd.Nr., Nachname, Vorname, usw.
Ich möchte nun in der Spalte B (also in den Nachnamen) nach einer (oder mehrerer) Person(en) suchen. Das Ergebnis soll dann nicht nur den Namen, sondern auch Daten aus weiteren Spalten der gefundenen Reihe in eine Listbox eines Dialoges schreiben.

Ich bin bis jetzt so weit gekommen:

Code: Alles auswählen

sub FillMyListbox

'	SuchString = dlg.getControl("searchNname").text                'Das ist der eigentliche Code, den Namen "Meier" setze ich nur zu Testzwecken
	SuchString = "Meier"

	mySheet = thisComponent.Sheets().getByName("Daten")
	SearchRange = mySheet.getCellRangeByName("$B$6:$B$65535")

	Suchbeschreibung = mySheet.createSearchDescriptor()
	With SuchBeschreibung
		.SearchString = SuchString						'Übergabe des Suchbegriffes
		.SearchCaseSensitive = false					'Falls True, wird die Groß- und Kleinschreibung beachtet.
		.SearchWords = true								'Falls True, werden nur ganze Wörter gefunden.
	End With

	FoundArray = SearchRange.findAll(Suchbeschreibung)

	if isNull(FoundArray()) = true then
		print "nichts gefunden"
		exit sub
		else
		print FoundArray.getCount() & " Treffer gefunden !"              'Hier wird mir die richte Trefferzahl sogar angezeigt (>25)
	end if


	'jetzt das Ganze in eine Textbox
	x = dlg.getControl("searchList").itemcount
	dlg.getControl("searchList").removeItems(0,x)

	for x = 0 to FoundArray.getCount() - 1

		print x & ", " & FoundArray.getByIndex(x).CellAddress.Row          'Hier fliegt mir der Code bei mehr als zwei Treffern um die Ohren

		y = FoundArray.getByIndex(x).CellAddress.Row
		ItemStr = mySheet.getCellByPosition(1,y).string & ", " & _
				  mySheet.getCellByPosition(2,y).string & ", *" & _
				  mySheet.getCellByPosition(3,y).string & " (" & _
				  mySheet.getCellByPosition(25,y).string & ")"
		dlg.getControl("searchList").addItem(ItemStr,x)
	next x

end sub
So weit, so schlecht ...
Mit einem oder zwei Treffern funktioniert das Ganze sogar. Wenn ich allerdings mehr als zwei Treffer erhalte, kommt bei der Zeile:

-> print x & ", " & FoundArray.getByIndex(x).CellAddress.Row

die Fehlermeldung "Eigenschaft oder Methode nicht gefunden: CellAddress". Die Zeile ist nur zu Testzwecken eingefügt, ohne sie fliegt das Ganze eine Zeile später ins dröhende Nichts ;-(

Was mache ich falsch (außer, dass es vmtl. elegantere Lösungen für mein Problem geben wird !)

Vielen Dank für die geopferte Zeit - Ralf

Re: Suchergebnisse in eine Listbox übertragen

Verfasst: So, 08.04.2012 08:23
von Karolus
Hallo
Eigentlich machst du nichts grundsätzlich falsches, du hast nur mehrere aufeinanderfolgende Zellen die ins Suchmuster passen -
Solche zusammenhängende Zellblöcke stecken dann auch in deinem "Container" 'FoundArray'.
Zellbereiche haben keine Methode ..'CellAddress' sondern nur ...RangeAddress - glücklicherweise haben Einzelzellen ebenfalls eine .RangeAddress

Code: Alles auswählen

sub FillMyListbox

'   SuchString = dlg.getControl("searchNname").text                'Das ist der eigentliche Code, den Namen "Meier" setze ich nur zu Testzwecken
   SuchString = "Meier"

   mySheet = thisComponent.Sheets().getByName("Daten")
   SearchRange = mySheet.getCellRangeByName("$B$6:$B$65535")

   Suchbeschreibung = mySheet.createSearchDescriptor()
   With SuchBeschreibung
      .SearchString = SuchString                  'Übergabe des Suchbegriffes
      .SearchCaseSensitive = false               'Falls True, wird die Groß- und Kleinschreibung beachtet.
      .SearchWords = true                        'Falls True, werden nur ganze Wörter gefunden.
   End With

   FoundArray = SearchRange.findAll(Suchbeschreibung)

   if isNull(FoundArray()) = true then
      print "nichts gefunden"
      exit sub
      else
      print FoundArray.getCount() & " Treffer gefunden !"              'Hier wird mir die richte Trefferzahl sogar angezeigt (>25)
   end if


   'jetzt das Ganze in eine Textbox
   x = dlg.getControl("searchList").itemcount
   dlg.getControl("searchList").removeItems(0,x)

   for n = 0 to FoundArray.getCount() - 1

      start = FoundArray.getByIndex( n ).RangeAddress.StartRow  
      end =  FoundArray.getByIndex( n ).RangeAddress.EndRow       
      for row = start to end
      
      ItemStr = mySheet.getCellByPosition( 1, row ).string & ", " & _
              mySheet.getCellByPosition( 2, row ).string & ", *" & _
              mySheet.getCellByPosition( 3, row ).string & " (" & _
              mySheet.getCellByPosition( 25, row ).string & ")"
      dlg.getControl("searchList").addItem(ItemStr, x )
     next row
   next n

end sub
Ungetestet!

Karo

Re: Suchergebnisse in eine Listbox übertragen

Verfasst: So, 08.04.2012 12:56
von Ralf.H
Hi Karo,

vielen Dank, der Hinweis auf Bereiche im Container war goldrichtig.
Für alle "Jäger und Sammler" hier noch einmal der funktionierende Code:

Code: Alles auswählen

sub FillMyListbox

	Dim FoundArray  									'Array der Treffer
	dim myRangeStart as integer
	dim myRangeEnde as integer

'	SuchString = dlg.getControl("searchNname").text
	SuchString = "Meyer"

	mySheet = thisComponent.Sheets().getByName("Daten")
	SearchRange = mySheet.getCellRangeByName("$B$6:$B$65535")

	Suchbeschreibung = mySheet.createSearchDescriptor()
	With SuchBeschreibung
		.SearchString = SuchString						'Übergabe des Suchbegriffes
		.SearchCaseSensitive = false					'Falls True, wird die Groß- und Kleinschreibung beachtet.
		.SearchWords = true							'Falls True, werden nur ganze Wörter gefunden.
	End With

	FoundArray = SearchRange.findAll(Suchbeschreibung)

	if isNull(FoundArray()) = true then
		print "nichts gefunden"
		exit sub
	end if

	'jetzt das Ganze in eine Textbox
	x = dlg.getControl("searchList").itemcount
	dlg.getControl("searchList").removeItems(0,x)

	z = 0												' Z wird gebraucht, damit der Eintrag in die ListBox der Reihenfolge des Auffindens entspricht
	for x = 0 to FoundArray.getCount() - 1
	
		FoundRangeStart = FoundArray.getByIndex( x ).RangeAddress.StartRow 
		FoundRangeEnd = FoundArray.getByIndex( x ).RangeAddress.EndRow  

		for y = FoundRangeStart to FoundRangeEnd
			ItemStr = mySheet.getCellByPosition(1,y).string & ", " & _
					  mySheet.getCellByPosition(2,y).string & ", *" & _
					  mySheet.getCellByPosition(3,y).string & " (" & _
					  mySheet.getCellByPosition(25,y).string & ")"
			dlg.getControl("searchList").addItem(ItemStr,z)
			z=z+1
		next y
	next x

end sub

Ich habe in diesem Beispiel den Suchbegriff "Meyer" direkt zugewiesen, normalerweise wird er als Argument an die Prozedur übergeben.
Der Name der Listbox (hier "searchList") muss natürlich auch angepasst werden und die entsprechenden Variablen und Objekte ebenfalls richtig deklariert werden.
Ich habe dazu noch die Variable "z" mit ins Spiel gebracht, damit die Ergebnisse auch in entsprechender Reihenfolge in die Listbox eingetragen werden. An einer eleganteren Lösung arbeite ich noch :-)

Damit setze ich den Thread auf gelöst ...
... und wende mich nun der Aufgabe zu, bei der Suche nach "Meier" auch Personen mit dem Namen Maier oder Meir zu finden - ich denke, man liest sich !!!

Bis dahin noch mal THX und ein nettes Osterwochenende - Ralf

Re: GELÖST - Suchergebnisse in eine Listbox übertragen

Verfasst: Do, 14.06.2012 17:51
von CocoJambo
Karo...vielen Dank. Ich werde mich jetzt nochmal dran setzen, da mich seit geraumer Zeit genau das selbe Problem plagt.