O žádných vláknech jsem se nezmiňoval. Jde prostě o to, že v main_2 hodnotu buňky načtete před zahájením cyklu.
Aby bylo zřejmé, o čem jsem psal o optimalizaci, upravil jsem makro následovně:
const nVar = 10000
const nOpak = 40000 ' nastavíme, aby se muselo ukládat
sub main_pole
dim variace()
dim cislo as long
dim PosledniAdresa as long
' stopneme si dobu
nTimer0 = Timer()
oSheet = ThisComponent.sheets(0)
'Nastavíme promenné
B3 = oSheet.getCellbyPosition(1,2).value
C3 = oSheet.getCellbyPosition(2,2).value
D3 = oSheet.getCellbyPosition(3,2).value ' limita počtu výsledků;
E3 = oSheet.getCellbyPosition(4,2).value ' aktuální uložený počet výsledků
cislo = 0 ' číslo prvního řádku v poli
PosledniAdresa = E3 + 2 ' nastavíme podle počtu uložených hodnot
VelikostPole = D3 - E3
if VelikostPole > nVar then VelikostPole = nVar
variace = oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).getDataArray ' "A3:A10002"
For iCount = 1 To nOpak
IF VelikostPole <= cislo Then ' zapiseme (mezi)vysledek
oSheet.getCellbyPosition(1,2).value = B3
oSheet.getCellbyPosition(2,2).value = C3
oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).setDataArray(variace)
' D3 neukladame
' E3 neukladame - je tam vzorec
cislo = 0 ' číslo prvního řádku v poli resetujeme
PosledniAdresa = PosledniAdresa + VelikostPole ' nastavíme podle počtu uložených hodnot
E3 = E3 + VelikostPole ' Nastavime pocet ziskanych variaci
VelikostPole = D3 - E3 ' znovu nastavime velikost pole
if VelikostPole > nVar then VelikostPole = nVar
variace = oSheet.getCellRangeByPosition(0, PosledniAdresa, 0, PosledniAdresa+VelikostPole).getDataArray
IF D3 <= E3 Then
nTotal = Timer() - nTimer0
Print "Doba " + nTotal + " sec"
Print "Překopíruj a smaž výsledky"
Exit Sub
End If
end if
C3 = B3+C3
variace(cislo)(0)= C3
cislo = cislo + 1
Next iCount
end sub
Ve srovnání: Na mém počítači
makro "main_1" generuje 20 hodnot za 6 sec, "main_zapis_vzorec" generuje 500 hodnot zhruba 5 sec. Za stejnou dobu vygeneruje upravená varianta přes 30000 hodnot.
(makro neukládá výsledky, když cyklus skončí regulerně, lze snadno doplnit)
Editoval lp. (7. 10. 2011 23:45:28)