Seite 1 von 2

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: So, 08.04.2012 23:52
von F3K Total
Hallo Karl 36,
Karl36 hat geschrieben:Kann man nun ein Makro schreiben,das ...
Klar kann man, damit meinst Du sicherlich Dich, oder?
Hier mal ein Einstieg für Makro-Programmierung:Informationen zur StarBasic-Programmierung
Dieses Thema gehört auf jeden Fall in dieses Forum

Gruß R

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 07:49
von Karolus
Hallo

Dir ist hoffentlich klar das du da bis zu 37^6 ( rund 2,5 ) Milliarden Kombinationsmöglichkeiten hast.

Teilst du uns die Funktion mit, die zu einem Ergebnis > 0 führen soll ?

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 09:36
von Karolus
Hallo
Mir ist klar das das ganze ewig dauern wird aber man kann es ja auf mehreren PCs laufen lassen, die alle in verscheidenen Bereichen anfangen zu addieren und mit etwas Glück gibt es mehr als nur 1 Lösung und ist nicht gerade 37 37 37 37 37 37
Damit das einigermassen effizient abläuft muss man das ganze im Hintergrund machen, und die Zahlen erst dann in Calc ausgeben wenn die gewünschte Lösung erreicht ist - um daß zu tun ....
Also die Formel,die die Ausgangszahl berechnet ist kompliziert und erstreckt sich in verschiedene Zellen, sie tut ja eigentlich auch nichts zur Sache
....tut diese Funktion sehr wohl etwas zur Sache.
Zum anderen ist es für uns relativ reizlos dir vorzulesen, wie man 6 verschachtelte 'for Schleifen von 0 bis 37' aufsetzt die Werte in 6 Zellen einträgt und dann das daraus resultierende Ergebnis ausliest um in der Schleife abzubrechen in der der Wert positiv ist.
( Das steht alles in dem Link von F3K Total )

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 11:21
von Stephan
Also die Formel,die die Ausgangszahl berechnet ist kompliziert und erstreckt sich in verschiedene Zellen, sie tut ja eigentlich auch nichts zur Sache deshalb habe ich sie hier auch nicht gepostet.
Dann poste sie trotzdem, denn sie interessiert uns/mich.
Mir ist klar das das ganze ewig dauern wird
und wenn Dir das klar ist warum willst Du das Problem dann in StarBasic lösen? Eine noch langsamere Sprache zur Lösung solcher Probleme gibt es doch wohl kaum.
Wo genau steht das denn ?
Der Zugriff auf Zellen steht z.B. unter:
http://www.dannenhoefer.de/faqstarbasic ... l#Zweig167

Eine 'gewöhnliche' Schleife ist z.B. in der OOo-Programmhilfe unter der Überschrift "For...Next-Anweisung [Laufzeit]" beschrieben.
Zum anderen ist es für uns relativ reizlos dir vorzulesen, wie man [...]
Stimmt, weil die geschachtelten Schleifen so hübsch aussehen :) schreibe ich trotzdem eine mögliche Variante hin (die noch nicht optimal ist weil sie teils unnötige Schreibvorgänge beinhaltet):

Code: Alles auswählen

For a = 0 To 37
  For b = 0 To 37
    For c = 0 To 37
      For d = 0 To 37
        For e = 0 To 37
          For f = 0 To 37
            With ThisComponent.Sheets().GetByName("Tabelle1")
              .getCellByPosition(0, 0).Value = a
              .getCellByPosition(1, 0).Value = b
              .getCellByPosition(2, 0).Value = c
              .getCellByPosition(3, 0).Value = d
              .getCellByPosition(4, 0).Value = e
              .getCellByPosition(5, 0).Value = f
            End With
          Next f
        Next e
      Next d
    Next c
  Next b
