Hoi Marc
Marc Santhoff wrote:
Am Mi, den 09.03.2005 schrieb [EMAIL PROTECTED] um 14:58:Nachdem ich durch einen Tippfehler etwas herumsuchen musste hatte ich genau diese Option aktiviert.
Hoi Jörg
Besten Dank für Deine Hilfe.
Jörg Schmidt wrote:
Mit dieser Hilfe bin ich nun tatsächlich etwas weiter gekommen. Ich stolpere aber von einem Problemdas ist vielleicht doch nicht das was Du suchst? Dann nimm doch:
=TEST(ZELLE("Sheet");SPALTE(C3);ZEILE(C3))
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...
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.
Dies hatte immer mit diesen Laufzeitfehlern, Div durch 0 oä zu tun.
- Dauernd Totalabstürze
Da dürfte nicht sein. Kannst Du irgendwie feststellen, welche Aktion den
Absturz provoziert?
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.
Ist es auch.
- 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?
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