Úvodní stránka · Fórum · Ke stažení · Odkazy · Links (EN, DE, CZ, SK) 7. září 2010, Regína
Menu
Úvodní stránka
Časté dotazy k Excelu
Fórum
Kategorie článků
Databanka kódů
Ke stažení
Svět Excelu v RSS
Odkazy
Kontakt

Excel - funkce na listu
Excel - funkce VBA
Excel - klávesové zkratky
Excel - znaky, klávesnice
Excel - standardní barvy
Excel - slovník menu
Excel - konstanty
Excel - technické údaje
DVD Servis Office
Excel menu 2003 (Ribbon)
Offset Statistic

Chat
Sponzorované odkazy
Přihlášení
Přezdívka

Heslo



Nejste členem?
Zaregistrujte se co nejdříve.

Zapomněli jste heslo?
Nechte si poslat nové.
Kdo je online
Hosté online: 3
Žádný člen není online

Registrovaní členové: 536
Neaktivovaní členové: 48
Nejnovější člen: Libor
Pohotovost Excel
Excel VBA - první pomoc

ICQ status

Skype
Hry online
Sudoku
Sudoku
Sudoku
Sudoku
Excelplus.NET
Excelplus.NET - RSS 0.91 spampoison.com
Google Pagerank - excelplus.netGoogle Pagerank Antispam.er.cz
Statistiky

Čist téma

Excel VBA - Excelplus.NET | Excel | Visual Basic for Applications (VBA)
Autor pole.find
kp57
Člen

Příspěvků: 18
Bydliště: OVA
Založen: 06.08.07
Přidán 13.07.2010 22:30
Ahoj lidi!
Potrebuju zjistit, zda pole obsahuje danou hodnotu, pokud ano, vratit index polozky. Dik!
Poslat soukromou zprávu
Autor RE: pole.find
Bath
Člen

Příspěvků: 82
Založen: 04.05.09
Přidán 14.07.2010 14:53
Zdravim,
taky je v Ostravě takové vedro jako v Praze?

Projít pole v cyklu a zapamatovat si index
při nalezení shody by nepostačilo?

for x=lbound(pole) to ubound(pole)
if pole(x)= "dana hodnota" then
index_polozky=x
exit for
end if
next

....
Dodatek 20.7.2010 :
Popříp. Dictionary (nebo Collection)

Kód VBA
  1. 'References: Microsoft Scripting Runtime
  2. Dim polozky As New Dictionary
  3. Dim i As Integer
  4. For i = 1 To 10
  5. polozky.Add "položka" & Space(1) & i, i
  6. Next
  7.  
  8. 'MsgBox "Počet položek: " & polozky.Count
  9.  
  10. polozky.CompareMode = BinaryCompare
  11.  
  12. Dim hle_dana_polozka, index_polozky
  13. hle_dana_polozka = "položka 2"
  14. If polozky.Exists(hle_dana_polozka) Then
  15. index_polozky = polozky.Item(hle_dana_polozka)
  16. 'MsgBox "Index hle_dane položky: " & index_polozky
  17. Else
  18. index_polozky = False
  19. 'MsgBox "Hle_dana položka neexistuje!"
  20. End If

Upravil Bath, 20.07.2010 10:33
Poslat soukromou zprávu
Autor RE: pole.find
ad excel
Hlavní administrátor

Obrázek uživatele

Příspěvků: 186
Založen: 27.11.06
Přidán 16.07.2010 15:45
Na poli je možné použít vyhledávací funkce listu, tedy třeba MATCH()... Spíš je pak potřeba ošetřit stav, kdy je zadaná položka nenalezena.


Petr Pecháček
196760265 pechacek@excelplus.net http://excelplus.net Poslat soukromou zprávu
Autor RE: pole.find
kp57
Člen

