Příspěvky uživatele


< návrat zpět

Strana:  1 ... « předchozí  22 23 24 25 26 27 28 29 30   další » ... 302

Dáta sú od 1. riadku? Nie je tam hlavička? Jedná sa o obyč. tabuľky alebo sú to objekty Tabuľky (ListObject)? Mená máte v nejakom zozname, voči ktorému ma prebehnúť kontrola, alebo iba všeobecná kontrola porovnávaním text->text? Rozdiel je ohromný, pri zozname sa skontroluje najskôr existencia v zozname až potom prehľadáva listy. Naopak pri text-text sa prehľadávajú hneď dáta v listoch. Názvy mesiacov sú vždy v CZ? Sú dáta filtrované?

Tak teda príklad:
Sub Generuj_Sektory()
Dim Sektory() As String, MozneSektory() As String, Vysledek() As String
Dim Den As Integer, Delnik As Integer, Pozice As Integer, Sektor As String, bOK As Boolean

Const POCET_DNI As Long = 5
Const POCET_DELNIKU As Integer = 3

Randomize

With ThisWorkbook.Worksheets("Hárok1")
Sektory = Split(Join(Application.Transpose(.Range("A4:A11").Value), ","), ",")
If UBound(Sektory) + 1 < POCET_DELNIKU Then MsgBox "Málo sektorů.", vbCritical: Exit Sub
ReDim Vysledek(1 To POCET_DNI, 1 To POCET_DELNIKU)

For Den = 1 To POCET_DNI
MozneSektory = Sektory

For Delnik = 1 To POCET_DELNIKU
bOK = False

While Not bOK
Pozice = Int(Rnd() * (UBound(MozneSektory) + 1))
Sektor = MozneSektory(Pozice)
bOK = Den = 1
If Not bOK Then
bOK = Sektor <> Vysledek(Den - 1, Delnik)
If Not bOK Then If UBound(MozneSektory) = 0 Then Den = Den - 1: Exit For
End If
Wend

MozneSektory(Pozice) = "•"
MozneSektory = Filter(MozneSektory, "•", False)
Vysledek(Den, Delnik) = Sektor
Next Delnik
Next Den

.Range("E4").Resize(POCET_DNI, POCET_DELNIKU).Value = Vysledek
End With
End Sub

Rýchlejšie by to bolo asi cez kolekcie alebo nahrádzanie v stringu, ale myslím, že pre Vaše potreby je toto cez Filter aj tak ako delo na komára 5

Priamo v PQ asi cez NestedJoin.

Na hárku1 uvádzate oblasť C10:R20, čo je 176 hodnôt (11*16), na hárku2 uvádzate H10:H20, čo je 11 hodnôt. Ak by ste sa iba zmýlil, a na hárku1 je to vodorovne, tak by ste napísal C10:R10. Nie 20. Ale to aj tak nesedí, lebo je to 16 hodnôt. Na hárku2 je 11.

Dajte si prosím záležať, a napíšte správne oblasti.

Tým H10:H20 myslíte snáď H10:W20, nie? Ako by sme porovnali nerovnaké oblasti? Vyskakovacie okno na Vás vyblafne asi iba makrom. Nestačil by iba nápis v nejakej bunke, alebo vysvietené nezhodné hodnoty napr. na červeno ?

Obrázok??? To vážne? S manuálne nevytvorenou tabuľkou, znázorňujúcou príklad, ako by mal výsledok vyzerať?

Ide totiž ešte aj o nejaké podmienky, všakže? Aby napr. jeden človek nevyfasoval celý týždeň rovnaký sektor, alebo aby všetci nemali rovnaký sektor 2 po sebe, a mnohé ďalšie nad ktorými sa mi nechce zamýšľať. Že niektoré môžu ľahko vzniknúť je isté.

Takže priložte prílohu vo forme súboru xlsx, v ktorom tú tabuľku manuálne vyplníte, ako by mala vyzerať. Týmto Vás snáď prinútim pritom aj pouvažovať nad možnými neželanými stavmi/kombináciami 1
Ktoré nám samozrejme promptne zdelíte.

