Hoi Marc

Marc Santhoff wrote:

Am Mi, den 09.03.2005 schrieb [EMAIL PROTECTED] um 14:58:


Hoi Jörg

Besten Dank für Deine Hilfe.

Jörg Schmidt wrote:



das ist vielleicht doch nicht das was Du suchst? Dann nimm doch:

=TEST(ZELLE("Sheet");SPALTE(C3);ZEILE(C3))



Mit dieser Hilfe bin ich nun tatsächlich etwas weiter gekommen. Ich stolpere aber von einem Problem
zum Nächsten.
Die OO-Basic-Umgebung ist sehr mühsam zum arbeiten.
- Unverständliche Fehlermeldungen (z.B. Variable nicht definiert .... sagt aber nicht welche! So ein blödsinn)



Stimmt, aber Du kannst "otion explicit" als erste Zeile im Modul
benutzen, dannmit werden Tippfähler schonmal ausgeschlossen...


Nachdem ich durch einen Tippfehler etwas herumsuchen musste hatte ich genau diese Option aktiviert.
Aber dann ging es erst richtig los: Da die Fehler nicht beim Compilieren über die Symbolleiste gefunden werden - verstehe sowieso nicht was dieser Knopf soll, der bewirkt doch überhaupt nichts - kommen dann haufenweise Meldungen von Laufzeitfehlern (die ich übrigends inzwischen gefunden habe - eine Pause bewirkt manchmal Wunder) wenn ich Ctrl-Shift-F9 anwende.




- Dauernd Totalabstürze



Da dürfte nicht sein. Kannst Du irgendwie feststellen, welche Aktion den
Absturz provoziert?


Dies hatte immer mit diesen Laufzeitfehlern, Div durch 0 oä zu tun.
Wenn das Dokument nach einem Absturz wieder geöffnet wird, wird es wieder hergestellt, die Basicfunktionen werden aber
aus dem Sheet nicht mehr gefunden (sind aber in der Basic-IDE). Erst wenn das Dokument geschlossen und erneut geöffnet wird gehen diese wieder.




- Obwohl man in Basic etwas ändert wird dies vom Sheet nicht übernommen. Man hat das Gefühl, dass irgendwo noch auf eine alte Version zugegriffen wird. Plötzlich wird die eigene Basic-Routine auch nicht mehr erkannt. Obwohl man einen Breakpoint setzt wird dieser oft gar nicht erreicht weil irgendwo auf eine andere gespeicherte Version zugegriffen wird. Mit "alles schliessen und neu öffnen" kann man dieses Problem manchmal lösen. Test's werden dadurch aber äusserst mühsam. Man kriegt Calc nur mit Ctrl-Shift-F9 dazu alles neu zu berechnen, was aber dann häufig zu Abstürzen führt weil irgendwo eine Referenz oder sonst was nicht stimmt. Aber eben, die Fehlermeldungen sind dazu schlicht unbrauchbar.



Hört sich ja schrecklich an. Wenn der Fehler im BASIC passiert solltest
Du die IDE geöffnet und die betreffende Zeile angezeigt bekommen. Welche
Version von OOo und welches Betriebssystem benutzt Du denn?


Ist es auch.
Ich habe OO 1.1.1 unter Suse 9.1
Wäre schön, wenn die fehlbare Zeile angezeigt würde. (Basic-IDE habe ich logischerweise offen).
Meist wird aber gar nichts von Baisc angezeigt. Manchmal überlagert sich ein Teil des Basic-Codes mit dem Sheet.
Nur einmal konnte ich erkennen welche Zeile markiert war.
Frage nebenbei. Bilder (Screenshots) sollte man wohl hier nicht mitschicken?




Das grosse Manko, dass Zellen nur als CallByValue übergeben werden kann leider nur mit grossem Aufwand und gebastel umgangen werden.



Ohne den Quelltext zu sehen, wird man Dir schwer helfen können.


Quelltext aus dem Original Excel-VBA ?

Durch Deinen Anstoss nahm ich noch einmal einen Anlauf und konnte nun eine profisorische Lösung finden (Zwar noch nicht in allen Details getestet).

Hier meine Lösung mit OO:

Beispiel-Aufruf aus einer Zelle:

   
=NOTENSCHNITTGEWICHTETOO(ZELLE("Sheet");ZEILE(A15);8;SPALTE($F15);SPALTE($I15);SPALTE($L15);SPALTE($O15);SPALTE($R15);SPALTE($W15);SPALTE($Z15);SPALTE($AC15);SPALTE($AF15);SPALTE($AI15))

   Die Argumente bedeuten:
   1: Referenz auf das Sheet mit der Zelle
   2: Zeilennummer mit Datenzellen
   3: Zeilennummer mit der Gewichtung
   ab 4: Spaltennummern der Datenzellen (bis 20 optionale Datenzellen
   möglich)

Die Basicfunktionen:

   Function NotenSchnittGewichtetOO( Tabelle As Variant,  Zeile as
   Integer, Gewichtzeile As Integer, _
                                          optional Arg0,optional
   Arg1,optional Arg2,optional Arg3,optional Arg4, _
                                          optional Arg5,optional
   Arg6,optional Arg7,optional Arg8,optional Arg9, _
                                          optional Arg10,optional
   Arg11,optional Arg12,optional Arg13,optional Arg14, _
                                          optional Arg15,optional
   Arg16,optional Arg17,optional Arg18,optional Arg19 ) As Double
    Dim Doc As Object
    Dim Sheet As Object
    Dim Cell As Object
    Dim Idx as Integer
    Dim Zaehlersumme As Double
    Dim Nennersumme As Double
    Dim Spalte As Integer
    Dim Gewicht As Double
    Dim NotenSpalten() As Variant

