Jak ve VBA zapomenout hodnotu proměnné?

Programy pro práci v kanceláři (Word, Excel, Access…=>Office)

Moderátor: Mods_senior

Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod atari » 10 čer 2020 17:12

Mám tuto proceduru:

Kód: Vybrat vše

Dim radek As Integer

Sub kopiruj()
'zde pracuji s proměnnou "radek".
Call Zpracuj
End Sub

Sub Zpracuj()
'zde pracuji s proměnnou "radek".
End Sub


Spustím makro "kopiruj", a když se makro ukončí, tak proměnná "radek" si pořád pamatuje hodnotu.
Ale já potřebuji aby si ji nepamatovala. Protože při dalším spuštění makra mě to zkresluje hodnotu proměnné "radek"
Když dám deklaraci přímo do procedury, tak se proměnná nepřenese při volání Call.

(Samozřejmě umím vložit na začátek kodu nulovací příkazy, ale připadá mi to takové divné.)

Reklama
Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA vynulovat proměnné?

Příspěvekod ITCrowd » 10 čer 2020 17:14

radek = ""
Nic jiného mě nenapadá.
Pokud je přebírán radek odjinud, pak použij příkaz na konci skriptu.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod faraon » 10 čer 2020 17:27

Pokud to neumí něco jako příkaz del v Pythonu, který proměnnou úplně odstraní z paměti, tak ti nic jiného než ruční nulování nezbyde (a můžeš si na to udělat extra funkci ;-)).

Leda že by procedura pokaždé vytvářela tu proměnnou znovu dynamicky na haldě a vracela jí jako výsledek, takže bys jí neměl takhle globálně.
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod atari » 10 čer 2020 17:57

Jasně to nulování jsem tam udělal ..., připadá mi to však jako vopičárna psát prvních 15 řádků kódu a=0, b=0, atd . ...

VBA funguje tak, že když deklaraci vložím do procedury, tak po skončení procedury se veškeré proměnné zapomínají.

Jenže když potřebnuji proměnou přenášet do jiným procedur, tak musím deklaraci udělat mimo proceduru (na začátku modulu), ale to má vlastnost, že proměnná platí i po skončení procedury. A to jsem chtěl vyřešit, zda to lze změnit. Takže asi nelze ...

Uživatelský avatar
X
Elite Level 12.5
Elite Level 12.5
Příspěvky: 19325
Registrován: květen 07
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod X » 10 čer 2020 18:02

Prosím o celý výpis relevantní části kódu, nezdá se mi totiž, že je to tak, jak popisuješ nebo je něco špatně. Když totiž deklaruješ proměnou příkazem Dim mimo proceduru a nepředáváš si ji (Sub kopiruj(promenna)), tak není možné aby uvnitř procedury byla viditelná a hodilo by to chybu. Kdyby to bylo deklarované Public, tak by to byla jiná :-)

Uživatelský avatar
faraon
Master Level 8.5
Master Level 8.5
Příspěvky: 7356
Registrován: prosinec 10
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod faraon » 10 čer 2020 18:06

Jasně, lokální proměnná, po opuštění procedury zmizí.

A nejde tam udělat aspoň a=b=c=d=0 ?
"Král Lávra má dlouhé oslí uši, král je ušatec!

(pravil K. H. Borovský o cenzuře internetu)

Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod atari » 10 čer 2020 18:27

VBA tohle neumí.

a=b=c=d=0 vezme jako výraz a umí ho pouze vyhodnotit jako true nebo falze

Uživatelský avatar
elninoslov
Level 2.5
Level 2.5
Příspěvky: 366
Registrován: červen 13
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod elninoslov » 10 čer 2020 21:59

atari: Tak v parametrizovanej procedúre dajte všetky vstupné premenné ako interné z volajúceho makra, ako ByRef, a vo volanej procedúre pred End Sub ich teda vynulujte. To spôsobí, že vždy po vykonaní volanej procedúry budú interné premenné volajúceho makra "vymazané". Alebo teda vynulovanie robte na konci neparametrizovanej Sub ak sú to globálne premenné, ako píše ITCrowd.
No nerozumiem zamýšľanému použitiu.

X: globálna premenná nadefinovaná pomocou Dim je v Sub normálne viditeľná. Otázka je ako dlho, Excel mával tendenciu zabúdať globálne premenné po nejakom čase.

Kód: Vybrat vše

Dim a As Long, b As Long

Sub Master()
    a = 2
    b = 3
    Slave
    'niečo
    Slave           'ďalšie použitie už vynulovaných globálnych
End Sub

Sub Slave()
    'neviem čo
    a = 0: b = 0    'vynulovanie globálnych
End Sub

Sub Master2()
Dim aa As Long, bb As Long
    aa = 2
    bb = 3
    Slave2 aa, bb
    'niečo
    Slave2 aa, bb   'ďalšie použitie už vynulovaných interných
End Sub

Sub Slave2(ByRef aaa As Long, ByRef bbb As Long)
    'neviem čo
    aaa = 0: bbb = 0    'vynulovanie interných z Master2, odovzdaných odkazom
End Sub

Uživatelský avatar
CZechBoY
Master Level 9.5
Master Level 9.5
Příspěvky: 8813
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž
Stav:
Offline
Kontakt:

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod CZechBoY » 11 čer 2020 09:21

