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
elninoslov
Level 2.5
Level 2.5
Příspěvky: 386
Registrován: 12 čer 2013 23:40

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

Příspěvek od elninoslov »

Áaaaá, ale už viac fakt nestíham ..

Kód: Vybrat vše

Sub kopiruj()
Dim aHledat(), aPosun(), Data(), i As Integer, Radek_c As Long, Radku As Long
Const SLOUPCU = 5                               'Počet kopírovaných sloupců dat
Const PRVNI_RS = 3                              'První řádek dat v sestavě
Const PRVNI_SS = 3                              'První sloupec dat v sestavě

    aHledat = Array("Hangers", "Cartridges")    'Pole hledaných slov
    aPosun = Array(6, 15)                       'Pole posunů
    Radek_c = 3                                 'První řádek pro zápis v Cíl
    
    With wsSestava
        Radku = .Cells(Rows.Count, PRVNI_SS).End(xlUp).Row - 2 'Počet řádků zdrojových dat v sestavě
        If Radku = 0 Then MsgBox "Sestava bez dat.", vbExclamation: Exit Sub
        Data = .Cells(PRVNI_RS, PRVNI_SS).Resize(Radku, SLOUPCU).Value
    End With
    
    Application.ScreenUpdating = False
    For i = 0 To UBound(aHledat)                'Postupné spracování všech hledaných slov
        Zpracuj Data, Radek_c, SLOUPCU, CStr(aHledat(i))
        Radek_c = Radek_c + aPosun(i)
    Next i
    Application.ScreenUpdating = True
End Sub

Sub Zpracuj(ByRef Data, Radek As Long, SLOUPCU As Integer, Hledat As String)
Dim i As Long, y As Integer, Pole()
Const PRVNI_SC = 1                              'První sloupec dat v Cíl

    For i = 1 To UBound(Data, 1)                'Projít pole zdrojových dat (pole Data je odevzdané odkazem)
        If Data(i, 2) = Hledat Then
            ReDim Pole(1 To 1, 1 To SLOUPCU)    'Příprava pole kopírovaných dat
            For y = 1 To SLOUPCU                'Vyplnění pole kopírovaných dat
                Pole(1, y) = Data(i, y)
            Next y
            wsCil.Cells(Radek + Data(i, 3) - 1, PRVNI_SC).Resize(, SLOUPCU).Value = Pole 'Zápis pole kopírovaných dat na správnou pozici
        End If
    Next i
End Sub
Přílohy
Makro kopíruj v poradí.xlsm
(21.48 KiB) Staženo 69 x
Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3376
Registrován: 24 říj 2008 19:50

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

Příspěvek od atari »

Tak teprve dnes jsem se k tomu dostal...

Bod 1. U mě v Excelu 2013 mi to dávalo chybu. Když jsem odstranil tečky před Cells, tak to začalo fungovat (první část). K čemu tam ty tečky jsou? To vaše fungovalo i s tečkama. Zvláštní ...

Kód: Vybrat vše

 With wsSestava
        Radku = Cells(Rows.Count, PRVNI_SS).End(xlUp).Row - 2 'Počet řádků zdrojových dat v sestavě
        If Radku = 0 Then MsgBox "Sestava bez dat.", vbExclamation: Exit Sub
        Data = Cells(PRVNI_RS, PRVNI_SS).Resize(Radku, SLOUPCU).Value
    End With
Bod 2. Je tam však někde chyba. Pokud číslo sloupce (Const PRVNI_SS = 3) změním ze 3 na jiné, tak už to nefunguje (data se nezkopírují). Nepodařilo se mi najít kde je problém.
Uziv00

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

Příspěvek od Uziv00 »

Souvisí s příkazem with:
https://office.lasakovi.com/excel/vba-t ... excel-vba/
Zjednodušeně řečeno - když si vytvořím objekt na souborem, pak můžu číst vlastnosti toho souboru.
Set objFile=objFSO.GetFile("C:\Program Files\Windows Media Player\wmplayer.exe")
Pak např. datum vytvoření: objFile.DateCreated
datum poslední změny: objFile.DateLastModified
atd...
A abych v kódu nemusel pořád to objFile opakovat, použiju příkaz with objFile. Pak už mi stačí .DateCreated.
Uživatelský avatar
Grimm
Level 2
Level 2
Příspěvky: 165
Registrován: 30 zář 2017 20:50

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

Příspěvek od Grimm »

Bod 2 souvisí s bodem 1.
Pravděpodobně ve svém sešitě nemáš list s názvem wsSestava - POZOR jedná se o CODEMANE Listu. Proto dochází k chybě. Když odstraníš tečky tak kód nepracuje s Listem wsSestava, ale s listem, který je právě aktivní.

Edit: obr
Výstřižek.PNG
Výstřižek.PNG (5.52 KiB) Zobrazeno 1418 x
Uživatelský avatar
elninoslov
Level 2.5
Level 2.5
Příspěvky: 386
Registrován: 12 čer 2013 23:40

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

Příspěvek od elninoslov »

