Date: prev next · Thread: first prev next last
2011 Archives by date, by thread · List index




Hallo
hier der Richtige Code der Abgewandelten Sortierfunktion:
Bei der letzten Mail hatte ich leider eine Zeile zu viel drin.



 Function sortByColumn2 (ByVal nSortColumn AS Integer, _
                    ByVal sSortSheet As String, _
                    ByVal nStartColumn As Integer, _
                    ByVal nStartRow As Integer, _
                    ByVal nEndColumn As Integer, _
                    ByVal nEndRow As Integer, _
                    ByVal bAscending As Boolean)AS String
  sortByColumn2= "Sortier-Funktion2"
Dim nBreite as integer
Dim aSortFields(0) as New com.sun.star.util.SortField
Dim aSortDesc(0) as New com.sun.star.beans.PropertyValue
Dim oSortRange As Object
Dim oSheet1 As Object


oSheet1 = ThisComponent.Sheets.GetByName(sSortSheet)
'sSortSheet = Name der Tabelle. Darf nicht Die Tabelle Sein, auf der die
Funktion Steht.

     nBreite = nEndColumn - nStartColumn
If nSortColumn<= nBreite And  nSortColumn>= 0 Then


    oSortRange = oSheet1.getCellRangeByPosition(nStartColumn,
nStartRow, nEndColumn, nEndRow)'Bereich "A1:D5"=(0,0,3,4)


   aSortFields(0).Field = nSortColumn ' "nSortCoulumn" ist die
Spaltennummer inerhalb der Bereichs, nach der Sortiert werden sooll.
Spalte A = 0
   aSortFields(0).SortAscending= bAscending '1 entspricht "True" für
aufsteigend und 0 entspricht "False" für absteigend

   aSortDesc(0).Name = "SortFields"
   aSortDesc(0).Value = aSortFields()
      oSortRange.Sort(aSortDesc())
      sortByColumn= "Sortier-Funktion"

Else
    sortByColumn2= "Die Spalte ist auserhalb des Bereichs." 'Bedeutet:
Die spalte ist auserhalb des Sortier-Bereichs.
End if

End Function


Und der Aufruf:

=SORTBYCOLUMN2(B4;"Tabelle2";0;10;2;23;B5)

Der Bereich (0;10;2;23) entspricht dem Bereich "A11:C24"
Alles andere ist wie gehabt.

Gruß
Frieder

