< návrat zpět

MS Excel


Téma: REFPROP - zápis hodnot do buněk ve vba rss

Zaslal/a 7.8.2015 11:22

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.

Zaslat odpověď >

Strana:  1 2   další »
icon #026170
eLCHa
Těžko radit... Zkuste dát místoMsgBox (Teplota_C)
MsgBox ActiveSheet.NameTipl bych, že se to zapisuje, jen aktivní sešit není ten co byste chtěl ;) takže to píše jinam.
To je jediné, co jsem schopen z toho kousku vypozorovat.citovat
#026171
avatar
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?citovat
icon #026172
eLCHa
Zvláštně napsaný doplněk...

Rozhodně bych doporučil všude místo ActiveSheet použít ThisWorkbook.Sheets("pokus1.xlsm"), takže např. místoActiveSheet.Range("a1") = Teplota_CThisWorkbook.Sheets("pokus1.xlsm").Range("a1") = Teplota_CTím by se to mohlo vyřešit a nepotřebujete Workbooks("pokus1.xlsm").Activatecitovat
#026173
avatar
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?citovat
#026174
avatar
Rozdíl mezi 2010 a 2013 je. Napíšu to laicky: ve 2010 se mi sešity otevíraly vždy ve stejné aplikaci excelu, seskupené do "jednoho okna", ve 2013 se otevírá každý sešit ve svém okně (nevím, za je to jiná session excelu). A proto bude i jiné chování při přepnutí sešitů ve VBA. Toť můj názor na změnu chování maker.
Zda se dá nastavit tak nebo tak, na to tu byly nějaké diskuse, nejspíš kdysi někdo chtěl docílit ve 2010 otevírání každého sešitu v jiné aplikaci excelu.
(Tím jiná aplikace excelu myslím další spuštění exe.souboru na stejném počítači.)citovat
#026175
avatar
Formálně vzato, psát ActiveSheet před Range je zbytečné, protože ActiveSheet je pro Range implicitní. Váš problém podle mne vypadá, jako kdybyste svůj REFPROP nevolal jako doplněk, ale jako paralelně otevřený sešit (navíc ne úplně dobře jako doplněk napsaný). Ověřte si, zda je opravdu REFPROP u vás volaný jako doplněk.citovat
#026177
avatar

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í...citovat
#026178
avatar
Nejjednodušeji zjistíte, jestli je doplněk aktivní, pokud z karty Vývojář otevřete nabídku Doplňky. Aktivní doplněk musí být v jejím seznamu a musí být zaškrtnutý. Problém může spočívat v tom, že soubor s doplňkem není na správném místě a proto chybí v seznamu doplňků. Přejmenujte ten soubor z .XLA na .XLS a pak ho uložte z Excelu jako .XLA. Tím ho nastěhujete do správné složky. Pak by se již měl v nabídce doplňků najít.citovat
icon #026179
eLCHa
Myslím, že problém bude jednodušší. Doplněk nebyl instalován vůbec a byl spouštěn jak standardní soubor.

https://support.office.com/cs-cz/article/Zobrazen%C3%AD-spr%C3%A1va-a-instalace-dopl%C5%88k%C5%AF-v-aplikac%C3%ADch-Microsoft-Office-16278816-1948-4028-91e5-76dca5380f8d?CorrelationId=e255990a-48fc-44a5-817d-271b010b2e89&ui=cs-CZ&rs=cs-CZ&ad=CZcitovat
#026180
elninoslov
...2 vs 47 min...

Použite skrátené odkazovanie cez With
With ThisWorkbook.Sheets("pokus1.xlsm")
...
.Range("b1") = Teplota_K
...
End With

Alebo ešte lepšie Range nahradte za
.Cells(1,2) = Teplota_K
A úplne najlepšie, ak zapisujete súvislé oblasti, použite polia. Napr. zapisujete naraz polozky do A1:C1
.Rannge("A1:C1")=Array(Teplota_C, Teplota_K, Vypocet_XYZ)
alebo
.Cells(1, 1).Resize(,3)=Array(Teplota_C, Teplota_K, Vypocet_XYZ)

Píšem iba z tabletu, tak snáď som nevyrobil technickú...citovat

Strana:  1 2   další »

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