
VBA Excel 2010 - odlišnosť výsledkov medzi makrom VBA a manuálnym vykonaním náhrady znakov
Prosím o pomoc,
neviem, či má niekto podobnú skúsenosť ako ja, ale v novom Exceli 2010 som už viackrát zaregistroval nepochopiteľné správanie VBA (záznamník makier mi napr. v určitých jednoduchých úkonoch nahral nelogické zápisy, čomu potom zodpovedal aj výsledok po spustení makra, t.j. odlišný, nezmyselný postup (s nezmyselným výsledkom), než bol pri nahrávaní makra zaznamenávaný... Preto neviem, či aj môj aktuálny problém nesúvisí s nejakou chybou VBA, alebo je chyba medzi stoličkou a klávesnicou ;)
Momentálne mám nasledujúci problém:
do stĺpca hárka som skopíroval ceny z inej databázy, kde sú sumy zapísané vo forme dvojmiestneho desatinného čísla, pričom ako oddeľovač tisícov je použitá bodka a pred číselným údajom sú 4 medzery (excel vyhodnocuje ako reťazec, so zarovnaním naľavo). Ručným spustením ponuky "Hľadať a nahradiť" som nahradil bodky prázdnym znakom a následne som pridelil formát dvojmiestneho desatinného čísla s oddeľovačom tisícov (odstup). Excel úkon vykonal, vyhodnotil údaje ako čísla, odstránil bezvýznamové medzery na začiatkoch a zarovnal údaje napravo.
Keď som tento úkon zaznamenal ako makro a následne makro spustil, VBA spôsobil chybu v číslach, ALE LEN u čísel, ktoré boli menšie ako 1000 t.j. v riadkoch s cenami, kde sa bodka nevyskytovala. U nich nahradil prázdnym znakom desatinnú čiarku (?!?) a týmpádom mi z pôvodného napr 37,80 urobil 3 780,00 !!!
Prečo pri ručnom vykonaní náhrady prebehne všetko regulérne a pri spustení makra, ktoré bolo zaznamenané tým istým ručným vykonaním, dôjde k chybe a nahradí v číslach, kde sa bodka nevyskytovala, desatinnú čiarku?!? Pričom v číslach nad 1 000 nahradí len bodky a tam sa čiarok nedotkne!
Som bezradný...
Prosím o radu
Ďakujem
To, že záznam makra v Excelu od Office 2007 jde do kytek, mě taky neskutečně sejří. Samozřejmě dle MS toto nejsou chyby, ale vlastnosti.![]:)](https://static.poradna.net/images/smiley/evilsmile.gif)
A co se týče toho divného chování u čísel, taky jsem se s něčím podobným setkal. Mám dojem (ale neručím za něj), že VBA neumí změnit vnitřní reprezentaci formátování čísla dle nastavení Excelu a automaticky číslo bere v US formátování (tj. tečka se chápe jako desetinná čárka).
Navíc už jsem několikrát zjistil, že náhrada prováděná v prostředí Excelu se nerovná náhradě prováděné ve VBA - při nahrazování v Excelu se udělá po zápisu do buňky akce, jako kdybys buňku editoval a editaci ukončil stiskem ENTER (mj. Excel při této akci automaticky rozeznává formát editovaného výrazu a tento formát pak taky sám nastaví, dokáže právě ořezat nadbytečné mezery před číslem atd.). Ve VBA ale provede jen samotný zápis do buňky, bez toho stisku ENTER.
Asi bych na to šel ručně - v cyklu bych načetl obsah jednotlivých buněk jako řetězec a v něm pak prováděl náhradu a ořez mezer.
Ďakujem za odpoveď, tiež ma napadla rozličnosť formátovania v SK verzii Excelu a EN verzii VBA a aj som sa pokúsil v editore Visual Basicu vyhľadať tieto nastavenia, kvôli prevereniu, či je tomu naozaj tak, ale nie sú tam možnosti takéhoto nastavenia a nie sú ani v rozšírených možnostiach nastavenia Excelu. Skúsil som aj nastaviť tieto znaky v ovládacích paneloch Windowsu pre anglickú klávesnicu ale bez účinku...
A rozoberanie obsahov buniek v cykle by bola dosť otročina, pri niekoľkotisícriadkovej zostave ale dík za nápad ;)
A je mi ľúto, že to vyzerá naozaj tak, že VBA bude takýmto spôsobom pomaly nepoužiteľný. Pár sklamaní a keď sa ukáže, že mu nemožno plne dôverovať tak som s ním skončil. Obrovská škoda, veľakrát som si ním veľmi výrazne pomohol.
Ešte raz ďakujem za informácie
R
Nastavení desetinného oddělovače ve VBA nenajdeš, protože tam žádné není - je jen v Excelu a VBA jej bohužel nepřebírá. A obávám se, že nepřebírá ani nastavení z Windows, má to tam asi dané natvrdo...
Nicméně - teď jsem si zkusil do Excelu 2007 načíst pár čísel v tom formátu, co máš (tj. s tečkou jako oddělovačem tisíců a čárkou jako desetinným oddělovačem), a nic takového, co píšeš (... U nich nahradil prázdnym znakom desatinnú čiarku (?!?) a týmpádom mi z pôvodného napr 37,80 urobil 3 780,00) jsem nezaznamenal!
Použil jsem tenhle vygenerovaný příkaz pro nahrazení:
Áno, týmto spôsobom som to robil aj ja, prikladám zredukovaný súbor na odskúšanie.
Mne to na Excel 2010 spraví chybu...
(Síce v priloženom príklade nenastane rozoznanie čísla u pôvodných hodnôt s bodkami, potrebné je ešte vykonať zmenu "text na stĺpce" ale to nie je problém. Problém je v označených riadkoch...)
Ďakujem
Hmm, problém je v tom, že některé hodnoty jsou již jakoby na čísla převedené a u nich VBA bere, že mají jako oddělovač desetinných míst tečku. Proto dojde k té náhradě a posunu desetinného znaménka.
Napadla mě jedna možnost, jak to obejít:
1. do buňky B2 zapsat vzorec ="X" & A2 a rozkopírovat jej pro zbytek řádků (čili před číslo doplnit znak "X")
2. celý sloupec B zkopírovat jako hodnoty do sloupce C (tím mám zaručeno, že ve sloupci C bude 100% řetezec)
3. v tom sloupci C teprve provést náhradu "." za ""
4. do buňky D2 zapsat vzorec =ČÁST(C2;2;30)*1 a rozkopírovat pro další řádky (čili vezmu část řetězce bez znaku "X" a vynásobením jedničkou z něj navíc vyrobím číslo.
Je to trochu krkolomné, ale funguje to a asi to bude rychlejší, než všehno procházet v cyklu. Vzorce ve sloupci B a D můžou být předpřipravené a zkopírování A do C jako hondoty můžeš udělat makrem.
Možná ještě někoho napadne něco elegantnějšího ...
:D tiež občas vymýšľam finty, ako ísť na nejaký problém z inej strany, ale takéto ma ešte nenapadlo ;)
Takže cez prinútenie brať všetko ako reťazce? OK, skúsim.
Čo sa týka predprípravy pomocných stĺpcov, nemám problém si vytvoriť aj všetky tie pomocné stĺpce makrom a potom ich vypustiť...
Ďakujem, si kámo ;)
Já bych asi upravil makro ve smyslu rozpoznání zda jde o číslo, nebo řetězec. Asi nějak takhle (chce to vyzkoušet a nemám tu excel).
iString = isString
Ďakujem, vyskúšam.
isString vo VBA neexistuje ale po miernej modifikácii na
Dim Vyber As Range
Dim Bunka As Range
Set Vyber = Range("AE11:AE2348")
For Each Bunka In Vyber
If WorksheetFunction.IsText(Bunka.Value) Then Bunka.Value = Replace(Bunka.Value, ".", "")
Next Bunka
to funguje ;)
Dík