Am 22.10.2011 21:12, schrieb gooly:
  Hey! WOW! Das hätt ich wirklich nicht erwartet - ganz, ganz herzlichen
  Dank!

  ..und gleich eine Frage hinterher:

  Ich habe eine vorbereitete, fast leere Tabelle, Name "BackTest", in
  die ich Testergebnisse unterschiedlichen Umfangs hinein kopiere (zur
  Analyse in (aus, von) der Tabelle "Analyse" muss ich dann jeweils nach
  einer Spalte sortieren - beide im selben Dokument, so kommt Dein code
  zum Laufen).

  In der Tab. "Analyse" will ich nun zwei Zellen haben, die mir sagen,
  welches ist die letzte Zeile bzw. die letzte Spalte mit
  Ergebniseinträgen, also nicht leer.

  Leider 'verträgt' die Funktion VERGLEICH (zB
  =VERGLEICH("",BackTest.A2:zz2;[1,0,-1])) kein "", wenn die Zellen ganz
  leer sind. Auch die Funktion Istleer(BackTest.A2:ZZ2) (oder sowas..)
  'geht' nicht.

  Daher habe ich in alle Zellen BackTest.A2:A20000 und BackTest.A2:zz2
  "" eingetragen, die dann von den Testergebnissen zT. überschrieben
  werden. Jetzt kriege ich jeweils
  die letzte Zeile  (=VERGLEICH("";BackTest.A1:A20000;)-1
  und letzte Spalte (=VERGLEICH("";BackTest.A2:ZZ2;)-1

  Das geht also, aber eigentlich sollte es dafür doch eine elegantere
  Lösung geben? Gibt's die und wie würde die lauten?
Ja die gibt es:
=ANZAHL2(BackTest.A1:A20000)
Und
=ANZAHL2(BackTest.A2:ZZ2)
diese Formeln liefern dir dann die Größe der Tabelle.(vorausgesetzt sie
enthält keine leeren zellen( " " zählt auch als nicht Leer))
Wenn du diese Ergebnisse dann in meiner Funktion verwenden willst, dann
kann ich die Funktion so abwandeln, dass sie statt
zb. "A2:G10" die Werte (0;1;6;9) zur Bestimmung des zu sortierenden
Bereichs akzeptiert.
Wenn du das willst, kann ich das gerne erledigen.

Gruß
Frieder


  Noch mal herzlichen Dank,
  Gooly

  Am 22.10.2011 18:16, schrieb Frieder:
  Am 22.10.2011 11:16, schrieb gooly:
  Nochmals Danke, Frieder!

  Ich hätte aber jetzt noch eine kleine Frage dazu:

  Am 19.10.2011 13:18, schrieb Frieder:
  >   diesen Code einfach in ein Neues Modul
  >   kopieren.(Menü->Extras->Makros->MakrosVerwalten->Libreoffice
  >   Basic->"Dein dokument"
  >   ->Standard->Auf Neu klicken->   Modul Umbenennen in
  >   z.B"sortierFunktion"->Makro aus der e-mail einfügen->Speichern.
  >   Aufgerufen wird die Funktion mit:
  >
  >   =SORTBYCOLUMN(B1;"Tabelle2";"A15:C28";B2)

  Die im 'leeren' Standard stehenden subs:
  - sub Main..end sub und
  - sub Macro..end sub
  habe ich komplett gelöscht - war (ist) das ok?

  LG, Gooly

  Hallo
  ich habe den Code noch etwas modifiziert.:

  Function sortByColumn (ByVal nSortColumn AS Integer,ByVal sSortSheet As
  String,ByVal sSortRange As String,ByVal bAscending As Boolean)AS String
  sortByColumn= "Sortier-Funktion"
  Dim nBreite as integer
  Dim aSortFields(0) as New com.sun.star.util.SortField
  Dim aSortDesc(0) as New com.sun.star.beans.PropertyValue
  Dim oSortRange As Object
  Dim oSheet1 As Object
  Dim a(1)
  Dim sStartCell As String
  Dim sEndCell As String
  a()=Split(sSortRange, ":",2)
  sStartCell=a(0)
  sEndCell=a(1)

  oSheet1 = ThisComponent.Sheets.GetByName(sSortSheet)
  'sSortSheet = Name der Tabelle. Darf nicht Die Tabelle Sein, auf der die
  Funktion Steht.
  nStartColumn =
  oSheet1.getCellRangeByName(sStartCell).getcelladdress.Column
  nEndColumn = oSheet1.getCellRangeByName(sEndCell).getcelladdress.Column
  nBreite = nEndColumn - nStartColumn
  If nSortColumn<= nBreite And nSortColumn>= 0 Then

  oSortRange = oSheet1.getCellRangeByName(sSortRange)'sSortRange =
  z.b."A2:F7"

  aSortFields(0).Field = nSortColumn ' "nSortCoulumn" ist die
  Spaltennummer inerhalb der Bereichs, nach der Sortiert werden sooll.
  Spalte A = 0
  aSortFields(0).SortAscending= bAscending '1 entspricht "True" für
  aufsteigend und 0 entspricht "False" für absteigend

  aSortDesc(0).Name = "SortFields"
  aSortDesc(0).Value = aSortFields()
  oSortRange.Sort(aSortDesc())
  sortByColumn= "Sortier-Funktion"

  Else
  sortByColumn= "Die Spalte ist auserhalb des Bereichs." 'Bedeutet: Die
  spalte ist auserhalb des Sortier-Bereichs.
  End if

  End Function

  Aufruf der Funktion:
  =SORTBYCOLUMN(B1;"Tabelle2";"A15:C28";B2)

  B1 =Zelle, in der steht,nach welcher Spalte sortiert werden soll.(0=1.
  Spaltedes Sortierbereichs, in dem Fall Spalte A)
  Tabelle2=Tabellenname der zu sortirenden Tabelle ( muss in "" stehen.)
  A15:C28= zu sortierender Bereich ( ohne Kopfzeile)( muss in "" stehen.)
  B2=Zelle, in der steht,ob aufsteigend(1) oder absteigend(0) Sortiert
  werden soll.(man kann hier auch direkt 1 oder 0 eintragen)

  Hier ist der Link zu einer Beispiel-Datei, wo du alles Ausprobieren
  kannst.
  http://wurzelmanager.blogger.de/getfile?name=sortierfunktion.ods
  Dort habe ich auch alles noch etwas genauer erklärt.
  Gruß Frieder




--
Informationen zum Abmelden: E-Mail an users+help@de.libreoffice.org
Tips zu Listenmails: http://wiki.documentfoundation.org/Netiquette/de
Listenarchiv: http://listarchives.libreoffice.org/de/users/
Alle E-Mails an diese Liste werden unlöschbar öffentlich archiviert

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.