Dík, udělal jsem to jak radíš
Ahoj,¨
v kódu používám metodu Find pro hledání v určité oblasti, přičemž potřebuji mít parametr Lookat:=xlWhole. Toto si bohužel excel zapamatuje a když pak uživatel hledá v listě pomocí Ctrl + F, tak to hledá shodu obsahu celé buňky. Takže pokud je v buňce třeba "Hradec Králové" a do hledacího okýnka napíšu "Hradec", tak to buňku nenajde. Abych to hledání vrátil do výchozího stavu, tak je potřeba kliknout na Možnosti>> a tam odháknout "Pouze celé buňky".
Mohl bych asi do kódu přidat další hledání, tentokrát s parametrem Lookat:=xlPart, ale zbytečně to bude zpomalovat proceduru. Nedá se to ve VBA nastavit ještě někde jinde a čistěji?
Dík, M.
No nevím, je to pakárna prodírat se nekomentovaným cizím kódem, kde prvky formuláře nebyly pojmenovány nějak smysluplně. Pomalost by mohla být zapříčiněna těmi spletitými výpočty nad množinou dat. Zkus je smazat, zdali se to významně nezrychlí.
Pokud ano, pak stojí za to se zamyslet, k čemu ty výpočty slouží a zdali by to nešlo spočítat pouze na vyžádání nebo jinak (třeba smyčkou přes pole - viděl jsi, že to švihá bleskurychle).
Není úplně pravda, že můžeš přiložit pouze jeden soubor, v rámci jednoho adresáře se Shiftem můžeš označit více příloh.
Tvé druhé "lepší" vysvětlení je postiženo stejnou mlhavostí jako to první, takže sorry
Tak to je ostudné, taková slepota.
Díky
Přikládám. Na prvním listě to filtruje v pořádku, na druhém o sloupec vedle.
Do VBA projectu si přidej modul (Insert-Module) a do něj vlož funkci VratCisloRadku (kód úplně dole), která funguje tak, že si nejdříve natáhne data z celého listu do pole a pak jej prohledá. Jakmile narazí na první nález, vrátí číslo řádku. To je to co potřebuješ a vrací to výsledek bleskem a případný filtr v listě Data na to nemá vliv.
Jinak tvoje oblast dat není souvislá, což není úplně dobře. Když se postavíš třeba na buňku A1 a uděláš dvojmat pravý Ctrl + hvězdička, tak se ti označí pouze oblast A1:M6201. Neboť sloupec N je úplně prázdný, ale pak zase data pokračují. Jakmile bys dal třeba omylem seřadit data, tak máš problém. Takže alespoň v těch prázdných sloupcích zapiš do záhlaví libovolný znak - uvidíš, že po dvojhmatu se ti označí celá oblast.
Takže kód pod tlačítkem "Najdi" si změň následovně:
Private Sub Najdi_Click()
i = VratCisloRadku(Me.TextBox17.Text)
If i = 0 Then
MsgBox "Zadaný údaj " & Me.TextBox17.Text & " nebyl nalezen"
Exit Sub
End If
Me.NajdiDalsi.Enabled = True
If i > 3 And Me.Předchozí.Enabled = False Then Me.Předchozí.Enabled = True
If i = 3 And Me.Předchozí.Enabled = True Then Me.Předchozí.Enabled = False
Call PrepisTextBox
End Sub
Public Function VratCisloRadku(strText As String) As Long
Dim ii As Long, j As Long
Dim rgOblast As Range
Dim arPole() As Variant
Dim ws As Worksheet
Set ws = Worksheets("Data")
Set rgOblast = ws.Range("A2").CurrentRegion
arPole = rgOblast
For ii = LBound(arPole, 1) To UBound(arPole, 1)
For j = LBound(arPole, 2) To UBound(arPole, 2)
If arPole(ii, j) = strText Then
VratCisloRadku = ii
Exit Function
End If
Next j
Next ii
End Function
Změň u formuláře vlastnost ShowModal na False, tím umožníš, že bude možné kód krokovat. Jinak důvodem toho, že se nezapíšou hodnoty při aktivnám přepínači Filtr je skutečnost, že metoda Find jednoduše tu hledanou buňku nenajde a tím pádem řádek i = 0, čili žádný zápis se nemůže konat.
Čili potíž vidím v nešťastném prohledávání přes všechny buňky listu, které na filtrem skryté řádky nefunguje. Doporučuji použít vhodnější metodu hledání - třeba výběrem sloupce ve kterém se hledá. Anebo si načtu range do pole a prohledávání pole je řádově rychlejší než prohledávání hodnot na listě.
Pomohl bych ti rád, ale je to nesrozumitelné. A navíc se to chová jinak než popisuješ. Když dám zapsat, tak na listě Data je stále stejný počet řádků jak před akcí a stav přepínače Filtr na to nemá vliv. Anebo jsem nepochopil smysl toho formuláře
Zkus jasně popsat čeho chceš dosáhnout, ve smyslu:
1. ve formuáři udělám tuto změnu/akci ...
2. očekávám, že ...
3. Namísto toho se stane toto ...
V panelu nástrojů Rychlý přístup mám svojí ikonu a na ní navázanou níže uvedenou proceduru. Používám ji pro zafiltrování libovolné tabulky podle hodnoty v aktuální buňce. Léta mi to funguje bez potíží, ale v poslední době to v některých tabulkách nasadí filtr do nesprávného sloupce, obvykle do iCol + 1.
Kde může být problém?
Upřesňuji, že obě tabulky (tedy kde to funguje i kde to nefunguje) mají data souvisle od sloupce A, žádný sloupec není skrytý...
Předem dík, M
Sub FiltrPodleHodnoty()
Dim iCol As Integer, Dim rgTab As Range, Dim strVal As Variant
iCol = ActiveCell.Column
Set rgTab = ActiveCell.CurrentRegion
strVal = ActiveCell.Value
On Error Resume Next
ActiveSheet.Range(rgTab.Address).AutoFilter Field:=iCol, Criteria1:=strVal
ActiveWindow.SmallScroll Down:=-100
On Error GoTo 0
End Sub
Aha dík, Application.DisplayStatusBar = True to vyřešilo.
Při otevírání sešitu tam mám zálohovací rutinu, která do Status baru vypisuje aktuální kroky které zrovna provádí. Na jejím konci jsem ukončil hlášení nesprávným způsobem, tedy
Application.DisplayStatusBar = False namísto Application.StatusBar = ""
Zvláštní, že jsem si toho po celé ty roky nevšiml
Ahoj,
ukázalo se, že jeden můj excelový sešit (VBA) po otevření způsobí, že Excel přestane nabízet automatický Průměr, Počet a Součet ve spodním stavovém řádku vpravo (viz obrázek). Zatím to dovedu uvést do původního stavu jenom restartem celého excelu.
V možnostech excelu jsem to nenašel a neumím to ani vygúglit bo nevím jak se tato fíčurka jmenuje česky, natož anglicky.
Předem dík za radu či alespoň za název této funkcionalitky
Bylo mi divné, že App.EnableEvents někdy funguje a někdy ne , tak jsem to obvykle obešel jinak.
S tou globální proměnnou to zřejmě bude lepší, vyzkouším.
Každopádně dík za upřesnění.
Takže jsi na to přišel sám, paráda.
Jen upozornění na ošidnost událostních procedur pověšených na změnu - ty se spouští pokaždé když dojde k změně v daném prvku, tedy i když se ten prvek mění makrem. Takže i když načítáš nějaký záznam jiným makrem, přičemž to změní hodnotu v txtID, tak v tom okamžiku proběhne ta tvoje vyhledávající rutina, takže ve finále se to vlastně provede dvakrát. A docela dobře by se to mohlo i zacyklit. Zde je možné použít buď jiné události než change, anebo v momentě když si to nepřejeme, to potlačit pomocí Application.EnableEvents = False. Anebo to spouštět tlačítkem
Ve čtvrté verzi (Ucim_sa_VBA4.xlsm) bylo i listování záznamy, ale tys mi poslal něco, co je verzí 3, čili ještě bez toho. Pokud by sis v tom udělal pořádek, asi bys nic nezkazil...
A to hledání chceš spouštět tlačítkem z listu anebo to chceš startovat z prostředí formuláře? Anebo obojí?
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.