Moje nervy. Celé zle! Teraz vás nekritizujem, pretože to asi neovládate, ja tiež neviem opraviť auto a mnoho ďalších vecí, ale v tom makre je dobrý asi len ten kúsok na rozloženie množstva, čo som robil kedysi tuším ja. Ten malý cyklus s poľom Rozlozene.
Všetko ostatné:
-nezmyselné rozsahy, raz po r. 100, potom 350, potom 42, a pritom je dní max 31, a počet alkoholu poznáte, teda x*31, alebo jedno xlUp
-priraďovanie premenných bez rozmyslu a bez správnej deklarácie. Nie toto nedeklaruje 2 premenné boolean:
Dim kk1, kk2 As Boolean
-zmätočné prepínanie medzi listami
-netuším prečo sa raz zisťuje počet riadkov v A, potom B, potom C, v tom istom liste
-neustále prepočítavanie počtu riadkov ich umiestnenia, neprišiel som na dôvod, navyše zistíte počet a aj tak vymažete riadok 5:100, načo potom ten počet?
-zmažete trange, a hneď pod tým kontrolujete či sa bunky v nej = ""
-kontrola buniek po jednej v cykloch, a zlých cykloch, keď kontroluje ďalej aj po nájdení.
-z názvov premenných nieje nijako priekazné, čo by mohli znamenať.
-chaotické vypĺňanie hotovej tabuľky
-nechápem čo znamenajú niektoré vstupné hodnoty, nedokázal som identifikovať prvotný význam, čo robia s makrom vidím.
-makro je absolútne neprehľadné - postráda tabulátory a zarovnania úrovní
-nieje tam jediný popis, čo by mala daná časť kódu robiť
-dlhé jednoprocedúrové makrá nikdy nebudú tak čitateľné ako parametrizované (to ešte neviem, či sa u Vás bude dať, toľko som to neanalyzoval)
-zbytočné cykly, napr. kontrola rozloženia, či boli rozložené nejaké údaje. Za jedno by sa nemusel alkohol vôbec vypisovať ak nebolo nič predané/rozložené, a za druhé ak už áno poznáme COUNT, COUNTA, COUNTIF, SUM, ...
a navyše
For tt = 1 To 16
? tam ich môže byť predsa viac.
-divné preformátovávanie
-načo slúži hodnota v D7 v listoch 1,2,...? Počet dní to nebude lebo síce 8-9.7 sú 2 dni, ale 1-7.7 nieje 8 dní.
To makro treba celé nie prekovať, ale znovu vytvoriť.
Celému tomu ale vôbec nerozumiem, čo to má ako robiť, prečo a za akých podmienok, ani čo má byť výsledkom. A to si nemyslím, že som v makrách nechápavý
Zatiaľ som sa pokúsil odchytať všemožné posuny, ale stále mi to nefachá tak ako by malo. V tom guláši mi niekde ešte niečo uniká. Uvažujem, či nieje menej času zabitého náhodou vytvorení úplne nového, ako hľadanie súvislostí a záludností v tomto. Každopádne mi dochádza trpezlivosť i čas. Takže zatiaľ Vám sem nič nedám, uvidíme večer ...
Ale nečudujte sa, že už len podľa toho, že sem tento súbor predkladáte aspoň po 5. krát, tak je jasné, že sa do toho komplikovaného gulášu nikomu asi moc nechce.
EDIT:
If cell2 Like nr Or cell2 Like nr2 Then
pravda = True
End If
A "pravda" sa už ďalej nespracováva. Takže na Pravde Vám už nezáleží ?
Tam treba pomeniť makrá dosť výrazne. Priložte ešte, ako má ten list "Tabulka B" vyzerať po úprave. Nieje mi jasné čo sa má posunúť. Či aj to "Kal.dni: Otvorené: Zatvorené:
", alebo až ten =SUM(C5:C350)..., alebo až "Deň Vodka Borovička Koniferka..."
Ono to samozrejme ide aj keď máte označenú oblasť. Ja som tým chcel len akcentovať, že záleží na polohe, ak sa používa relatívne adresovanie. Pozor potom na správne dopočítanie indexu. Teda to "ROW(...)-x"/"COLUMN(...)-x", kde to "x" je o jedno menšie ako prvé ROW()/COLUMN(). Aby vznikla na prvej bunke jednička v indexe.
Moje chabé nervy... To je taký problém, keď chcete upraviť makro, dodať súbor, ktorý korešponduje s tým makrom? V makre čarujete so stĺpcami 14, 16, 17 (N, P, Q). O takých príloha nechyruje. Výstup má prepísať pôvodný riadok? Spravím to tak, že zdroj bude A1:K1 a výstup bude A1:Kx.
EDIT: Teraz som si prešiel okom to Vaše makro. Vôbec nerobí to čo vravíte - to bude na niečo iné. Ono zlučuje hodnoty zo stĺpcov P a Q do P od 12 riadku pokiaľ nieje prázdny riadok v N. V 11. riadku má byť nejaká hlavička, a formátujete všetky dostupné riadky Excelu - to je špatne.
Pri zadávaní PF, musíte stáť na prvej bunke formátovanej oblasti, ak sa v PF používa relatívne adresovanie. A to sa tu používa. V tom druhom ste neskopíroval pravú zátvorku ")", a prílohu ste nedal.
"zmeny pozicii", "rozne tabulky", ... To je na každú tabuľku individuálne. Záleží kde začína, podľa toho ra vytvára index ten porovnávanej tabuľky (riadok/stĺpec). Pre každú zvlášť, alebo ak je v nich nejaký vzor možno sa dá dopočítať a použiť univerzál. Prílohu ...
Vy píšete o porovnaní listov, nie zošitov. V PF nepôjde takýto "cross-workbooks". To už potom asi iba makrom. Tam bude záležať na tom o koľko hodnôt pôjde, či použiť dolovanie dát cez bunku, cez otvorenie súboru, cez ExecuteExcel4Macro, cez ADO, ...
Fčuleky sa mi do toho moc nechce ... :(
Alebo si ťahať permanentne tie data z iného zošitu vzorcom do buniek v aktuálnom zošite niekam bokom a potom už PF ide.
Pr. PF:
No takto, zaregistrujte sa, a priložte prílohu - súbor. Citlivé dáta zamente, a nechajte len zopár. Hlavne ide o ponechanie rozmiestnenia všetkého. Aj kód sa bude v súbore ľahšie lúštiť s tabulátormi, ako takto bez nich.
Do prílohy Jiřího som zatiaľ nepozeral, no práve problém nadbytočných medzier som riešil vo svojich predchádzajúcich vzorcoch. Aj som to tam napísal. Je na to funkcia TRIM/PROČISTIT.
No to práve píše, že to nechce prepisovať na VBA funkcie. Postup s Name a Evaluate sa dá použiť takmer všeobecne. Ale samozrejme akákoľvek funkcia Excelu sa dá prerobiť do VBA, či už jednoduchšie alebo zložitejšie.
Asi iba použiť Evaluate spolu s dočasným vytvorením definovaného názvu, ktorý zabezpečí preklad vzorca pre Evaluate. V reťazci vzorca, treba tak či tak ošetriť úvodzovky ("" namiesto "):
Sub FUNKCE2()
Dim RetVal
Dim LocalFormula As String
Dim LanguageCode As Long
LanguageCode = Application.LanguageSettings.LanguageID(msoLanguageIDUI)
If LanguageCode <> 1029 Then MsgBox "Nemožno vykonať, nesprávny jazyk Excelu.": Exit Sub
LocalFormula = "=CONCATENATE(ROK(EDATE(DNES();-1));""_"";KDYŽ(MĚSÍC(EDATE(DNES();-1))>9;MĚSÍC(EDATE(DNES();-1));CONCATENATE(0;MĚSÍC(EDATE(DNES();-1)))))"
On Error Resume Next
Names("EVALNAMELOCAL").Delete
On Error GoTo 0
Names.Add Name:="EVALNAMELOCAL", RefersToLocal:=LocalFormula
RetVal = Evaluate("EVALNAMELOCAL")
Names("EVALNAMELOCAL").Delete
MsgBox RetVal
End Sub
To samozrejme nemožno použiť 10 000x, lebo to bude pomalé.
???
List3.Range("B1").Value = IIf(SLOZKA = "False", SLOZKA1, SLOZKA)
Zlý popis, zlé makro, žiadna príloha. Riešenie bude bez problémov, ak pridáte prílohu, kde bude jasne ukázané čo máte (1. list), a čo má vzniknúť (2. list).
V tomto Vašom makre je "divno" definované, akú oblasť má prehľadávať na daný text.
Range("B" & xto, ActiveCell)
??? od B až po aktívnu bunku? Teda môže byť aktívna v rôznych stĺpcoch a aj tak makro má zlučovať?
A zlučovať sa má bunka s nájdeným textom so susednou zľava? Alebo ak bude prvá aktívna H, hľadať sa bude v B:G, nájde sa text v C, tak sa zlúči C:G ?
...
No dajte prílohu.
Názov listu na jeho ušku, to je akoby Caption/popis pre užívateľa. Vo VBA ak je list nemenný, tak je výhodnejšie mu priradiť tzv. CodeName. Je to položka Name v jeho vlastnostiach/Properties. Vtedy sa stačí potom v makre rovno odvolávať na jeho CodeName, a je šuma-fuk, čo má list napísané na svojom ušku.
Takže ak budete meniť iba názov uška listu, nastavte si CodeName a použite v makre to. Ak ale budete listy fyzicky stále vymieňať, tak musíte stále meniť aj názov listu v makre.
Teda príklad:
List "newdata" môžete volať v makre napr.:
Worksheets("newdata").blabla...
ale ak zmeníte jeho názov napr. na "newdata20", musíte zmeniť aj makro na
Worksheets("newdata20").blabla...
Ale ak mu priradíte CodeName na "wsNewData", tak je jedno či sa volá "newdata" alebo "newdata20", makro stále pobeží, lebo sa bude odvolávať na objekt s CodeName "wsNewData", teda
wsNewData.blabla...
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.