< návrat zpět

MS Excel


Téma: Kolekce - overeni zda je hodnota obsazena rss

Zaslal/a 31.10.2020 11:25

Merlin99Zdravim vsechny ,
potreboval bych poradit jak zjistit jestli je dana hodnota obsazena v dane kolekci a pokud ano tak proceduru nize preskocit.
Viz priloha kdyby nekdo tusil
Dekuji


Sub KOLEKCE()

Set myCol = New Collection
Dim Cell As Range
Dim Oblast_FAST As Range

'Tvorba KOLEKCE
MaxRadek = List4.Cells(Rows.Count, "B").End(xlUp).Row
Set Oblast_FAST = List4.Range("B2:B" & MaxRadek)
For Each Cell In Oblast_FAST
myCol.Add Cell
Next Cell

'if hodnota 10001695 je v kolekci tak preskoc proceduru nize (ano nyni je)

List3.Range("c2:f5").Value = 99

End Sub

Příloha: rar48673_kolekce.rar (16kB, staženo 1x)
Zaslat odpověď >

#048675
Merlin99
Zkousel jsem pouzit toto reseni ale neuspesne...
https://docs.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.collection.contains?view=netcore-3.1citovat
#048676
avatar
Takže, nejdřív se naplní celá kolekce a až potom se zjišťuje, jestli je tam určitá hodnota?

Jinak bych asi do kolekce načítal přímo hodnotu buňky
myCol.Add Cell.Value

'****** kontrola, zda obsahuje hodnotu
i = 1
jeTasm = False
For Each Item In myCol
If myCol(i) = "10001695" Then
jeTam = True
Exit For
End If
i = i + 1
Next Item
'if hodnota 10001695 je v kolekci tak preskoc proceduru nize (ano nyni je)

If jeTam = False Then
List3.Range("c2:f5").Value = 99
End If
End Sub
Příloha: zip48676_kolekce.zip (17kB, staženo 3x)
citovat
icon #048677
eLCHa
Není třeba testovat. Pokud dáte položce stejný název, jako hodnotu, tak už ji znova nepřidáte.For Each Cell In Oblast_FAST.Cells
On Error Resume Next
myCol.Add Cell.Value2, CStr(Cell.Value2)
On Error Goto 0
Next Cell
Psal jsem to rovnou, takže snad je to OK

Zároveň díky tomuto existenci hodnoty v kolekci zjistíte přes její název ;)citovat
#048679
Merlin99
Jiří497
Děkuji to je presne ono co potrebuji. SUPER prace pomohlo

eLCHa:
Děkuji za radu jen si myslim ze nevyuziju, potrebuji opravdu jak psal Jiří497 provest kontrolu daneho hodnoty jestli je obsazena ci nikoli, necchi ji pridavat.

Děkuji moc za pomoc 1 5citovat
#048694
Stalker
Dobře, budu za blba, ale zeptám se. Proč kolekce?

Na to by stačilo pole a zbavíš se jednoho cyklu nebo další variantou je Slovník (Dictionary) s funkcí Exists.

Použil sem soubor co vkládal Jirka a doplnil kód pro Pole a Slovník, trochu sem upravil i tu kolekci (v proměnné byl překlep).

Pokud by si u slovníku použil včasnou vazbu, můžeš využít výhod Intellisense
https://excelmacromastery.com/vba-dictionary/
Příloha: rar48694_kolekce.rar (18kB, staženo 3x)
citovat
#048699
avatar
Chtěl jsem napsat, že ta kontrola by mohla probíhat už při plnění té kolekce, aby se ušetřil jeden cyklus. Vidím, že nejsem sám.
O slovníku slyším poprvé.citovat
#048702
Merlin99
Stalker:
Dekuji moc za vsemozny priklady reseni urco ulozim do zasoby uzitecnech programku. 5 jinak kolekci jsem si po jirkovi prevzal a poupravil do funkcni krasy uz. takze jsem spokojen
Díkyyy moc za pomoc 5citovat
icon #048708
eLCHa
@Merlin99

Máte pravdu, zadání jsem špatně pochopil, respektive, špatně jsem četl.
Je to také tím, že smysl kolekce je právě v načtení jedinečných hodnot (a pak se volá právě názvem hodnoty - takže nemusíte projíždět cyklem). Pokud ty hodnoty nejsou jedinečné, pak to nedává moc smysl. Pak stačí použít pole (jak píše Stalker) a na testování funkci Filter.

Respektive - vůbec nechápu, proč načítat a pak znovu kontrolovat - to jsou 2 cykly. Buď to testuji při načítání nebo použiju funkci Match na listu a zjistím, jestli se hodnota v dané oblasti vyskytuje.

Ale snad víte, co vlastně chcete.citovat
#048713
Stalker

eLCHa napsal/a:

Pak stačí použít pole a na testování funkci Filter.


Pokud načte hodnoty do pole přímo z listu

MaxRadek = List4.Cells(Rows.Count, "B").End(xlUp).Row
Set Oblast_FAST = List4.Range("B2:B" & MaxRadek)
arrPole = Oblast_FAST.Value


výsledné pole bude "dvourozměrné" arrPole(1 to 22, 1 to 1)
Bude funkce Filter funkční?
Nikdy se mi to nepodařilo rozběhat, pouze pokud bylo pole "jednorozměrné" tedy arrPole(1 to 22).
Je v tom nějaký fígl? Díky za info.citovat
icon #048714
eLCHa
Lze to např. taktoarrPole = Application.Transpose(Oblast_FAST.Value)Ale transpose tuším pracuje korektně je 65 536 řádky
Takže pak raději cyklem (nebo cyklem s transpose po 65 536 řádcích ;) )citovat

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura III

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

Aktivní diskuse

Oprávnění

manrong • 25.11. 13:14

Dynamic Data Exchange - Vzorec v buňce

eLCHa • 25.11. 10:47

Vyhledání dat

Jiří497 • 24.11. 23:24

Vyhledání dat

MilaF • 24.11. 18:15

Vyhledání dat

Jiří497 • 24.11. 9:54

Dynamic Data Exchange - Vzorec v buňce

Nosek • 24.11. 7:15

Vyhledání dat

Jiří497 • 24.11. 0:08