Příspěvků: 18
Bydliště: OVA
Založen: 06.08.07
Přidán 18.07.2010 01:50
Díky za tipy!
Kontrola v cyklu je klasika. Hledal jsem něco fikaného, jednoduššího. Mohla by to být fce MATCH(), kdyby se nemusel spracovat err. Je tam pak ještě o jeden řádek více než v cyklu a je to pomalejší. I tak moc díky.
Poslat soukromou zprávu
Autor RE: pole.find
Premek
Člen

Obrázek uživatele

Příspěvků: 255
Bydliště: Ostrava
Založen: 11.04.07
Přidán 19.07.2010 13:16
Mohla by to být fce MATCH(), kdyby se nemusel spracovat err. Je tam pak ještě o jeden řádek více než v cyklu a je to pomalejší.


Dovolil bych si oponovat, osobne neznam rychlejsi zpusob nalezeni polozky v poli nez pomoci funcke Match

Pripravil sem pro nazornost vzorovy sesit, ve kterem jsou nejake vymyslene jmena a na radku
100, 1000, 10000, 15001 jsou neduplicitni jmena ktera jsem dal vyhledat. V kodu jsem pak menil tuto cast
Kód VBA
  1. CoHledat = Cells(100, "A").Value

kde cislo 100 sem pote nahradil cislem 1000 a pak 10 000 a nakonec 15 001 a vzdy byla funkce Match rychlejsi.

Sesit je v priloze a kod pro porovnani rychlosti davam i primo sem
Kód VBA
  1.  
  2. Sub Porovnej()
  3.  
  4. Dim CyklusStart As Double
  5. Dim CyklusKonec As Double
  6. Dim MatchStart As Double
  7. Dim MatchEnd As Double
  8. Dim CoHledat As String
  9. Dim IndexPolozky As Long
  10. Dim LastRow As Long
  11. Dim ProhledavanaOblast As Range
  12.  
  13. LastRow = Cells(Rows.Count, "A").End(xlUp).Row
  14. ' najde jmeno firmy na stem radku, vyzkousejte zadat 1000 10000 a 15 001
  15. CoHledat = Cells(100, "A").Value
  16.  
  17. CyklusStart = Timer
  18. For i = 2 To LastRow
  19. If Cells(i, "A").Value = CoHledat Then
  20. IndexPolozky = i
  21. Exit For
  22. End If
  23. Next i
  24. CyklusKonec = Timer
  25.  
  26. IndexPolozky = 0
  27.  
  28. MatchStart = Timer
  29. Set ProhledavanaOblast = Range("A2", Cells(LastRow, "A"))
  30. On Error Resume Next
  31. Err.Clear
  32. IndexPolozky = WorksheetFunction.Match(CoHledat, ProhledavanaOblast, 0)
  33. If Err.Number <> 0 Then
  34. ' tady nejaky kod
  35. End If
  36. MatchEnd = Timer
  37.  
  38.  
  39. MsgBox "Hledany text: " & CoHledat & vbNewLine & _
  40. "Umisteni polozky v seznamu: " & IndexPolozky & vbNewLine & vbNewLine & _
  41. "Prohledani cyklem: " & CyklusKonec - CyklusStart & " sekund" & vbNewLine & _
  42. "Prohledani MATCH: " & MatchEnd - MatchStart & " sekund", vbInformation, "Srovnani rychlosti"
  43.  
  44. Set ProhledavanaOblast = Nothing
  45.  
  46. End Sub



Nikdy neni tak zle, aby nemohlo byt jeste hur :-)
Office 2007 EN & Office 2003 CZ & Office 2000 EN & Office 2010 EN
Premek přiložil(a) následující soubor:
porovani_cyklu_vs_match.zip
Upravil Premek, 19.07.2010 13:20
303146945 http://www.excelvba.estranky.cz Poslat soukromou zprávu
Autor RE: pole.find
kp57
Člen

Příspěvků: 18
Bydliště: OVA
Založen: 06.08.07
Přidán 26.07.2010 01:38
Jednalo se o hledání v POLI, ne v OBLASTI.
Vložil jsem Tvou Oblast do Pole a porovnal, viz.příloha:
kp57 přiložil(a) následující soubor:
testcyklmatch.zip
Poslat soukromou zprávu
Autor RE: pole.find
Premek
Člen