Next a
Wenn ich hier (Intel Core2Duo E8500 3,16 GHz) teste wie lange es dauert bis in D1 als Wert 1 auftaucht (7 Sekunden) kann ich schlussfolgern das das gesamte Makro ca. 150 Tage brauchen wird (7*(37^4)Sekunden), hinzu kommt aber dann immer noch die Rechenzeit die eine Formel bräuchte um sich zu aktualisieren. Hierfür nochmal den Faktor 5 bis 10 zu veranschlagen scheint mir realistisch, was dann bedeutet das die Gesamtzeit bei bei ungefähr 750 bis 1500 Tagen läge. Moderne Hardware 'normaler' Desktoprechner mag vielleicht 3 bis 5 mal schneller sein als mein Rechner und so käme man dann auf 150 bis 500 Tage.

Das alles ist nur eine grobe Abschätzung und es gilt bezüglich der Geschwindigkeit ohnehin das niemand sowas direkt in einer Tabelle machen würde (Karolus wies bereits darauf hin) und gleichzeitig gilt das niemand sowas 'ohne Not' mit StarBasic machen würde.



Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 11:24
von Karolus
Hallo

Okay, zu 'for Schleife' müsste man mal hier die Forensuche bemühen search.php?st=0&sk=t&sd=d&sr=posts&keyw ... d%5B%5D=18

Mal so als Beispiel:

Code: Alles auswählen

sub sechs_variablen_von_null_bis_siebenunddreisig

for a = 0 to 37
    for b = 0 to 37
        usw.
            bis
                f
                    .
        if ( deine furchtbar komplizierte und geheime Berechnung ) > 0 then
            msgbox join( array(a, b, c, d, e, f), "; ")
            exit sub
        end if
                    next f
                next e
            next d
        next c
    next b
next a

end sub
Ich bin immer noch neugierig.

edit: damit ich nicht nur wiederhole was Stephan bereits geschrieben hat, hier nochmal ein Zahlenkombinationengenerator in Python:

Code: Alles auswählen

from itertools import product

kombi = product( range(38), repeat=6 )

def main():
    a, b, c, d, e, f = kombi.next()
    while ( deine berechnung mit a, b, usw ) <= 0:
        a, b, c, d, e, f = kombi.next()
    return a, b, c, d, e, f
Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 11:35
von Stephan
Ich bin immer noch neugierig.
geht mir genauso, weil doch die eigentlich interessante Frage ohnehin wäre wie löse ich das Gesamtproblem am Geschicktesten mit OOo und nicht wie löse ich das Gesamtproblem mit OOo wenn mir bereits vorgegeben ist das ich eine bestimmte Formel verwenden soll und mein Makro in bestimmter Art und WEise vorgehen soll.


Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 15:12
von Stephan
Auch wenn es durch die Zaheln und Wennfunktionen relativ nichtssagend ist


die Formeln sind gerade sehr aussagekräftig, weil sie für den der sie lesen kann sie eindeutig sind
hoffe ich einen Tropfen Antwort auf den heißen Stein der neugier gegeben zu haben.
ja, aber wegen der Unvollständigkeit (wir hätten dann schon alle 50 Formeln, sinnvollerweise natürlich in einer Tabellendatei gebraucht) hilft das nicht so sehr viel weiter.

Du scheinst hier irgendwie auch dem Mißverständnis zu erliegen das Du uns mit der Verfügungstellung von Formeln irgeneinen Vorteil für uns verschaffst (auch Neugier zu stillen könnte als solcher Vorteil gelten), in Wahrheit geht es jedoch mehr darum das wir Dir besser helfen wollen, nur dazu müßten wir das konkrete Problem hinreichend im Detail verstehen.

Momentan kann man mit Gewißheit nur sagen das der von Dir gewünschte Lösungsweg ein äußerst Ungünstiger ist weil StarBasic eine extrem lahme Sprache ist und deshalb wäre es viel besser eine andere Programmiersprache zu verwenden ... allerdings, und so ist meine Hoffnung, ist vielleicht eben doch eine günstigere Lösung in OOo möglich wenn der LösungsWEG anders gewählt werden könnte, nur dazu müßte man das Problem inhaltlich ausreichend verstehen.

