=COUNTIF($A$1:A1;A1)
To je docela rizikové na chybu. Musíte mať niekde uložené staré názvy. Tu som ich dal do listu OLD.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, Bunka As Range, rngOLD As Range, H As String, MSG As String
Set Zmena = Intersect(Range("K4:AD4"), Target)
If Not Zmena Is Nothing Then
On Error GoTo CHYBA
For Each Bunka In Zmena.Cells
Set rngOLD = wsOLD.Range(Bunka.Address)
H = Bunka.Value
Worksheets(rngOLD.Value).Name = H
Worksheets("Trénink " & rngOLD.Value).Name = "Trénink " & H
Bunka.Hyperlinks.Add Bunka, "", Split(Worksheets(H).Cells(1, 1).Address(, , 0, 1), "]")(1), H
rngOLD.Value = H
CHYBA:
If Err.Number <> 0 Then MSG = MSG & IIf(MSG = "", "", vbNewLine) & H
Next Bunka
If MSG <> "" Then MsgBox "Tieto zmenené hodnoty sa nepodarilo správne aplikovať:" & vbNewLine & MSG, vbCritical
End If
End Sub
Maticový vzorec do PF?
=--MID(B3;10;2)=MAX(IF(LEFT($B$3:$B$10999;8)=LEFT(B3;8);--MID($B$3:$B$10999;10;2)))
=--ČÁST(B3;10;2)=MAX(KDYŽ(ZLEVA($B$3:$B$10999;8)=ZLEVA(B3;8);--ČÁST($B$3:$B$10999;10;2)))
ale výpočetne náročné na 11K riadkoch.
Jaj keby ste vedela, ako sa mi dnes už nece. Snáď zajtra.
V prípade prerobenia na objekt Tabuľka, treba myslieť na dôsledky. Máte tam zakomponované zisťovanie verzie Excelu, a v prípade nižšej verzie sa ukladá XLS, a nie XLSM! Teda Tabuľka sa znefunkční. Teda z toho že to tam je predpokladám, že to používate cross verziami. atď.
Prečo konkrétne od 22. riadku mažete presne 55 riadkov?
.Cells(22, 2).Resize(55, 7).ClearContents
Čo sa má nachádzať na 55. riadku?
If riadok - 54 > 0 Then
.Cells(55, 1).Resize(riadok - 55, 7).ClearContents
.Cells(55, 1).Resize(9) = 1
.Cells(55, 9).Resize(9) = WorksheetFunction.Transpose(Array("OK", "NK", "NKJIS", "UK", "ORL", "JORL", "OMFCH", "Očné", "JOCK"))
End If
Prečo musí byť v A nezmazaných vždy presne 33 riadkov? To mi nesedí ani na dni v mesiaci...
Inak v tej kontrole nemôže byť
And (LST <> FaP)
ale
And (LST <> "FaP")
ostatné si preberiem až po odpovediach.
No ale Vy predpokladám hovoríte o tom, že Vám nevymaže posledný riadok na liste "zoznam". To makro ale práve list "zoznam" má vo výnimkách (funkcia "CheckMesiac"). Makro sa tohto listu nedotkne, tak mi je záhadou, ako Vám môže nevymazať posledný riadok z listu, v ktorom nič nemaže.
A ďalej pozerám, že som dával (to je moje makro) konštantu PRVY_RIADOK, ktorú očividne nikde nepoužívate. Teraz by mala byť asi 22, nie 20. To je ale fuk. Hovorím to len preto, že to naznačuje "nefundované" úpravy :).
O ktoré makro ide?
Ale čoby bolo. Predstavte si množinu M{5,1,6}. Vytvorím novú prázdnu množinu N, do ktorej budeme zoraďovať. Z M si budeme postupne vyťahovať čísla. Prvé je 5. Teraz skontrolujeme po jednom čísla v N, a hľadáme prvé z N, ktoré je väčšie ako 5. Žiadne ešte nieje, tak 5 pridáme a máme N{5}. Berieme ďalšie číslo z M, teda 1. A zase hľadáme v N prvé väčšie ako 1. A ejhľa, číslo 5 z N je väčšie ako 1 z M, tak pridáme do zoradenej množiny N číslo 1 pred pozíciu tej 5 čo tam už je. Takže máme N{1,5}. A berieme ďalšie z M, teda 6. A znovu porovnávame už zoradenú novú N, a hľadáme prvé väčšie. Bác, žiadne nieje, tak pridáme na koniec. A máme N{1,5,6}. Toľko základný princíp, lebo kolekcia umožňuje vložiť položku Before alebo After alebo na koniec.
Blbé je, ak máme vyhľadávacie kľúče. Tie nezistíme, ak ich nemáme ešte niekde uložené. Zvolil som teda spôsob, že kolekcia nebude obsahovať len samotnú hodnotu, ale aj vyhľadávací kľúč, ktorý je na začiatku pri plnení priradíme. A ako pridáme do kolekcie položku z 2-mi hodnotami (hodnota aj kľúč)? No strelíme do nej pole. Array(položka, kľúč). to je prvá malá komplikácia v kóde.
Druhá malá komplikácia, ktorá Vás bude miasť, je prehadzovanie porovnávaných položiek pri prehodení vzostupného/zostupného radenia. Aby to nebolo komplikované, môžete si urobiť jednoducho 2 samostatné cykly, vykonávané podmienene podľa voľby zoradenia. Či už cez If alebo Select Case.
No a to, že je tam pridaný aj index zoraďovacieho poľa, to je len taký bonus. Ono totiž môže byť niekedy treba do kolekcie natrepať aj širšie pole, a potom môže byť takýto index užitočný. Ale ak to má byť variabilné treba myslieť na to jedným krátkym cyklom ešte, ale to som tam nedával, lebo ak viete, že máte pole 4-och údajov a radiť podľa 3. z nich, tak rovno pri napĺňaní budete plniť poľom o veľkosti 5 položiek (5. je ten kľúč). A áno ak to má byť UNI, treba doplniť o ten cyklus. Tu sa už ale dostávame do bodu, kedy je zrejmé, že makrá sú vo väčšine špecializované, a snaha urobiť niečo absolútne UNI, to len zneprehľadňuje.
Na žiadosť do tejto starej témy pridávam príklad novo požadovaného riešenia, aj s logovaním.
Aké A42? Tam nezadávate oblasť dátumov, ale rozsah, teda prvý a posledný. Priložte príklad v súbore. A musíte zadať ešte 3. parameter 1, ktorý určí že víkend je Pia-Ned. A 4. parameter je oblasť so zoznamom sviatkov.
EDIT2: tak zadajte MAX() z rozsahu dátumov, napr.
=NETWORKDAYS.INTL(A13;MAX(A13:A43);1)
To je maticový vzorec. Zadáva sa Ctrl+Shift+Enter. Nie len Enter.
=IFERROR(TRIM(LEFT(SUBSTITUTE(MID(F2;MIN(IFERROR(SEARCH(" "&{0;1;2;3;4;5;6;7;8;9};" "&F2);FALSE));LEN(F2));" ";REPT(" ";LEN(F2)));LEN(F2)));"")
=IFERROR(PROČISTIT(ZLEVA(DOSADIT(ČÁST(F2;MIN(IFERROR(HLEDAT(" "&{0;1;2;3;4;5;6;7;8;9};" "&F2);NEPRAVDA));DÉLKA(F2));" ";OPAKOVAT(" ";DÉLKA(F2)));DÉLKA(F2)));"")
Ale problém je, keď je hneď za číslom čiarka (24F,) alebo aj s ďalším textom (130,St.Xavier's)
EDIT: Dalo by sa toho zbaviť pridaním ďalších dvoch SUBSTITUTE
=IFERROR(TRIM(LEFT(SUBSTITUTE(SUBSTITUTE(SUBSTITUTE(MID(F2;MIN(IFERROR(SEARCH(" "&{0;1;2;3;4;5;6;7;8;9};" "&F2);FALSE));LEN(F2));" ";REPT(" ";LEN(F2)));",";REPT(" ";LEN(F2)));".";REPT(" ";LEN(F2)));LEN(F2)));"")
=IFERROR(PROČISTIT(ZLEVA(DOSADIT(DOSADIT(DOSADIT(ČÁST(F2;MIN(IFERROR(HLEDAT(" "&{0;1;2;3;4;5;6;7;8;9};" "&F2);NEPRAVDA));DÉLKA(F2));" ";OPAKOVAT(" ";DÉLKA(F2)));",";OPAKOVAT(" ";DÉLKA(F2)));".";OPAKOVAT(" ";DÉLKA(F2)));DÉLKA(F2)));"")
Pridávam príklad radenia kolekcie, a to tak, že ostáva stále možnosť hľadania cez kľúč. Aj keď to očividne nepotrebujete, lebo chcete asi iba zoradiť data. Stratu kľúča som obišiel tak, že kolekcia neobsahuje len potrebné dáta, ale obsahuje pole, skladajúce sa z dát a z kópie kľúča). Tým pádom potom pri zoraďovaní môžeme daným položkám naspäť priradiť ich kľúč. Zakomponoval som voľbu indexu v poli dát, smerodatného pre to ktorá položka poľa je dátová a navyše zoraďujúca. A tiež som zakomponoval možnosť otočiť zoradenie.
Takže tento príklad iba demonštruje, lepšie by bolo to urobiť asi na mieru daného problému, teda vycucnúť iba potrebné.
Ja by som to zoradil hneď pri napĺňaní.
Sub Naplnit_a_zoradit_naraz()
Dim Col As New Collection, D(), i As Long, y As Long, bKoniec As Boolean
With Worksheets("razeni")
D = .Range("C4:C11").Value2
For i = 1 To UBound(D, 1)
bKoniec = True
For y = 1 To Col.Count
If Col(y) > D(i, 1) Then bKoniec = False: Col.Add D(i, 1), CStr(D(i, 1)), y: Exit For
Next y
If bKoniec Then Col.Add D(i, 1), CStr(D(i, 1))
Next i
ReDim D(1 To Col.Count, 1 To 1)
For i = 1 To Col.Count
D(i, 1) = Col(i)
Next i
.Range("D4").Resize(Col.Count).Value = D
End With
End Sub
Jednoducho
EDIT: Prípadne to úplne stačí aj bez toho obalenia do fnc INDEX(). To ma napadlo, jak som vypil polku piva. Nuž, je to na niečo dobré
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.