Příspěvky uživatele


< návrat zpět

V příloze zasílám kód k nahlédnutí. Zvážím ještě nahrazení některých proměnných typu double za single a celkové omezení množství výpočtů (pro zobrazení v grafu jsou výsledky asi zbytečně přesné).

Tak vyřešeno, doplněk sice aktivní byl, ale něco s ním nebylo v pořádku (po změně koncovky na XLS nešel otevřít - ani na PC, kde nikdy předtím nebyl). Od vydavatele softwaru jsem získal nový soubor REFPROP.XLS, převedl na doplněk (rovnou xlam - ?) a vše funguje jak má.
Děkuji všem za podnětné příspěvky.

PS: když už jsem to tu nakousl, poprosil bych vás ještě o názor na rychlost makra:
Makro načte z listu cca 50 vstupních hodnot, provede matematické výpočty (cca polovinu přes REFPROP, zbytek samo), vypočtené hodnoty zapíše do listu (cca 350 až 400 tisíc čísel – každé asi 15 znaků) a vykreslí graf (cca 60 křivek). K zápisu dat používá příkazů ActiveCell.Offset a With ActiveCell…Offset. Po opravě doplňku makro trvá cca 32s + 3s na vykreslení grafu. Výpočty v REFPROPU jsou relativně složité, přesto si myslím, že většinu času zabere zápis do listu. Myslíte si, že by použití jiných příkazů pro zápis dat (jako třeba v předchozím příspěvku zmíněný Array), mohlo běh makra výrazněji zkrátit?

Vovka napsal/a:

Ověřte si, zda je opravdu REFPROP u vás volaný jako doplněk.

Myslím, že jste na to kápnul ale VBA není moje parketa, a tedy nevím jak to udělat. V referencích sešitu mám uvedeno "Reference to REFPROP.XLA". Když do svého pokusného sešitu zkopíruji moduly z REFPROP.XLA pak není třeba zápis do buňky mého listu provádět přes:
Teplota_C = Temperature("mdm", "crit", "si with c")
Workbooks(Sesit).Sheets(List).Range("a1") = Teplota_C
ale postačí: Teplota_C = Temperature("mdm", "crit", "si with c")
Range("a1") = Teplota_C

Ještě před přečtením Vašeho příspěvku jsem upravil jedno z výpočtových maker tak, aby se zápis do buněk prováděl přes plnou adresu:Workbooks(Sesit).Sheets(List).Range("...") makro sice proběhlo správně, ale to co kdysi trvalo zhruba 2 minuty, dnes na mnohem rychlejším PC trvalo 47 minut...

Jak tedy ověřit/docílit abych REFPROP volal jako doplněk? Prostá kopie modulů asi není čisté řešení...

Děkuji, po úpravě kódu na:

Sesit = ActiveWorkbook.Name
List = ActiveSheet.Name
'--------------------
Teplota_C = Temperature("mdm", "crit", "si with c")
Workbooks(Sesit).Sheets(List).Range("a1") = Teplota_C

Teplota_K = Teplota_C + 273.15
Workbooks(Sesit).Sheets(List).Range("b1") = Teplota_K

vše funguje dle očekávání. Uvedení celé adresy (sešit, list i buňka) je jistě bezpečnější než "pouhé" ActiveSheet, uvidím o kolik bude kód pomalejší (vba do listu vrací několik tisíc hodnot). Přesto není možné, že mám jen jinak nastavený excel nebo chování jeho doplňků, když kdysi ActiveSheet stačilo?

Tipl jste si správně 1, sešit s mým makrem je aktivní do chvíle, než se odvolám na funkci REFPROPu, po odvolání se stává aktivním REFPROP.XLA. Zapíšu-li za funkci REFPROPu: Workbooks("pokus1.xlsm").Activate, proběhne zbytek makra "správně".

Problém je, že skutečná makra jsou dost rozsáhlá a průběžně se odvolávají na funkce REFPROPu. Existuje jednoduchá metoda jak hromadně zabránit aktivaci REFPROP.XLA po použití jeho rovnic?

Dobrý den,
před lety jsem si pořídil software REFPROP (pro termodynamické výpočty), který lze pomocí REFPROP.XLA propojit s excelem. Výpočty v rámci listu i ve vba fungovaly výborně ale po přechodu z win xp, excel 2010 na win 7 a excel 2013 přestala fungovat moje makra. Nyní se k výpočtům znovu vracím a rád bych makra zprovoznil. Zdá se, že REFPROP počítá ve vba správně ale vypočtené hodnoty se nedaří zapsat do buněk v listu. Pro názornost uvedu primitivní příklad:

Dim Teplota_C As Double
Dim Teplota_K As Double

Private Sub CommandButton1_Click()

Teplota_C = Temperature("mdm", "crit", "si with c")

MsgBox (Teplota_C)
ActiveSheet.Range("a1") = Teplota_C

ActiveSheet.Range("a2") = "ahoj"

Teplota_K = Teplota_C + 273.15
ActiveSheet.Range("b1") = Teplota_K
MsgBox (Teplota_K)

End Sub

Teplota_C se odvolává na funkci REFPROPu, (která má spočítat kritickou teplotu MDM v jednotkách soustavy SI), a skutečně jí spočítá správně (290,94°C) a uloží do proměnné Teplota_C (potvrzeno přes debug/run to cursor), zobrazí se MsgBox (Teplota_C) se správným údajem ale do buněk A1 a B1 se nic nezapíše, dokonce ani do buňky A2, která s výpočtem REFPROPu nesouvisí. Přitom Teplota_K je spočtena správně a zobrazí se i MsgBox (Teplota_K) se správným údajem. Pokud bych pro výpočet proměnné Teplota_C nepoužil funkci REFPROPu (ať už temperature nebo jakoukoli jinou) ale vlastní rovnici, pak zápis do buněk proběhne správně. Zkoušel jsem proměnnou i úplně odstranit (např. ActiveSheet.Range("a1") = Temperature ("mdm", "crit", "si with c")) ale chová se to stejně…

Předem děkuji za případné nápady.


Uživatelské menu

Nejste přihlášen(a)
avatar\n

Menu

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.

On-line nástroje