Der derzeitige Kern des Problems ist doch der das Du augenscheinlich eine Lösung bevorzugst die für Dich übersichtlich (i.S. 'Verständlich', 'gut handhabbar') sein mag, dabei aber auf einen Weg geräts der zwangsläufig extrem viel Rechenzeit verschlingt. Worauf es also ankäme wäre eine bessere Implementierung für das Gesamtproblem zu finden. (vielleicht geht das nicht vielleicht aber doch und deshalb sollte man es versuchen)



Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 22:33
von Karolus
Hallo
Ich kann aber auch das Dokument hochladen,falls das irgendwie geht.
Ja, falls du dich hier registrierst, und angemeldet bist kannst auch Datein anhängen.


Übriigens: Der pure Zahlengenerator nach dem Pythonbeispiel von oben läuft hier in ca 12 min durch ( ohne irgendwelche Rechnerei mit den Zahlen bzw. einer Ausgabe zwischendrin ) ich schätze die Ausgabe jeder Kombination in eine Tabelle und das Warten auf das Ergebnis nimmt mindestens mehrere Stunden wenn nicht Tage in Anspruch.

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Mo, 09.04.2012 23:02
von Stephan
Der pure Zahlengenerator nach dem Pythonbeispiel von oben läuft hier in ca 12 min durch


Danke für diese Info, ich war vorhin zu bequem das zu fragen obwohl es mich interessiert.

Da ich kein Python kann frage ich mal:
Ich sehe es richtig das Dein Code inhaltlich nur durch die Werte interiert, also letztlich nur das hier tut:

Code: Alles auswählen

For a = 0 To 37
  For b = 0 To 37
    For c = 0 To 37
      For d = 0 To 37
        For e = 0 To 37
          For f = 0 To 37
          Next f
        Next e
      Next d
    Next c
  Next b
Next a
Als Basic läuft das hier ca. 34,5 Minuten, braucht also ca. dreimal solange (wobei ich ja DEine Hardware nicht kenne).

ich schätze die Ausgabe jeder Kombination in eine Tabelle und das Warten auf das Ergebnis nimmt mindestens mehrere Stunden wenn nicht Tage in Anspruch
Ich habe das mit meinem Basic-Makro mal angetestet, der Unterschied zwischen nur durch die Schleifen interieren und Interieren plus Werte in Tabelle schreiben ist ungefähr Faktor 1650, also wirklich sehr hoch.


Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 00:08
von Karolus
Hallo
@Stephan:
Unsere Hardware ist etwa gleich, ( hier 2x2Ghz ) wobei der Pythoninterpreter ohne zusätzliche Tricks nur auf einer CPU arbeitet.
Ich sehe es richtig das Dein Code inhaltlich nur durch die Werte interiert, also letztlich nur das hier tut:...
Jein, die 6 Werte werden in ein Tuple gesteckt, was in etwa einem Array in Basic entspricht.

Der Versuch das fortlaufend als ...cellrange.setDataArray( ...) nach Calc zu übertragen und gleichzeitig die Summe des Zellbereichs als Kontrolle zu überwachen misslingt weil Calc "einfriert" während der Pythonprozess läuft.

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 08:31
von Karolus
Hallo
Sei's drum. Ich wär echt wunschlos glücklich wenn ich ein Makro hätte wie ihr es beschreibt, auch wenn es so lange dauert
Das Makro hast du bereits siehe Stephan Post du musst dem hübschen for-"Schächtelchen" nur noch Sub irgendwas voranstellen und unten ein end Sub folgen lassen.... und mal anfangen zu testen - Viel Vergnügen!

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 08:43
von Stephan
Jein, die 6 Werte werden in ein Tuple gesteckt, was in etwa einem Array in Basic entspricht.
OK, verstehe.

in StarBasic (wieder auf gleicher Hardware) braucht:

Code: Alles auswählen

For a = 0 To 37
  For b = 0 To 37
    For c = 0 To 37
      For d = 0 To 37
        For e = 0 To 37
          For f = 0 To 37
            z() = Array(a,b,c,d,e,f)
          Next f
        Next e
      Next d
    Next c
  Next b
Next a
ca. 11 Stunden.

und:

Code: Alles auswählen

Dim z(5)
For a = 0 To 37
  For b = 0 To 37
    For c = 0 To 37
      For d = 0 To 37
        For e = 0 To 37
          For f = 0 To 37
            z(0) = a
            z(1) = b
            z(2) = c
            z(3) = d
            z(4) = e
            z(5) = f
          Next f
        Next e
      Next d
    Next c
  Next b