EDIT:
Jednoduché makro
Sub Generuj()
Dim Sek() As String, tS() As String, V() As String, i As Integer, y As Long, Nahoda As Long

Const POCET_RADKU As Long = 5
Const POCET_DELNIKU As Integer = 3

Randomize

With ThisWorkbook.Worksheets("Hárok1")
Sek = Split(Join(Application.Transpose(.Range("A4:A11").Value), ","), ",")
ReDim V(1 To POCET_RADKU, 1 To POCET_DELNIKU)

For y = 1 To POCET_RADKU
tS = Sek
For i = 1 To POCET_DELNIKU
Nahoda = Int(Rnd() * (UBound(tS) + 1))
V(y, i) = tS(Nahoda)
tS = Filter(tS, tS(Nahoda), False)
Next i
Next y

.Range("E4").Resize(POCET_RADKU, POCET_DELNIKU).Value = V
End With
End Sub

Vo Vašom príklade bude stačiť
"=SUMIFS($E$15:E" & cell.Row & ";$B$15:B" & cell.Row & ";$I$2)"
ale je to to najpomalšie riešenie, chodí po 1 bunke. Lepšie riešenie by bolo cez pole a vloženie vzorca naraz do oblasti. Viete si také urobiť, či mám Vám to spichnúť?

EDIT:
Podľa vzorca, je tá hľadaná hodnota v I2, nie?
Pridávam spomínané makro.
Sub pokus()
Dim B(), i As Long, y As Long, Prvni As Long, Radku As Long, rng As Range, Hledane

Const PRVNI_RADEK_DAT As Long = 15

With ThisWorkbook.Sheets("TEST")
Radku = .Cells(Rows.Count, "B").End(xlUp).Row - PRVNI_RADEK_DAT + 1

If Radku < 1 Then MsgBox "Žádné data v sloupci B", vbCritical: Exit Sub
If Radku = 1 Then ReDim B(1 To 1, 1 To 1): B(1, 1) = .Cells(PRVNI_RADEK_DAT, "B").Value Else B = .Cells(PRVNI_RADEK_DAT, "B").Resize(Radku).Value

Hledane = .Range("I2").Value
If IsEmpty(Hledane) Then MsgBox "Buňka s hledanou hodnotou I2 je prázdná", vbCritical: Exit Sub

For i = 1 To Radku
If B(i, 1) = Hledane Then
y = i + PRVNI_RADEK_DAT - 1
If rng Is Nothing Then Set rng = .Cells(y, "F"): Prvni = y Else Set rng = Union(rng, .Cells(y, "F"))
End If
Next i
End With

If Not rng Is Nothing Then rng.FormulaLocal = "=SUMIFS($E$15:E" & Prvni & ";$B$15:B" & Prvni & ";$I$2)"
End Sub

No poznámky:
Stačilo by použiť vzorec SUMIF, netreba SUMIFS.
Stačilo by mať v F na dostatočnú výšku tento vzorec, a nepotrebujete žiadne makro.
=IF($B15=$I$2;SUMIF($B$15:$B15;$I$2;$E$15:$E15);"")
=KDYŽ($B15=$I$2;SUMIF($B$15:$B15;$I$2;$E$15:$E15);"")

Vytvorte manuálne takú vzorovú tbl, ako by to malo vyzerať. Makrom to nebude problém.

PS: Pre priloženie prílohy sa musíte registrovať - Free

Vy budete z toho robiť predsa KT, nie? Tak si urobte iba reláciu (Relationship) v dátovom modeli.

