Seite 1 von 2
Re: getDataArray -> not assignable by given value?
Verfasst: Do, 27.12.2012 22:34
von Karolus
Hallo
An das DataArray eines
Namensbereichs kommt man über:
Code: Alles auswählen
Namerange = oDoc.NamedRanges.getByName("Mengen").getReferredCells().getDataArray()
das DataArray besteht
immer aus einem äusserem (Zeilen)array mit inneren (Spalten)array's
Karolus
Re: getDataArray -> not assignable by given value?
Verfasst: Fr, 28.12.2012 10:15
von F3K Total
Moin,
dieser Code funzt:
Code: Alles auswählen
Sub S_get_variables
Variables = F_get_solver_variables_from_named_Range("Mengen")
xray Variables
end sub
Function F_get_solver_variables_from_named_Range(S_named_Range)as Object
dim Variables(0) as new com.sun.star.table.CellAddress
oDoc = ThisComponent
oNamedRanges = thiscomponent.NamedRanges
oRangeMengen = oNamedRanges.getbyname(S_named_Range)
oCellRangeMengen = oRangeMengen.ReferredCells
oCellRangeMengenRangeAddress = oCellRangeMengen.RangeAddress
nsheet = oCellRangeMengenRangeAddress.Sheet
oSheet = oDoc.Sheets(nsheet)'Tabelle auf der der Bereich benamst wurde
nSC = oCellRangeMengenRangeAddress.StartColumn
nSR = oCellRangeMengenRangeAddress.StartRow
nEC = oCellRangeMengenRangeAddress.EndColumn
nER = oCellRangeMengenRangeAddress.EndRow
counter = 0
for i = nSC to nEC
for k = nSR to nER
ocell = oSheet.getcellbyposition(i,k)
Redim preserve Variables(counter)
Variables(counter) = ocell.celladdress
counter = counter + 1
next k
next i
F_get_solver_variables_from_named_Range = Variables
End Function
Sollte sich der Namensbereich ausschließlich in einer Spalte befinden, läßt sich der Code deutlich vereinfachen.
Viel Spaß
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: Fr, 28.12.2012 12:51
von F3K Total
Hi,
hast Du auf dem Blatt einen Namen "Mengen" vergeben?
Ich denke mal, das wäre dann zu kompliziert, oder?
Überhaupt nicht, darum habe ich die Funktion
F_get_solver_variables_from_named_Range geschrieben, die natürlich in deinem Modul stehen muß.
Wann immer du die Zelladressen eines Namensbereiches benötigst, fügst du in deinen Code nur diese Zeile ein:
Code: Alles auswählen
Variables = F_get_solver_variables_from_named_Range("Mengen")
oder
Code: Alles auswählen
Variables = F_get_solver_variables_from_named_Range("Mengen2")
oder
Code: Alles auswählen
Variables = F_get_solver_variables_from_named_Range("Mengenxyz")
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: Fr, 28.12.2012 15:20
von F3K Total
miamit hat geschrieben:und der Geltungsbereich ist Dokument/global
Bei mir finde ich keine Einstellung Geltungsbereich! Welche Version von OOo hast Du?
miamit hat geschrieben:über dem Beginn meines Subs einfügen?
Egal, drüber oder drunter.
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: Fr, 28.12.2012 18:52
von F3K Total
Hallihallo,
miamit hat geschrieben:Wirft Fehler in Zeile 3 raus (xray Variables ) : Sub- oder Function-Prozedur nicht definiert.
heißt nichts weiter, als das Du kein XRay installiert hast, das ist ein Inspection Tool, mit dem ich überprüft habe ob das Ergebnis in
Variables() stimmt.
Lösche einfach diesen Part:
Code: Alles auswählen
Sub S_get_variables
Variables = F_get_solver_variables_from_named_Range("Mengen")
xray Variables
end sub
Wenn ich Dein Makro richtig verstehe, übergibst Du die Zelladressen in dieser Zeile an den Solver:
Ersetze in Deinem Code diese Zeile durch:
Code: Alles auswählen
solv.Variables = F_get_solver_variables_from_named_Range("Mengen")
und es sollte klappen.
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: Fr, 28.12.2012 20:08
von F3K Total
Du sollst nicht die function, sondern Dein Macro starten ... denn wenn du die function startest, fehlt "Mengen", was du in der eben oben geänderten Zeile übergibst.
Dazu gehst Du in dein Tabellenblatt, Extras/Makros/Makro ausführen ...->zum Makro OptimizeDEPS navigieren->Ausführen
Muss ich eigentlich diese hier löschen
AUF KEINEN FALL!!!
Re: getDataArray -> not assignable by given value?
Verfasst: Sa, 29.12.2012 11:21
von F3K Total
Puuuuh! Schwere Geburt.
Tipp: lerne XRAY oder MRI
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: So, 30.12.2012 15:20
von F3K Total
Hi,
lösche im Hauptprogramm zunächst mal:
Code: Alles auswählen
Dim Constraint_1 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_2 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_3 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_4 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_5 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_6 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_7 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_8 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_9 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_10 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_11 as New com.sun.star.sheet.SolverConstraint
Dim Constraint_12 as New com.sun.star.sheet.SolverConstraint
Dim Constraints(12) as Object
Also die Definition der nullten Bedingung stehen lassen, und setze unten:
Code: Alles auswählen
'Nun die Nebenbedingungen
Constraints() = F_get_solver_constraints_from_named_Range("Mengen")
'nachträglich die Sonderlösung für die nullte Bedingung
Constraints(0).Left = Sheet.getCellByPosition(1,64).CellAddress
Constraints(0).Operator = kleinergleich
Constraints(0).Right = Sheet.getCellByPosition(2,64).CellAddress
solv.Constraints = Constraints()
die function sollte dann so aussehen, achte auch auf die Kommentare:
Code: Alles auswählen
Function F_get_solver_constraints_from_named_Range(S_named_Range)as Object
dim Constraints(12) as New com.sun.star.sheet.SolverConstraint 'gleich als SolverConstraint Array definieren
oDoc = ThisComponent
oNamedRanges = thiscomponent.NamedRanges
oRangeMengen = oNamedRanges.getbyname(S_named_Range)
oCellRangeMengen = oRangeMengen.ReferredCells
oCellRangeMengenRangeAddress = oCellRangeMengen.RangeAddress
nsheet = oCellRangeMengenRangeAddress.Sheet
oSheet = oDoc.Sheets(nsheet)'Tabelle auf der der Bereich benamst wurde
nSC = oCellRangeMengenRangeAddress.StartColumn
nSR = oCellRangeMengenRangeAddress.StartRow
nEC = oCellRangeMengenRangeAddress.EndColumn
nER = oCellRangeMengenRangeAddress.EndRow
counter = 1 'Zaehlung beginnt wie gesagt erst bei 1, da 0 bereits fix definiert wurde[/b]
for i = nSC to nEC
for k = nSR+1 to nER 'beginnt auch hier eine Zeile tiefer?
ocell = oSheet.getcellbyposition(i,k)
ocell2 = oSheet.getcellbyposition(i-1,k)'Zelle links neben oCell, geht das so?[/b]
'dim Constraint_counter as New com.sun.star.sheet.SolverConstraint 'Schnickschnack -> geht nicht durch Anhängen von _counter
'Redim preserve Constraints(counter) 'nicht nötig, da du mit dim Constraints(12) die Grösse schon auf 12 festgelegt hast
Constraints(counter).Left = ocell.celladdress
Constraints(counter).Operator = kleinergleich
Constraints(counter).Right = ocell2.celladdress
'Constraints(counter) = Constraint_counter 'Schnickschnack, in den drei Zeilen oberhalb zugewiesen
counter = counter + 1
next k
next i
F_get_solver_constraints_from_named_Range = Constraints
End Function
Gruß R
Re: getDataArray -> not assignable by given value?
Verfasst: So, 30.12.2012 16:43
von balu
Hallo Leute,
ich kann nicht helfen, möchte euch aber auf eine winzige kleinigkeit hinweisen.
Ersetzt doch mal bitte schön das hier
Code: Alles auswählen
oDoc = ThisComponent
oNamedRanges = thiscomponent.NamedRanges
durch das hier.
Das wars schon.
Gruß
balu
Re: getDataArray -> not assignable by given value?
Verfasst: So, 30.12.2012 16:46
von F3K Total
Hallo,
deine Fragen sind im luftleeren Raum kaum zu beantworten.
Ohne Beispieldokument, an dem man den Code laufen lassen kann, wird das nix.
Miamit vom iPad hat geschrieben:Meinst du das geht so? Schließlich hieß es im original ...
Das ist doch gerade der Vorteil! Du hast ein Feld (Array) von 0-12 Constraints, definiert als
com.sun.star.sheet.SolverConstraint.
D.h. jedes dieser 13 Constraints hat wiederum drei Werte:
Miamit vom iPad hat geschrieben: Daher wäre redim preserve doch nötig?
Genau. Deswegen hatte ich es in der ersten function so gemacht.
Wenn Du genau hin schaust, wirst Du sehen, dass das Feld Variables() anfangs bei der Dimensionierung nur ein Feld umfasst, das nullte.
Gibt es eine weitere Zelle, wird das Array, bei Beibehaltung der bisher geschriebenen Inhalte, um eins erweitert (redim preserve).
Gruß R
EDIT: Du solltest den Titel des Threads mal anpassen, z.B. "Automatisches Befüllen des Calc-Solvers", mit dem augenblicklichen Titel kann die Nachwelt kaum etwas anfangen.
Re: CalcSolver automatisch mit Variablen und Bedingungen fül
Verfasst: So, 30.12.2012 18:14
von F3K Total
Hallo Miamit,
langsam läuft's rund
Da hast Du Dir mit absoluter Treffsicherheit gleich die allereinfachste Aufgabe gestellt

