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.
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ě , 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.
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
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.