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 5.5
Level 5.5
Příspěvky: 2522
Registrován: říjen 08
Pohlaví: Muž

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ů
Elite Level 12.5
Elite Level 12.5
Příspěvky: 19305
Registrován: březen 10
Pohlaví: Muž

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: 7006
Registrován: prosinec 10
Pohlaví: Muž

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ě.
"Dokud nebyly počítače, programování nebylo problémem.
Jestliže bylo několik slabých počítačů, bylo programování malým problémem.
Když však programátoři získali počítače na svou dobu ohromné síly, stalo se také programování ohromným problémem."

E. W. Dijkstra, 1972

Uživatelský avatar
atari
Level 5.5
Level 5.5
Příspěvky: 2522
Registrován: říjen 08
Pohlaví: Muž

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: 19052
Registrován: květen 07
Pohlaví: Muž

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: 7006
Registrován: prosinec 10
Pohlaví: Muž

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 ?
"Dokud nebyly počítače, programování nebylo problémem.
Jestliže bylo několik slabých počítačů, bylo programování malým problémem.
Když však programátoři získali počítače na svou dobu ohromné síly, stalo se také programování ohromným problémem."

E. W. Dijkstra, 1972

Uživatelský avatar
atari
Level 5.5
Level 5.5
Příspěvky: 2522
Registrován: říjen 08
Pohlaví: Muž

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: 266
Registrován: červen 13
Pohlaví: Muž

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: 8802
Registrován: srpen 08
Bydliště: Brno
Pohlaví: Muž

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#, LESS, TypeScript
PhpStorm, Docker, WinSCP, Opera browser, Windows 10
iPhone XS
Raspberry PI 3 (KODI, Raspbian)
XBox One S, PS 4

Uživatelský avatar
atari
Level 5.5
Level 5.5
Příspěvky: 2522
Registrován: říjen 08
Pohlaví: Muž

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: 266
Registrován: červen 13
Pohlaví: Muž

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ů
Elite Level 12.5
Elite Level 12.5
Příspěvky: 19305
Registrován: březen 10
Pohlaví: Muž

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
  • Obnova systémové proměnné Path
    od Fanula » 04 čer 2020 17:52 » v Windows 10, 8, 7, Vista, XP…
    2
    337
    od Fanula
    04 čer 2020 22:16
  • CMD nahrazení znaku v proměnné jiným znakem
    od martin.nohejl » 20 dub 2020 17:07 » v Programování a tvorba webu
    4
    415
    od Diallix
    15 kvě 2020 14:20
  • Dotaz na hodnotu PC
    od Daraeon84 » 09 črc 2020 23:45 » v Rady s výběrem hardwaru a sestavením PC
    5
    405
    od flowem
    10 črc 2020 15:59
  • Co je to Albis GTU4 a má to nějakou hodnotu?
    od FIDLIK » 12 dub 2020 15:20 » v Vše ostatní (hw)
    3
    2194
    od petr22
    12 dub 2020 17:55
  • Jakou ma hodnotu tahle bedna
    od Trog » 08 lis 2019 07:28 » v P: Hardware
    6
    1086
    od Bobesek14
    09 lis 2019 20:43

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

Kdo je online

Uživatelé prohlížející si toto fórum: CommonCrawl [Bot] a 0 hostů