@stalker : Vaše riešenie bohužiaľ funkčné nie je. V prípade bodov som ja postupoval zbytočne rovnako zložito cez COUNTIFS ako v prípade mien. Pri bodoch naozaj stačí ako Vy použiť len LARGE, lebo nie je potrebné vedieť komu patria. No pri menách LARGE zlyháva v určení mien s rovnakým počtom bodov, viď tbl "najslabši". Je jasné, že obaja sú druhý, ale pre výpis pod sebou v tabuľke potrebujeme pomocou COUNTIFS zistiť koľko ich pred každým riadkom rovnakých už bolo, aby aj rovnaký boli zaradený pod sebou.

@neck : Na body teda použite jednoduchšie riešenie od stalker, no na mená musíte použiť zložitejšie riešenie, napr. to odo mňa, príp. čo dá niekto iný.
Lebo
Martin
Kalor
Kalor

je zle.
Musí to byť
Martin
Kalor
Tibor

A to ešte nevravím o nejakom vhodnom upozornení, ak by rovnakí presahovali tabuľku o 3 riadkoch...

Do iného zatvoreného zošitu to ale kolegovi cez EVALUATE nepôjde. To by sa muselo riešiť komplikovane, napr. načítaním dát zo zdroja do skrytého listu (pri každej zmene textu zdroja). To, čo chcete Vy, teda aby bol vzorec ako text, a zdroj variabilný a tiež ako text, ext. súbor zatvorený, je cez EVALUATE nemožné.

Alebo obyč. maticový (mega)vzorec pomocou COUNTIFS...

Ak znížite počet krokov, nezlepší sa to ?

V pohode, tie Vaše vzorce sú prevediteľné, len si doplňte pre každý odkaz na stĺpec Tabuľky, jej názov ([@trip] -->> TabData[@trip]). Aj s tým majú menej ako 255 znakov.

Kolegov prípad je riešiteľný, ako som písal, skrátením pomocou Definovaných názvov.
Definujte názov ZDROJ
='C:\Users\NovakJ\Desktop\Karel práce\GPCZ složka dokumentů\GPCZ podklady pro fakturaci\[ABCDEFGHEIJKLMOP.xlsx]Haulier Proforma Details Report'!$G$2:$G$200000
A potom len vo vzorcoch namiesto
haulier!$G$2:$G$200000
požijete
ZDROJ
teda namiesto
...SVYHLEDAT(TabData[@trip];haulier!$G$2:$G$200000;1;0)...
bude
...SVYHLEDAT(TabData[@trip];ZDROJ;1;0)

Skrátiť to ide ako som písal.
Definovaný názov TMPVLO
=VLOOKUP(TabData[@trip];haulier!D$2:$G$200000;1;FALSE)
=SVYHLEDAT(TabData[@trip];haulier!D$2:$G$200000;1;NEPRAVDA)

V bunke D7 bude:
IF(AND(TYPE(TabData[@trip])=1;IF(IF(ISERROR(VTMPVLO);"XXX";TMPVLO)="XXX";"";IF(ISERROR(TMPVLO);"XXX";TMPVLO))="");"X?X";IF(IF(ISERROR(TMPVLO);"XXX";TMPVLO)="XXX";"";IF(ISERROR(TMPVLO);"XXX";TMPVLO)))
KDYŽ(A(TYP(TabData[@trip])=1;KDYŽ(KDYŽ(JE.CHYBHODN(VTMPVLO);"XXX";TMPVLO)="XXX";"";KDYŽ(JE.CHYBHODN(TMPVLO);"XXX";TMPVLO))="");"X?X";KDYŽ(KDYŽ(JE.CHYBHODN(TMPVLO);"XXX"; TMPVLO)="XXX";"";KDYŽ(JE.CHYBHODN(TMPVLO);"XXX";TMPVLO)))

Teda skrátené a vykonateľné.


Strana:  1 ... « předchozí  22 23 24 25 26 27 28 29 30   další » ... 302

Uživatelské menu

Nejste přihlášen(a)
avatar\n

Formulář Faktura

Formulář Faktura IV

Oblíbený formulář Faktura byl vylepšen a rozšířen.
Více se dočtete zde.

Helios iNuvio

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.

On-line nástroje