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

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
Nemáte oprávnění prohlížet přiložené soubory.



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

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 1.5
Level 1.5
Příspěvky: 102
Registrován: září 17
Pohlaví: Muž

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
Nemáte oprávnění prohlížet přiložené soubory.

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

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 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 » 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.
Nemáte oprávnění prohlížet přiložené soubory.

Uživatelský avatar
Grimm
Level 1.5
Level 1.5
Příspěvky: 102
Registrován: září 17
Pohlaví: Muž

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
Nemáte oprávnění prohlížet přiložené soubory.
Naposledy upravil(a) Grimm dne 16 čer 2020 13:15, celkem upraveno 1 x.

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 » 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.
Nemáte oprávnění prohlížet přiložené soubory.

Uživatelský avatar
Grimm
Level 1.5
Level 1.5
Příspěvky: 102
Registrován: září 17
Pohlaví: Muž

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

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.
Nemáte oprávnění prohlížet přiložené soubory.

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 » 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
  • Obnova systémové proměnné Path
    od Fanula » 04 čer 2020 17:52 » v Windows 10, 8, 7, Vista, XP…
    2
    336
    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
    414
    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
    404
    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 2 hosti