Kolegovia odpovedali. Tak len k makru. Robil som to trošku inak ako ste to mal Vy. Prehľadávané dáta som v poli "Data" odovzdával odkazom do proc. Zpracuj. A to z 2 dôvodov. Prvý - ByRef premenná sa neposiela celá, teda sa neduplikuje, ale pošle sa iba odkaz na tú pôvodnú. Rýchlejšie. No a druhý - parameter "Data" je interná premenná proc. "kopiruj", teda sa vytvára čistá pri jej spustení, a po skončení nikde nič neostáva. Žiadne globálne premenné som nepoužil.

No a polia ako také som použil kvôli rýchlosti (200 000 riadkov cez pole vložíte rýchlejšie ako 10 000 riadkov po jednom), aj keď polia majú tiež úskalia (načítanie oblastí je Variantné, teda starý známy prob. Value vs Value2, redimenzovanie a pod.).
Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3376
Registrován: 24 říj 2008 19:50

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

Příspěvek od atari »

OK díky za vysvětlení s těmi názvy listů.

Funguje to však, když sloupec "Slovo" a "Poradie" je vždy hned za prvním sloupcem dat v sestavě.
Takže když "Const PRVNI_SS = 2" tak sloupec "Slovo" a "Poradie" musí být na pozizi 3 a 4.

Já však například potřebuji "Const PRVNI_SS = 2" ale sloupec "Slovo" a "Poradie" na pozizi 5 a 6.

Nějak se v těch polích nevyznám... :-( Nepodařilo se mi ten kod rozlušit jak to udělat - viz příloha.
Přílohy
Makro kopíruj v poradí 2.xlsm
(20.42 KiB) Staženo 67 x
Uživatelský avatar
Grimm
Level 2
Level 2
Příspěvky: 165
Registrován: 30 zář 2017 20:50

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

Příspěvek od Grimm »

Trochu sem se v tom pošťoural a zdá se, že by to mohlo splňovat Tvůj požadavek.
Úprava spočívá v přečíslování rozsahů polí a jedné podmínce.

Edit : Vyměněna příloha
Přílohy
Makro kopíruj v poradí 2.xlsm
(20.63 KiB) Staženo 61 x
Naposledy upravil(a) Grimm dne 16 čer 2020 13:15, celkem upraveno 1 x.
Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3376
Registrován: 24 říj 2008 19:50

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

Příspěvek od atari »

Změnil jsem "Const PRVNI_SS = 2" (na dvojku), a už to zase nefugnuje - viz příloha.

Asi tam bude nějaký překlep, protože na konci je "x=1", ale s "x" se nikde nepracuje.
Přílohy
Makro kopíruj v poradí 3.xlsm
(20.5 KiB) Staženo 57 x
Uživatelský avatar
Grimm
Level 2
Level 2
Příspěvky: 165
Registrován: 30 zář 2017 20:50

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

Příspěvek od Grimm »

To x=1 tam samozřejmě nemá být, byl to pozůstatek po ladění (na funkčnost kódu to nemělo vliv), změnil sem přílohu.
Proč máš potřebu měnit číslo sloupce ???
Pokud pracuješ s poli nelze jen tak měnit rozsahy, musíš upravit i rozsahy polí !
Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3376
Registrován: 24 říj 2008 19:50

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

Příspěvek od atari »

Já ty sloupce ve svém sešitu měl jinak, ale už jsem si je tedy upravil podle vzoru, takže už mě to funguje.

Tažke děkuji.
Uživatelský avatar
elninoslov
Level 2.5
Level 2.5
Příspěvky: 386
Registrován: 12 čer 2013 23:40

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

Příspěvek od elninoslov »

Nie je problém to urobiť akokoľvek, ale je potrebné vidieť reálne rozloženie tabuliek. Lebo teraz máte v cieli o 1 stĺpec menej, a sestava má medzeru stĺp D. Poloha Pořadí a Slovo sa dá ľahko nájsť, ak je variabilná

Kód: Vybrat vše

...
SlovoIDX = WorksheetFunction.Match(SLOVO, .Value, 0)
...
a potom sa len zmení porovnávací riadok

Kód: Vybrat vše

...
If Data(i, SlovoIDX) = Hledat Then
...
Kľudne sa to dá urobiť aj tak, že si určíte ktoré iba stĺpce chcete kopírovať zo Sestavy, aj v akom poradí sa majú nasúkať do Cíle, aj to či bude niekde medzera. Len to musím vidieť, lebo inak je to tipovačka.
Tu je príklad úpravy na variabilné umiestnenie Slovo a Pořadí (predpoklad že v Cieli budú rovnaké). Je to len príklad, nie riešenie, lebo ako vravím, nesedia stĺpce v Sestava a Cíl.
Přílohy
Makro kopíruj v poradí 2.xlsm
(23.49 KiB) Staženo 66 x
Uživatelský avatar
atari
Level 6
Level 6
Příspěvky: 3376
Registrován: 24 říj 2008 19:50

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

Příspěvek od atari »

Díky moc.
Já těch tabulek mám totiž více, a v každé je sloupec "Slovo" umístěný trochu jinde. Ale teď když už mám tuhle upravu, tak se v tom už začínám orientovat a už bych si to asi dokázal upravit sám.

Co se týče výběru sloupců a jejich pořadí, tak to zatím nepotřebuji. Ale čistě akademicky, to se udělá tak, že když chci sloupce například ABEFI, tak si udělám tři pole (AB, EF a I) a pak nakopíruji tři pole, nebo se ten výběr a pořadí dělá v jednom poli pomocí nějaké funkce?
Odpovědět

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