Makros aufzeichnen und der Änderung einer Zelle zuweisen..

/
//From/: gooly <gooly@gmx.at <mailto:gooly%40gmx.at>>

Hallo,

Ich habe eine Zelle (Analyse:B4), der ich, wenn ich sie ändere, einen anderen Spaltenbuchstaben (zB 'n') einer anderen Tabelle (Tests) eintrage. Jetzt möchte ich gerne ein Makro schreiben, dass die 'andere Tabelle' insgesamt nach dieser Spalte sortiert wird. Leider finde ich nicht (mehr?):

a) die Option, Maus- und Tasten-'Dings' als Makro aufzuzeichnen - das würde alles etwas leichter machen und

Makros aufzeichnen ist meistens keine saubere Lösung.

b) wie ich dann dieses Makro einer Veränderung einer bestimmten (dieser) Zelle zuordne?

Das geht nur über eine Funktion.

Ich meinte b) noch gerade gefunden zu haben (Menu => ..(?).. => Änderungen => Zelle) - aber jetzt ist der Weg weg? Unter Extras=> Anpassen .. sehe ich nur entweder einzelnen Tasten- (F2,F3,..) oder Gesamtdokument-Änderungen (Sicher, Öffnen, ..?

LG, Gooly

Hier eine Lösung von mir:
Kopiere diesen Code in ein neues Modul,
und passe die Platzhalter "TabellenName" und " nColumn, nRow, nColumn1, nRow1 " deinen Bedürfnissen an.

Function sortByCoulumn (ByVal nSortCoulumn AS Integer, ByVal bAscending As Boolean)
Dim oSheet1 As Object
' "nSortCoulumn" ist die Spaltennummer, nach der Sortiert werden sooll. Spalte A = 0
oSheet1 = ThisComponent.Sheets.GetByName("TabellenName")
     '" nColumn, nRow, nColumn1, nRow1 " Mußt du deinen bedürftnissen anpassen (Zu Sortierender Bereich)
     oSortRange = oSheet1.getCellRangeByPosition(nColumn, nRow, nColumn1, nRow1)
         'nColumn, nRow, nColumn1, nRow1 fangen bei 0! an zu zählen. (0 ,0 ,2 , 4)=(A1:C5)
        aSortFields(0).Field = nSortCoulumn - oColumn
        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())
End Function

Anschließend Schreibst du Folgende Funktion in eine Zeile Deiner Tabelle:

=SORTBYCOULUMN("Deine Zelle";1) ' "Deine Zelle" ist z.B. D7 hier muss die Spaltennummer (Zahl von 0 bis ...),
nach der du Sortieren möchtest Stehen. Die 1 steht für Aufsteigend. wenn du 0 schreibst, wird absteigend sortiert.
Sobald der Wert in "Deine Zelle" verändert wird, wird die entsprechende Tabelle Sortiert.

LG Frieder

PS: habe deinen Beitrag erst jetzt gelesen, deshalb antworte ich erst jetzt.

Hallo,

und entschuldigung. Bei dem 1. Makro habe ich natürlich das Wichtigste Vergessen:

Dim aSortFields(0) as New com.sun.star.util.SortField
Dim aSortDesc(0) as New com.sun.star.beans.PropertyValue

Auserdem habe ich alles noch User-freundlicher gemacht.
Hier der neue Code:(getestet und läuft) :slight_smile:

Function sortByColumn (ByVal nSortColumn AS Integer,ByVal sSortSheet As String,ByVal sSortRange As String,ByVal bAscending As Boolean)AS String
   sortByColumn= "Sortier-Funktion"
Dim nColumn, nRow, nColumn1, nRow1 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.

    oSortRange = oSheet1.getCellRangeByName(sSortRange)'(nColumn, nRow, nColumn1, nRow1)
         'nColumn, nRow, nColumn1, nRow1 fangen bei 0! an zu zählen. (0 ,0 ,2 , 4)=(A1:C5)
    aSortFields(0).Field = nSortColumn ' "nSortCoulumn" ist die Spaltennummer, 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())

End Function

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)

B1 =Zelle, in der steht,nach welcher Spalte sortiert werden soll.(Spalte A =0, Spalte B =1)
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)

Wichtig: der Funktionsaufruf "=SORTBYCOLUMN(B1;"Tabelle2";"A15:C28";B2)" darf nicht auf der gleichen Tabelle wie die zu sortierende Tabelle stehen.
viel Erfolg Wünscht
Frieder

-------- Original-Nachricht --------

Danke,

komme jetzt erst dazu Deinen Code zu versuchen,
und ins 'größere Ganze' einzubauen!

LG, gooly

Nochmals Danke, Frieder!

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

> 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

Nochmals Danke, Frieder!

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

> 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?

Ja das war genau richtig so.
Gruß
Frieder

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

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?

Noch mal herzlichen Dank,
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

Hallo
hier der Code der Abgewandelten Sortierfunktion:

Function sortByColumn2 (ByVal nSortColumn AS Integer, _
                     ByVal sSortSheet As String, _
                     ByVal nStartColumn As Integer, _
                     ByVal nStartRow As Integer, _
                     ByVal nEndColumn As Integer, _
                     ByVal sSortRange 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

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

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

  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

Hallo noch einmal.
Tut mir Leid. in der 2. Version war immer noch ein Fehler
Bitte verzeiht mir, dass ich eure Liste mit fehlerhaftem Code überschwemmt habe.

'Diesmal habe ich es aber ausführlich getestet, und es funktioniert.

  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

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())
       sortByColumn2= "Sortier-Funktion2"

Else
     sortByColumn2= "Die Spalte ist auserhalb des 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

   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

Hallo Frieder,

nur ein Tip: wenn du längere Codeschnipsel zur Verfügung stellen willst,
kannst du diese auch im Wiki hinterlegen und hier nur den Link dazu
posten. Dann liegt die neueste Version "obenauf" und ist sofort
sichtbar, und wenn man ältere Versionen nachgucken will, kann man in der
Historie stöbern.
Das kann auch wegen unerwünschtem Zeilenumbruch von Vorteil sein.

Gruß Nino

Danke
Das werde ich in Zukunft so machen.
Gruß
Freider