-

Programmierung unter AOO/LO (StarBasic, Python, Java, ...)

Moderator: Moderatoren

Karolus
********
Beiträge: 7551
Registriert: Mo, 02.01.2006 19:48

Re: getDataArray -> not assignable by given value?

Beitrag 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
LO25.2… debian 13( trixie ) auf Raspberry5 8GB (ARM64)
LO25.8… flatpak debian 13( trixie ) auf Raspberry5 8GB (ARM64)
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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:

Code: Alles auswählen

solv.Variables = Variables()
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
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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!!!
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag von F3K Total »

Puuuuh! Schwere Geburt.
Tipp: lerne XRAY oder MRI
Gruß R
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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
Benutzeravatar
balu
********
Beiträge: 3813
Registriert: Fr, 24.08.2007 00:28
Wohnort: Warstein

Re: getDataArray -> not assignable by given value?

Beitrag 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.

Code: Alles auswählen

    oDoc = ThisComponent
    oNamedRanges = oDoc.NamedRanges
Das wars schon.



Gruß
balu
Sei öfter mal ein Faultier, sag öfter mal "Ach was!" Dann kriegst du keinen Herzinfarkt, und hast ne menge Spass.

wehr rächtschraipfähler findet khan si behalden :D
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: getDataArray -> not assignable by given value?

Beitrag 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:

Code: Alles auswählen

.Left
.Operator
.Right
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.
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag 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
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag 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

Code: Alles auswählen

F_get_solver_variables_from_named_Range("Mengen2")
irgendwo aufrufst, kommen die Daten aus "Mengen2" zurück
Gruß R
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag 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
Zuletzt geändert von F3K Total am So, 30.12.2012 19:55, insgesamt 1-mal geändert.
F3K Total
********
Beiträge: 3728
Registriert: Mo, 28.02.2011 17:49

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag 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
DPunch
*******
Beiträge: 1112
Registriert: Mo, 02.11.2009 16:16
Wohnort: Marburg

Re: CalcSolver automatisch mit Variablen und Bedingungen fül

Beitrag von DPunch »

Servus

Kurze Anmerkung:
das gewünschte Verhalten von Counter ist quasi der Prototyp der Verwendung einer statischen Variablen.
Per Deklaration als

Code: Alles auswählen

Static Counter as Integer
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).
Antworten