Podle uvidniho kodu to opravdu vypada ze pouzivas globalni promennou misto parametru.
Pokud uvodni kod neni podobny tomu co pouzivas tak prosim o lepsi ukazku.
PHP, Nette, MySQL, C#, TypeScript, Python
IntelliJ Idea, Docker, Opera browser, Linux Mint
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4, nVidia GeForce NOW

Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod atari » 11 čer 2020 10:24

Tak jsem sem dal to nejjednodušší makro, kde je problém jen s jednou proměnnou "posun", kterou musím nulovat.

Účel je tento:
Na listu "Sestava" vyhledám všechny řádky s označením "Hangers" a nakopíruji je do listu "Cil". Začínám kopírovat na řádek č. 3 (Hangers má 6 řádku, takže skončím řádku 9.).

Pak na listu "Sestava" vyhledám všechny řádky ze skupiny "Cartridges" a zase je nakopíruji do listu "Cil", a začínám je kopírovat hned na 10. řádek). A zase další.

A ta proměnná "posun" vždy zajistí, aby ty řádky na sebe navazovaly. Když ji nevynuluji, tak při druhém spuštění makra, se řádky kopírují jinam než potřebuji.

to X: však mě to také chybu nehází, jen řeším to, že po skončení makra si VBA pamatuje hodnotu proměnné, což mi dělá "neplechu" při druhém spuštění makra.

(Již na průmyslovce, když jsem na začátek kódu, napsal a=0, b=0, tak mě s tím učitel vyhodil.)

Kód: Vybrat vše

Option Explicit
Private Sk As String
Dim sl, radek_c, posun, radek, p As Integer

Sub kopiruj()

Sheets("Sestava").Select

radek_c = 3
posun = 0

Sk = "Hangers" 'skupina "Hangers"
Call Zpracuj 'zavolám makro které mi zpracuje skupinu dle proměnné "Sk"
posun = 6 'Skupina Hangers má 6 položek, takže další skupinu píšu až za 6. řádkem

Sk = "Cartridges" 'skupina "Cartridges"
Call Zpracuj
posun = 15

End Sub

Sub Zpracuj()
radek_c = radek_c + posun 'přičtu počet nakopírovaných řádků, abych si je nepřepsal

For radek = 3 To 377 'projdu všechny položky a hledám "Hangers", "Cartridges" atd.
    If Cells(radek, 4) = Sk Then 'pokud naleznu "Hangers", tak překopíruji řádek
        p = Cells(radek, 5) 'do p zapíšu pořadové číslo řádku, určuje pořadí v cíli
        'Každou Hangers nakopíruji do cíle podle poařadí "p":
        Sheets("Cil").Rows(radek_c + p) = Sheets("Sestava").Rows(radek).Value
    Else
    End If
Next radek

End Sub




"

Dodatečně přidáno po 32 minutách 16 vteřinách:
Opravil jsem kód, byl tam špatný název listu.

Uživatelský avatar
elninoslov
Level 2.5
Level 2.5
Příspěvky: 366
Registrován: červen 13
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod elninoslov » 11 čer 2020 11:19

V tomto prípade by som to riešil 2 spôsobmi:
a) radek by bol lokálna premenná procedúry kopiruj, a do procedúry Zpracuj, by sa odovzdávala odkazom. 2. parameter by bol hľadané slovo.
b) radek by si zistila samotná procedúra Zpracuj, na základe napr. End(xlUp).Row
Mám už málo času. Keď prídem, a nebudete tu mať riešenie, tak Vám to spravím. Kód som príliš neskúmal, ale asi by bolo rýchlejšie nasekať to cez pole.

Uživatelský avatar
ITCrowd
Tvůrce článků
Guru Level 13.5
Guru Level 13.5
Příspěvky: 23591
Registrován: březen 10
Pohlaví: Muž
Stav:
Offline

Re: Jak ve VBA zapomenout hodnotu proměnné?

Příspěvekod ITCrowd » 11 čer 2020 12:10

"(Již na průmyslovce, když jsem na začátek kódu, napsal a=0, b=0, tak mě s tím učitel vyhodil.)"
No vidíš. A my, když jsme se v 80-tých letech učili fortran, tak jsme museli na počátku programu dávat každou proměnnou do nuly.
Zkusili jste to vypnout a zapnout? Problémy řeším pouze v tématech. Do SZ mi proto píšete zbytečně.
Základní diagnostika WiFi Jak na diagnostiku sítě Router jako switch Proč je nesmysl chtít router s velkým dosahem Vybíráme router


  • Mohlo by vás zajímat
    Odpovědi
    Zobrazení
    Poslední příspěvek
  • Jakou hodnotu má tato sestava?
    od pukasinek » 05 lis 2023 15:05 » v P: Hardware
    3
    1258
    od pukasinek Zobrazit poslední příspěvek
    05 lis 2023 15:53
  • Jak do Excelu dostat aktuální hodnotu z webové stránky? Příloha(y)
    od Peťa » 10 lis 2023 09:41 » v Kancelářské balíky
    2
    1674
    od Peťa Zobrazit poslední příspěvek
    10 lis 2023 16:24

Zpět na “Kancelářské balíky”

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 6 hostů