Zdravím všechny,
včera jsme měli táhlou poradu na téma toho co tady tvoříme... Jelikož se zadání zase změnilo, museli bychom (přesně jak psal elninoslov) začít od nuly... Nic méně kódy, které jsem od vás všech dostal, mi opravdu hodně pomohli se aspoň začít lehce orientovat v jazyce VBA, za což (jak již píšu po několikáté) vážně vděčný... Odpovídat na příspěvek od AL, nyní již nemá cenu. Díky všem a mějte se...
Na popud Stalkera zde napišu kompletně o co pujde... Chtěl jsem to původně říkat po částech, aby nedošlo k nějakému nedorozumění, ale hodím to tedy celé:
Zde přikládám vzorové data, který celý problém popíše. Ale většinu již (podle mě)elninoslov udělal.
Přikládám dva soubory... během roku těch souborů bude 12. Leden - Prosinec. Potřebuji, abych si mohl vybrat dva měsíce. Například Leden a Únor. A po stisknutí tlačítka, mi program porovná hodnoty u jednotlivých jmen a zobrazí graf, kde bude součet procent
1) jeden graf zobrazí součty procent za oddělení
2) Druhý graf zobrazí součty procent za města¨
Tím postupným řešením problému, jse se chtěl vyhnout tomu, aby nedošlo třeba k nepochopení a někdo by se drbal s programem, který by byl nakonec nanic... Je popsanému problému dobře rozumět? Pokud ne, radši napiš a já to ještě vysvětlím. Aby jsi neztrácel čas
Díky moc... :)
Ahoj Stalker.
vše co píšeš je mi naprosto jasné... Jelikož se jedná o složitější program, nechtěl jsem ho hned celý nahodit. Nehledě na to, že jsem se třeba včera teprve dozvěděl, že by bylo fajn porovnávat i hodnoty v dalším sloupci. Myslel jsem, že jestli program tahá data z externího souboru nebo z toho kde je makro, je jedno. Ze se "jenom" změní cesta ke zdrojovým datům. To že to bude náročné na změnu jsem nevěděl, protože přesně jak píšeš, zkušenost s makry nemam. Věř mi, že jsem naprosto "nadšený" že mě pověřili v práci takovým krásným úkolem jako je to, co tady řeším... Bohužel sám si rady nevím, a tak se spoléhám právě na dobráky, kteří poradí... To že jsem přidal porovnání třetího sloupce, není přece změna, na změnění celého kódu, ale na připsání další podmínky... Jelikož makra neumím, jen si tak nějak představuji, jak by to mohlo jít. Pokud si to představuji špatně, tak se omlouvám... Jelikož se jedná o veřejné fórum a lidi zde radí zcela dobrovolně a ve svém volném čase, myslím, že poděkování na místě je... Pokud si někdo myslí, že to je ironické, za to nemůžu. Poděkování je to nejmenší, co mohu udělat.. K tvému poslednímu odstavci... Ano přišel za mnou v pondělí kolega a řekl, že tam musím přidat ještě ty čísla... takže přesně to se mi stalo...
Pokud by elninoslov byl ochotný semnou dále spolupracovat, moc by mi to pomohlo (vyřešilo problém). Poté, co se do kódu dívám, pomalu se do toho dostávám... Ale jako začátečník bych nikdy to co mi elninoslov poslal, nenapsal...
Ahoj elninoslov,
vážně si vážím Tvého času a snahu mi pomoci.
Přesně jak píše eLCHa. Jestli to jede 20s, 40s, nebo minutu, mi nevadí. Určitě kvůli pár sekundám nebudeme předělávat celý program. Pokud by si měl čas (klidně večer, zítra...) verzi doladit, byl bych vážně vděčný :). Mezi tím se podívám, na to, co jsi již poslal.
EDIT:
Funguje to perfektně... dosadil jsem si do tvých souboru me data (jen na test) a maká to superně.
Zkusím Ti zde napsat, další krok, co výsledmé makro musí dělat. myslím si, že to už bude jednoduché, oproti obtížnosti toho, co jsi již napsal.
Jde o toto.
Porovnám jména. Ti co nejsou v prvý a jsou v druhý, vypíšu. To funguje super.
Nyní potřebuji toto. Je zde třetí sloupec (opět pořád na tom samém místě v každém soubor, tak jako jména), ve kterém jsou čísla. Například: David Novák 15410
Potřeboval bych, aby program u těch jmen které jsou v obojích souborech porovnal tyto čísla a napsal v procentech jejich rozdíl. Přikládám zde Tvá data, jen s menším počtem jmen a dopíši zde čísla.
Pokud by jsi měl čas připsat toto porovnání, budeme se blížit rychle ke zdárnému konci.
Ještě jednou díky za čas a pomoc :)
Díky moc :)
Odkaz je na úschovně, protože v práci nemám přístup na google.drive... http://www.uschovna.cz/zasilka/PPGX2SA5GHPSBDA3-PCB/
Ano, vždy budou na stejnem mistě. Bude se jednat o exportované soubory. Tzn, hlavičky sloupců budou vždy na tom samém místě. Rozdíl bude jenom v názvu souboru se zdrojovými daty. Tedy - první soubor bude třeba 01_Leden_obchod a druhý bude 02_unor_obchod. List, ve kterém budou data uložena se jmenuje všude stejně - month... SOubor, ve kterém bude napsáno makro, bude v té samé složce, ve které budou zdrojové soubory
Ahoj,
chapu :(...
no, soubory budou ve stejnem adresáři jako soubor, kde bude napsano makro. SLoupce se vždy budou jmenovat stejně a vždy budou na stejne pozici. Jenom bude mít soubor jiný počet řádků v různých obchodech a každý měsic. Takže třeba v Lednu bude mít obchod 1 17000 zaměstnanců (list zaměstnanci, tzn 17000 řádků. V únoru třeba 17844 řádků. Když budou tedy stále stejné pozice, bylo by to lehčí na imlpementaci?
Díky moc
Pokouším se nyní aplikovat makro na originální data. Potřeboval bych makro ale upravit tak, aby nyní byly zdrojem dat externí soubory. Tzn třeba soubor s názvem obchod1 a list s názvem zaměstnanci a soubor obchod2 a list zaměstnanci. Šlo by tady popsat, jak a co mám upravit, abych nyní netahal data ze dvou sloupců v jednom souboru, ale z jinéh souborů? A ještějednu úpravu musím udělat.
Nyní jsme vzali z jednoho sloupce Day1 jméno a porovnali se sloupcem Day2, zda tam je to samé. Když tam nebylo, vypsali jsme ho do jiného sloupce.
Nyní mám ale situaci, kdy mám v jednom sloupci jméno a v druhém sloupci příjmení. Je to export z jednoho programu. Takže nemůžu zařídit to, aby bylo jméno i příjmení v jednom sloupci. Musím tedy porovnávat dva sloupce se dvěmi sloupci. Napadlo mě, že by se dalo nějak sjednotit jméno v jednom sloupci s příjmením v druhém sloupci (nějaký join) a pak porovnávat takto sjednocené celé jména. Ale jak na to prakticky, nevim... Měl by si nápad prosím?
Díky moc :)
Ahoj,
díky za super rychlejší úpravu. Jen bych potřeboval opět pár řádku objasnit.
Hlavně ten nový, na kterém je ten program pomocí stringu postaven:
sDay1 = "•" & Join(WorksheetFunction.Transpose(Day1), "•") & "•"
u dalších dnů to je podobné. Co se prosím uvnitř děje? K čemu tam jsou ty tečky?
Díky moc
díky moc :))!!
Stalker:
chápu nyní, že se pole naplní hromadně, bez nutnosti cyklu. Toto naplnění způsobí funkce Resize?
Sub test_pole()
Dim pole()
Dim x As Integer
Dim Data_count As Integer
i = Rows.Count
Data_count = ThisWorkbook.Worksheets("List1").Cells(i, 1).End(xlUp).Row
'ThisWorkbook.Worksheets("List1").Range(Cells(1, 1), Cells(Data_count, 1)).Copy
ReDim pole(1 To Data_count)
pole = ThisWorkbook.Worksheets("List1").Cells(1, 1).Resize(Data_count).Value2
Nyní je v "pole" uložené vše, so začíná A1 a končí Data_count. Proč ale? Co přesně toto zařídilo?
A ještě prosím dotaz.
Když by si chtěl data co jsou v poli "pole" vypsat pod sebe do sloupce. Jak by si to udělal?
Díky
Ahoj stalker,
Diky moc za super video. Zapl jsem si i Local list. Presne něco takového jsem hledal. Ale nevedel jestli to tam je.
Diky :)
promin, ale jsem pořád z toho plnění polí Day1 a Day2 zmatený. Myslel jsem, že aby se pole naplnilo nějakými daty z vybrané oblasti, je k tomu potřeba použít nějaký cyklus. V tvém kódu se ale cyklus nevykytuje a příkaz je okomentovany tak, že již pole bylo naplněno. Jaký příkaz prosím přesně pole naplní? A když jsou obě dvě pole plné, jsou plné jmény z vybrané oblasti, ne? Ne pouze číslovkou, kolik jmen v oblasti je. Díky za objasnění :)
If R1 <> 0 Then
ReDim Day1(1 To R1, 1 To 1) 'příprava pole jmen Day1 podle množství prvků
If R1 = 1 Then
Day1(1, 1) = .Cells(2, 1).Value2 'načtení jmen do pole Day1, když je pouze jedno jméno
Else
Day1 = .Cells(2, 1).Resize(R1).Value2 'načtení jmen do pole Day1
End If
End If
If R2 <> 0 Then
ReDim Day2(1 To R2, 1 To 1) 'příprava pole jmen Day2 podle množství prvků
If R2 = 1 Then
Day2(1, 1) = .Cells(2, 4).Value2 'načtení jmen do pole Day2, když je pouze jedno jméno
Else
Day2 = .Cells(2, 4).Resize(R2).Value2 'načtení jmen do pole Day2
End If
End If
Ahoj elninoslov,
procházím a krokuju si program od tebe, ale je zde pár příkazů u kterých tápu. Začnu od začátku:
1)Day1 = .Cells(2, 1).Resize(R1).Value2 'načtení jmen do pole Day1
píšeš v komentu, že příkaz slouží pro načtení jmen do pole Day1. Když si ale provedu krokování, tak když mám v R1 třeba 5 (5 jmen) tak v Day1 je hodnota Empty. navíc jsem podle google pochopil (možná špatně), že Resize slouží pro rozšíření oblasti. Nikoliv pro načtení dat. Co teda přesně prosím dělá příkaz? Nějak nahrazuje cyklus For pro načtení jmen do Day1?
Day1 = .Cells(2, 1).Resize(R1).Value2
Díky.
elninoslov:
chybku jsem si opravil. Ale stále mi nefunguje situace, kdy v Day2 mám vložené pouze jedno jméno a nebo v day1 mám jenom jedno jméno. Třeba mám
Day1 Day2
David Lukáš
Lenka
a hodí to chybu. Koukl bys prosím na to? Díky :-)
eLCHa:
Verzi mám 2016. Potřebuji to ale udělat přes makra. Tento krok co jsem řešil dneska je jenom jedním z nekolika kroků, které budu muset spojit dohromady. Ve výsledku budu porovnávat soubory kde jeden má 17000 řádků. Některé mají 20000. Zároveň se s VBA učím. Udělal jsem si některé kroky sám. Ty jednodušší. Ty těžší (pro mě) jsem řešil zde na foru. Prostuduju si je a zase budu chytřejší. Nemusím makra ovládat nějak extra dobře. Až udělám toto, zase to dlouhou dobu neuvidím.
Narazil jsem pri testovani na nejaky bug.
Kdyz zadam do Day2 jenom jedno jmeno do bunky (2,4) tak to spadne. Konkretne na radku - Day2 = .Cells(2, 4).Resize(R2).Value2 'načítanie mien do poľa Day2
Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.
Používáte podnikový systém Helios iNuvio? Potřebujete pomoci se správou nebo vyvinout SQL proceduru? Více informací naleznete na stránce Helios iNuvio.