' Array mit gültigen Argumenten füllen NotenSpalten = getParamArray( Arg0, Arg1, Arg2, Arg3, Arg4, Arg5,
Arg6, Arg7, Arg8, Arg9, _
Arg10, Arg11, Arg12, Arg13, Arg14,
Arg15, Arg16, Arg17, Arg18, Arg19 )
Doc = StarDesktop.CurrentComponent
Sheet = Doc.Sheets(Tabelle-1)


Zaehlersumme = 0
Nennersumme = 0
For Idx = 0 To UBound(NotenSpalten())
Gewicht = Sheet.getCellByPosition(NotenSpalten(Idx)-1,
Gewichtzeile-1).Value
Cell = Sheet.getCellByPosition(NotenSpalten(Idx)-1, Zeile-1)
if Cell.Value > 0 then
Zaehlersumme = Zaehlersumme + Cell.Value * Gewicht
Nennersumme = Nennersumme + Gewicht
endif Next if Nennersumme = 0 then
NotenSchnittGewichtetOO = 0
else NotenSchnittGewichtetOO = Zaehlersumme / Nennersumme
endif End Function


   Function getParamArray( optional Arg0,optional Arg1,optional
   Arg2,optional Arg3,optional Arg4, _
                           optional Arg5,optional Arg6,optional
   Arg7,optional Arg8,optional Arg9, _
                           optional Arg10,optional Arg11,optional
   Arg12,optional Arg13,optional Arg14, _
                           optional Arg15,optional Arg16,optional
   Arg17,optional Arg18,optional Arg19)
   CONST ARGUMENTS = 20
   DIM Arg(ARGUMENTS) as Variant
   DIM ArgArray() as Variant
   DIM Count as Integer

Count = 0
If NOT isMissing( Arg0 ) Then
Arg(0) = Arg0
Count = Count + 1
If NOT isMissing( Arg1 ) Then
Arg(1) = Arg1
Count = Count + 1
If NOT isMissing( Arg2 ) Then
Arg(2) = Arg2
Count = Count + 1
If NOT isMissing( Arg3 ) Then
Arg(3) = Arg3
Count = Count + 1
If NOT isMissing( Arg4 ) Then
Arg(4) = Arg4
Count = Count + 1
If NOT isMissing( Arg5 ) Then
Arg(5) = Arg5
Count = Count + 1
If NOT isMissing( Arg6 ) Then
Arg(6) = Arg6
Count = Count + 1
If NOT isMissing( Arg7 ) Then
Arg(7) = Arg7
Count = Count + 1
If NOT isMissing( Arg8 ) Then
Arg(8) = Arg8
Count = Count + 1
If NOT isMissing( Arg9 ) Then
Arg(9) = Arg9
Count = Count + 1
If NOT isMissing( Arg10 ) Then
Arg(10) = Arg10
Count = Count + 1
If NOT isMissing( Arg11 ) Then
Arg(11) = Arg11
Count = Count + 1
If NOT isMissing( Arg12 ) Then
Arg(12) = Arg12
Count = Count + 1
If NOT isMissing( Arg13 ) Then
Arg(13) = Arg13
Count = Count + 1
If NOT isMissing( Arg14 ) Then
Arg(14) = Arg14
Count = Count + 1
If NOT isMissing( Arg15 ) Then
Arg(15) = Arg15
Count = Count + 1
If NOT isMissing( Arg16 ) Then
Arg(16) = Arg16
Count = Count + 1
If NOT isMissing( Arg17 ) Then
Arg(17) = Arg17
Count = Count + 1
If NOT isMissing( Arg18 ) Then
Arg(18) = Arg18
Count = Count + 1
If NOT isMissing( Arg19 ) Then
Arg(19) = Arg19
Count = Count + 1
End If End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If
End If


   ' Array umkopieren; dabei nur die gefüllten Plätze kopieren.
   ' Da ReDim das Array löscht (nicht wie bei VBA) muss ein neues
   erstellt werden.
   ReDim ArgArray( Count-1 )

   For Count = 0 To ubound( ArgArray() )
     ArgArray(Count) = Arg(Count)
   Next

   getParamArray = ArgArray()
   End Function
   '==================================================================

Im Vergleich die original VBA Routine mit Aufruf:

   
=NotenSchnittGewichtet(8;F15;I15;L15;O15;R15;U15;Z15;AC15;AF15;AI15;AL15;AO15;AT15;AW15;AZ15;BF15;BC15)

   Public Function NotenSchnittGewichtet(gewichtzeile As Integer,
   ParamArray note() As Variant) As Double

   Dim zaehlersumme As Double
   Dim nennersumme As Double
   Dim zeile As Integer
   Dim spalte As Integer
   Dim gewicht As Double
   Dim position As Integer

     zaehlersumme = 0
     nennersumme = 0
     For position = 0 To UBound(note())
       spalte = note(position).Column
       gewicht = Cells(gewichtzeile, spalte)
       If IsNumeric(note(position)) Then 'Not IsEmpty(note(position)) Then
         zaehlersumme = zaehlersumme + note(position).Value * gewicht
         nennersumme = nennersumme + gewicht
       End If
     Next
     NotenSchnittGewichtet = zaehlersumme / nennersumme
   End Function

Gruß,
Marc


Gruss
Hansueli

Antwort per Email an