| Autor | Správa |
Jezoo
 Užívateľ
 Založený: 14.12.2007 Príspevky: 5
 | Zaslal: Pi 14.12.07 15:56 |   |
Dobry den, mate neiekto skusenosti ako použiť úvodzovky v premennej ? Ide o to ze si v makre vytvaram vzorec na vypočet sumy s podmienkou:
=SUMIF($F$2:$AZ$2;"TOTAL";F7:AZ7) ... napr., ja použijem kod:
Cells(riadok, 5).Formula = "=SUMIF($F$2:$AZ$2;" & ""TOTAL"" & ";F" & riadok & ":AZ" & riadok & ")" ... samozrejme mi to nefunguje.
Viete mi niekto poradit ?
Dakujem. |
| |
  |
 |
audiotrack
 Zablokovaný užívateľ
 Založený: 18.11.2006 Príspevky: 680
 | Zaslal: Pi 14.12.07 16:17 |   |
| kód: | | Cells(riadok, 5).Formula = "=SUMIF($F$2:$AZ$2;" & "'TOTAL'" & ";F" & riadok & ":AZ" & riadok & ")" |
apostrofy v úvodzovkách. |
| |
  |
 |
Jezoo
 Užívateľ
 Založený: 14.12.2007 Príspevky: 5
 | Zaslal: Pi 14.12.07 16:34 |   |
Run-time Error "1004"
Application-defined or object defined error
 |
| |
  |
 |
audiotrack
 Zablokovaný užívateľ
 Založený: 18.11.2006 Príspevky: 680
 | Zaslal: Pi 14.12.07 22:44 |   |
no zvláštne.. ti apostrofy tam nerobia chybu, dokonca si tam môžeš dať aj úvodzovky ak chceš takto:
| kód: | | Cells(riadok, 5).Formula = "=SUMIF($A$1:$C$2;" & Chr(34) & "TOTAL" & Chr(34) & ";A7:C8)" |
problém tam ale robí to rovnása a za boha neviem zistiť prečo. Ak ho zmažeš, ten reťazec sa ti vypíše pekne aj s úvodzovkami. Ak ho tam zase dáš, už to nejde. Iné funkcie mi idú vypísať v pohode, napríklad
| kód: | | [C6].Formula = "=BIN2DEC(111)" |
takže chyba bude niekde skrytá. Ten vzorec máš dobre, skúšal som ho. Preto neviem pochopiť prečo to tam to rovnása nechce zobrať. |
| |
  |
 |
blazon
 Užívateľ
 Založený: 15.09.2009 Príspevky: 8
 | Zaslal: Ut 15.09.09 12:29 |   |
Zdravím.
Vyriešili ste to už niekto prosím Vás ? Veľmi ma to zaujíma, pretože momentálne som na tom vkladaní vzorca s úvodzovkami stroskotaný už pár dní. Je to presne tak, ak tam "=" nieje - text OK, ak tam "=" je - Application-defined or object-defined error
a je úplne jedno či to priraďujete do Cells(), Range(), ako Value či ako Formula...
Zaujímavé ale je, že keď dám napr. niečo takéto jednoduché, tak to funguje.
| kód: | | Sheets("Zostava").Range("B1").Formula = "=SIN(0.5)&""B""" |
ale ak dám niečo s podmienkou IF, tak už to nefunguje:
| kód: | | Sheets("Zostava").Range("A1").Formula = "=IF(NazSK=""A"";""B"";Cislo)" |
Niečo s tou podmienkou IF bude v neporiadku, keďže mi nepracuje korektne ani v definovaných názvoch, ani v podmienenom formátovaní.
Ešte podotknem, že mám Office 2003 Pro SK + SP1 + SP2, Vista x64 CZ Ult.
Ďakujem za prípadnú pomoc. |
| |
  |
 |
Jezoo
 Užívateľ
 Založený: 14.12.2007 Príspevky: 5
 | Zaslal: Ut 15.09.09 13:14 |   |
... podla mna je to nejaka chyba Excelu, niektore vzorce idu, niektore nie ... ja to momentalne riesim tak ze si v jednom liste vytvorim bo buniek vzorce ktore potrebujem (alebo tie co mi generuju chybu ked ich vytvaram v kode) a jednoducho si bunku v kode s danym vzorcom skopirujem a prilepim na miesto kde ju potrebujem ... takto mi funguju vsetky vzorce ... nie je to naidealnejsie riesenie pre "programatora" ... ale na veci ktore vytvaram mi to v pohode staci ... |
| |
  |
 |
blazon
 Užívateľ
 Založený: 15.09.2009 Príspevky: 8
 | Zaslal: Ut 15.09.09 14:15 |   |
No tak to je veľký prúser, pretože ja mám zdrojovú tabuľku s asi 400 riadkami, a vytváram automatizovanú zostavu, pri ktorej nebudem vedieť koľko bude riadkov zdroja, pričom každý záznam zastupuje v zostave 3 riadky, v každom 6 stĺpcov, a každá buňka obsahuje iný vzorec. Mení sa to podľa obsahu zdrojových dát. Nieje to možné urobiť nijako inak ako cez nazvyme to "distribuované" vzorce vo VBA, čiže vzorec pre každú buňku treba najskôr vypočítať a zložiť, potom vložiť, a nechať Excel vypočítať. Dohromady asi 7200 vrozcov + formátovanie buniek. Mám tie výpočty urobené pokusne aj celé vo VBA, ale je to 10x pomalšie ako keď použijem Excelácke funkcie.
Pokúsim sa urobiť nejaký univerzálny vzorec, ktorý by bol nachystaný na pomocnom hárku, ako vravíš Ty, len neviem či si s tou rýchlosťou kopírovania do toľkých buniek pomôžem.
EDIT: Nefunguje ani ďalšie riešenie pomocou Evaluate:
| kód: | p = "CONCATENATE(NazSK=""A"";""B"";Cislo)"
Sheets("Zostava").Range("A1") = Evaluate(p) |
vráti do bunky hodnotu "#HODNOTA", navyše by to bol jednorázový výpočet, nereagovalo by to na zmenu dát (čo by sa dalo ošetriť cez akciu Change) |
| |
  |
 |
blazon
 Užívateľ
 Založený: 15.09.2009 Príspevky: 8
 |
Ďakujem za nakopnutie správnym smerom. To riešenie so zhotovením vzorca manuálne, v pomocnom hárku, a potom vzorec kopírovať vo VBA na potrebné miesta, sa ukázalo ako veľmi efektívne, jednoduché, a hlavne rýchle, pretože môžem kopírovať vzorce nie po jednom ale naraz po 400ks/s. Síce to teraz nereaguje na zmenu automaticky, ale zase manuálny režim vytvárania zostavy som stiahol na 11 sekúnd, čo je super. Vo VBA to bolo 3 min.
...Dík... |
| |
  |
 |
gozer
 Užívateľ
 Založený: 01.06.2010 Príspevky: 1
 | Zaslal: Ut 01.06.10 16:26 |   |
zápis funkcie vo VBA s podmienkou IF
napr.: =IF(A1=1;"OK")
dá sa vo VBA zapísať takto: ActiveCell.FormulaR1C1 = "=IF(RC[-1]=1,""OK"")"
alebo:
=IF(A1=1;"OK";IF(A1>1;"ZLE"))
ActiveCell.FormulaR1C1 = "=IF(RC[-1]=1,""OK"",IF(RC[-1]>1,""ZLE""))" |
| |
  |
 |
|