Makro Schleife Zahlenreihe um 1 aufaddieren

Antwort erstellen


BBCode ist eingeschaltet
[img] ist ausgeschaltet
[url] ist eingeschaltet
Smileys sind ausgeschaltet

Die letzten Beiträge des Themas
   

Ansicht erweitern Die letzten Beiträge des Themas: Makro Schleife Zahlenreihe um 1 aufaddieren

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Stephan » Mi, 11.04.2012 12:16

Ich bin Euch echt sehr sehr dankbar für die Hilfe und die Geduld die ihr mir entgegengebracht habt.
Und wie leicht wäre es für Dich gewesen diese DAnkbarkeit nicht nur als Lippenbekenntnis abzulegen sondern ganz einfach der geäußerten Bitte nachuzukommen die Formeln zur Verfügung zu stellen, die zumindest mich durchaus interesiert hätten - aber stimmt, Du hast ja nun was Du brauchtest und damit haben die Mohren ihre Schuldigkeit getan.

Stephan

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Karolus » Mi, 11.04.2012 11:02

Hallo
Wenn mir der PC ma abschmiert und ich bei ner höheren Ziffernfolge wieder einsteigen möchte, muss ich das im Makro ändern ?
Ja, ändere die jeweilige 0 in den Zeilen...
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


...um, in den Wert der an der Stelle erreicht wurde - hoffentlich klappt das zwischenspeichern während des Makrolaufs !!
edit: !stop! du kannst nur die höchstliegende erreichte Zahl > 0 anpassen - in den Schleifen darunter werden ja wieder alle Zahlen gebraucht
edit 2: Immer noch Quatsch - Du kannst lediglich die For a ..schleife anpassen falls der Code jemals dort bei einem Wert > 0 ankommt :lol:



Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Karolus » Mi, 11.04.2012 09:05

Hallo
Fehlermeldung nach der Kalmmer in der die 38 steht.
Daraus schliesse ich das du Python-code in der Basic-Ide ausführen möchtest - das geht nicht. Nimm den Code von Stephan oder die Basic - Variante*** die ich gepostet habe.

***ändere die If...zeile zurück auf:

Code: Alles auswählen

If .getCellByPosition(54, 26).Value = 1
Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Karolus » Di, 10.04.2012 12:52

Hallo

@Stephan
Dein Basiccode läuft in modifizierter Form etwa 35 sec bis zur Bereichssumme 100.

Code: Alles auswählen

Sub Finde_Kombination()
    With ThisComponent.Sheets().GetByName("Tabelle1")
    For a = 0 To 37
    .getCellByPosition(1, 1).Value = a 'B2
      For b = 0 To 37
      .getCellByPosition(2, 1).Value = b 'C2
        For c = 0 To 37
        .getCellByPosition(3, 1).Value = c 'D2
          For d = 0 To 37
          .getCellByPosition(4, 1).Value = d 'E2
            For e = 0 To 37
            .getCellByPosition(5, 1).Value = e 'F2
              For f = 0 To 37            
                  .getCellByPosition(6, 1).Value = f 'G2
                  If .getCellByPosition(7,1 ).Value = 100 Then 'BC27
                    Msgbox "Passende Werte gefunden"
                    Exit Sub
                  End If                
              Next f
            Next e
          Next d
        Next c
      Next b
    Next a
    End With
End Sub
Der dazu analoge Code in Python benötigt gerademal 5sec weniger.

Code: Alles auswählen

import datetime

def main():
    doc = context.getDocument()
    sheets = doc.getSheets()
    sheet = sheets.getByIndex(0)
    cell = sheet.getCellByPosition
    print datetime.datetime.now()
    for a in range(38):
        cell(0,0).setValue( a )
        for b in range(38):
            cell(1,0).setValue( b )
            for c in range(38):
                cell(2,0).setValue( c )
                for d in range(38):
                    cell(3,0).setValue( d )
                    for e in range(38):
                        cell(4,0).setValue( e )
                        for f in range(38):
                            cell(5,0).setValue( f )
                            if cell(6,0).getValue() == 100:
                                print datetime.datetime.now()
                                return
Auch in der Form findet keine sichtbare Aktualisierung statt, die Bereichssumme wird aber offenbar registriert.

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Karolus » Di, 10.04.2012 11:34

Hallo
Falls die Summe per Tabellenformel ermittelt wird, was ist denn wenn Du nach dem .setDataArray() jeweils eine Pause einlegst (10...100 ms)?
Sobald ich versuche während der Iteration eine Ausgabe ins Tabellenblatt zu machen, blockiert der Prozess ( keinerlei sichtbare Aktualisierungen :-( ) auch nicht wenn ich eine Pause einbaue.

Ich versuch jetzt nochmal eine Iteration in Einzelschritten in Verbindung mit einem 'modifyListener'.

Karo

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Stephan » Di, 10.04.2012 11:09

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

Re: Makro Schleife Zahlenreihe um 1 aufaddieren

von Stephan » Di, 10.04.2012 10:46

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

von Stephan » Di, 10.04.2012 08:44

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

von Stephan » Di, 10.04.2012 08:43

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

von Karolus » Di, 10.04.2012 08:31

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

von Karolus » Di, 10.04.2012 00:08

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

von Stephan » Mo, 09.04.2012 23:02

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

von Karolus » Mo, 09.04.2012 22:33

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

von Stephan » Mo, 09.04.2012 15:12

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

von Stephan » Mo, 09.04.2012 11:35

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

Nach oben