Obrázek uživatele

Příspěvků: 255
Bydliště: Ostrava
Založen: 11.04.07
Přidán 26.07.2010 11:07
Ano, promin, ja hledal v bunkach.
V polich je cyklus az neuveritelne rychly, ted sem to testoval.

Pri testovani mi funkce Match vracela chyby kdyz pole, ktere mela prohledat bylo vetsi nez 65536 polozek. Tzn kod

Kód VBA
  1.  
  2. CoHledat = "Cokoliv co je v bunce"
  3. Pole = Range("A1:A65536")
  4. ' funguje, pole je do 65 536 polozek
  5. IndexPolozky = WorksheetFunction.Match(CoHledat, Pole, 0)
  6.  
  7. ' ale kod pro pole vetsi nez 65 536 uz mi vracel chybu
  8. ' Type Mistmatch
  9. Pole1 = Range("A1:A65537")
  10. IndexPolozky = WorksheetFunction.Match(CoHledat, Pole1, 0)
  11.  


Funguje Vam to stejne? Samozrejme vim ze ta polozka kterou hledam je v seznamu obsazena (kdekoliv) a mam Excel 2007


Nikdy neni tak zle, aby nemohlo byt jeste hur :-)
Office 2007 EN & Office 2003 CZ & Office 2000 EN & Office 2010 EN
303146945 http://www.excelvba.estranky.cz Poslat soukromou zprávu
Autor RE: pole.find
ad excel
Hlavní administrátor

Obrázek uživatele

Příspěvků: 186
Založen: 27.11.06
Přidán 26.07.2010 13:05
K tomu ještě komentář nebo věc, na kterou jsem narazil (teď od boku, snad nebudu plácat) - lze použít Worksheetfunction.Match ale i Application.Match a dává se mu přednost (mám pocit, že právě kvůli chybě při nenalezení). Jinak z těch řádků kp57 trochu cítím jeden velký omyl - čím víc řádků kódů, tím pomalejší makro - typicky pro API funkce tohle nemusí být vůbec pravda a mám za to, že žádný cyklus nebude rychlejší než vestavěná vyhledávácí funkce. Jinak jak jsem psal, vyhledávací funkce lze použít i na primitivním poli, že ji Přemek ukázal na oblasti, je věc jiná. Apropo, ten "error" je opravdu jen jeden řádek navíc (no možná dva).


Petr Pecháček
196760265 pechacek@excelplus.net http://excelplus.net Poslat soukromou zprávu
Autor RE: pole.find
Premek
Člen

Obrázek uživatele

Příspěvků: 255
Bydliště: Ostrava
Založen: 11.04.07
Přidán 26.07.2010 13:45
ad excel napsal:
K tomu ještě komentář nebo věc, na kterou jsem narazil (teď od boku, snad nebudu plácat) - lze použít Worksheetfunction.Match ale i Application.Match a dává se mu přednost (mám pocit, že právě kvůli chybě při nenalezení)..


Zkousel sem oboje a oba vraceji chybu pri vetsim poli nez tech 65 536 zaznamu.

Nasel sem o tom i diskuzi 5 dnu starou a taky jsou z toho celi spatni ... :-(


Nikdy neni tak zle, aby nemohlo byt jeste hur :-)
Office 2007 EN & Office 2003 CZ & Office 2000 EN & Office 2010 EN
303146945 http://www.excelvba.estranky.cz Poslat soukromou zprávu
Autor RE: pole.find
ad excel
Hlavní administrátor

Obrázek uživatele

Příspěvků: 186
Založen: 27.11.06
Přidán 27.07.2010 08:37
Ano, pole prostě mají omezení, z toho pohledu ano.


Petr Pecháček
196760265 pechacek@excelplus.net http://excelplus.net Poslat soukromou zprávu
Přejít na:
... nejlépe se zpracovávají tabulky mléčné čokolády