Viel Erfolg weiterhin.
Gruß R
Re: CalcSolver automatisch mit Variablen und Bedingungen fül
Verfasst: So, 30.12.2012 19:16
von F3K Total
Hallo miamit,
neue Frage, neuer Thread.
Die Fragen zum Solver sind sicherlich im Calc-Forum besser aufgehoben, ich kann da auch nur googeln.
Die Frage zu Mengen/Mengen2:
Die function ermittelt das Tabellenblatt auf dem Du einen Namen vergeben hast selbst:
Code: Alles auswählen
nsheet = oCellRangeMengenRangeAddress.Sheet
oSheet = oDoc.Sheets(nsheet)'Tabelle auf der der Bereich benamst wurde
Wenn Du
irgendwo aufrufst, kommen die Daten aus "Mengen2" zurück
Gruß R
Re: CalcSolver automatisch mit Variablen und Bedingungen fül
Verfasst: So, 30.12.2012 19:41
von F3K Total
Hi,
wenn Du die functions in deiner Sub 2x aufrufen willst und der Counter "durchlaufen" soll, dann vielleicht prinzipiell so:
Code: Alles auswählen
Dim Counter as integer' Über der Sub dimensioniert -> im ganzen Modul verfügbar
Sub AutomatischerSolver
.
.
.
Counter = 0' Nullsetzen des Counter aus der function herausgenommen
Variables() = F_get_solver_variables_from_named_Range("Mengen")
Variables() = F_get_solver_variables_from_named_Range("Mengen2")
solv.Variables = Variables()
.
.
Counter = 0' Nullsetzen des Couter aus der function herausgenommen
Constraints() = F_get_solver_constraints_from_named_Range("Mengen")
Constraints() = F_get_solver_constraints_from_named_Range("Mengen2")
solv.Constraints = Constraints()
.
.
End Sub
Gruß R
Re: CalcSolver automatisch mit Variablen und Bedingungen fül
Verfasst: So, 30.12.2012 19:57
von F3K Total
miamit hat geschrieben:Ggf. sollte ich für den Counter in der Constraint-Funktion eine andere Bezeichnung wählen, sonst kommt das womöglich zu Missverständnissen.
... gute Idee
Re: CalcSolver automatisch mit Variablen und Bedingungen fül
Verfasst: So, 30.12.2012 20:43
von DPunch
Servus
Kurze Anmerkung:
das gewünschte Verhalten von Counter ist quasi der Prototyp der Verwendung einer statischen Variablen.
Per Deklaration als
innerhalb von "F_get_solver_variables_from_named_Range" hält man den Namensraum innerhalb des Moduls sauber.
Bis alle Makros durchgelaufen sind, wird die Variable ihren Wert behalten (zu beachten allerdings: wird mit 0 initialisiert).