Next a
ca. 18 Stunden.

Somit braucht StarBasic hier 55-90 mal so lange.
Der Versuch das fortlaufend als ...cellrange.setDataArray( ...) nach Calc zu übertragen und gleichzeitig die Summe des Zellbereichs als Kontrolle zu überwachen misslingt weil Calc "einfriert" während der Pythonprozess läuft.
mmh ...

Falls die Summe per Tabellenformel ermittelt wird, was ist denn wenn Du nach dem .setDataArray() jeweils eine Pause einlegst (10...100 ms)?

(Ja, mir ist schon klar das eine solche Pause, in Summe der vielen Pausen, eine Ewigkeit ist, aber nur mal aus Interesse, weil ich annehme das Problem könnte vielleicht nur daran liegen das Python so schnell ist das, falls eine Tabellenformel genutzt wird, diese nicht 'nachkommt'.)



Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 08:44
von Stephan
Sei's drum.
Und woran scheitert es nun uns die kompletten Formeln zugänglich zu machen, nachdem Du ja inzwischen verstanden hattest worum es mir ging? Ich behaupte ja nicht das dadurch zwingend eine bessere LÖsung gefunden werden kann, nur einen Versuch ist es eben schon wert.
Ich wär echt wunschlos glücklich wenn ich ein Makro hätte wie ihr es beschreibt
Dann brauchten wir zunächst noch zumindestens [1] die Info in welcher Zelle der Wert steht der darauf geprüft werden soll ob er größer 0 ist:
und erst damit aufhört wenn die ausgegebene Zahl der Formel positiv ist
Karolus hatte dies nötige Prüfung ja pauschal schon formuliert mit:

Code: Alles auswählen

if ( deine furchtbar komplizierte und geheime Berechnung ) > 0 then

[1]
zusätzlich der Einfachheit halber noch den Namen der Tabelle und der zu verwendenden 6 Zellen für die die Zahlen 0-37 enthalten sollen.


Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 10:46
von Stephan
Also die Zaheln stehen in B2,C2,D2,E2,F2 und G2

die Prüfzahl, die dann die Schleife beendet steht in BC 27.
Ja also was denn nun?

Habe ich nicht eindeutig gefragt oder was ist sonst das Problem? Es sollte doch zu verstehen sein das es hier um eine Bedingung geht die zu prüfen ist, also wenn ... <IRGENDWAS> dann <richtige Kombination gefunden>, eben das was Karo schon hinschrieb:

Code: Alles auswählen

if ( deine furchtbar komplizierte und geheime Berechnung ) > 0 then
Ich jedenfalls habe schlichtweg keine Lust mehr hier um NOTWENDIGE Informationen zu betteln oder meine Zeit damit zu vertun zu raten was ich denn nun mit Zahlen in benannten Zellen zu tun hätte oder was in dem Zusammenhang eine Prüfzahl ist oder sonstwas. Sorry.



Gruß
Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

Verfasst: Di, 10.04.2012 11:09
von Stephan
dann ist ein passendes Makro z.B.:

Code: Alles auswählen

Sub Finde_Kombination() 
For a = 0 To 37
  For b = 0 To 37
    For c = 0 To 37
      For d = 0 To 37
        For e = 0 To 37
          For f = 0 To 37
            With ThisComponent.Sheets().GetByName("DeinTabellenName")
              .getCellByPosition(1, 1).Value = a 'B2
              .getCellByPosition(2, 1).Value = b 'C2
              .getCellByPosition(3, 1).Value = c 'D2
              .getCellByPosition(4, 1).Value = d 'E2
              .getCellByPosition(5, 1).Value = e 'F2
              .getCellByPosition(6, 1).Value = f 'G2
              If .getCellByPosition(54, 26).Value = 1 Then 'BC27
                Msgbox "Passende Werte gefunden"
                Exit Sub
              End If
            End With
          Next f
        Next e
      Next d
    Next c
  Next b
Next a
End Sub


Gruß
Stephan