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

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

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

Á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 53 x

Reklama
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 » 15 čer 2020 16:28

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.

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

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

Příspěvekod ITCrowd » 15 čer 2020 17:21

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.
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
Grimm
Level 2
Level 2
Příspěvky: 162
Registrován: září 17
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod Grimm » 15 čer 2020 17:37

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 1128 x

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 » 15 čer 2020 18:30

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: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

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

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

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 49 x

Uživatelský avatar
Grimm
Level 2
Level 2
Příspěvky: 162
Registrován: září 17
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod Grimm » 16 čer 2020 12:32

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 43 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: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod atari » 16 čer 2020 13:00

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 40 x

Uživatelský avatar
Grimm
Level 2
Level 2
Příspěvky: 162
Registrován: září 17
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod Grimm » 16 čer 2020 13:21

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: 3195
Registrován: říjen 08
Pohlaví: Muž
Stav:
Offline

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

Příspěvekod atari » 16 čer 2020 14:18

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

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

Příspěvekod elninoslov » 17 čer 2020 07:30

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 48 x

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 » 17 čer 2020 22:12

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?


  • 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
    1271
    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
    1684
    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ů