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í?
Vidím, že listování záznamy z mé poslední přílohy jsi neimplementoval ale neva.
Uložení původních hodnot záznamu předtím, než uložíš změněné hodnoty (tedy jestli jsem to podle popisu správně pochopil) najdeš v příloze
Přiznám se, že moc těm otázkám nerozumím. Naznačuješ, že ty jednotlivé kroky si implementuješ do svého souboru, ale ten nepřikládáš - asi tam máš nějaká data které nechceš zveřejňovat. Ale tím pádem jsme odkázani na slovní popis, který nese jen část informace plus kognitivní zkreslení.
Buď si ty svoje data nějak anonymizuj či jinak vhodně pozměň, (zachovej datové typy) ale bez přiloženého kompletního souboru je to odsouzeno nezdaru z uondání.
Dim OBLAST1_paste1 As Range
Dim x As Integer
Set OBLAST1_paste1 = Worksheets("List16").Range("C8:C19")
x = 15
OBLAST1_paste1.Value = x
Jasně že tam lze ještě hodně vylepšit - např. zadávání datumu pomocí kalendáře anebo pomocí lomítka (jednou rukou), kontrola zdali je zadaná hodnota opravdu datum atd...
Nebo informační hláška při editaci záznamu, kolik hodnot se chystáš v daném záznamu změnit. Taky v tom svém formuláři zatím nemáš ComboBox, Listbox, OptionButton, CheckBox jakožto užitečné a elegantní vychytávky pro maximalizaci uživatelského komfortu...
Tak soubor v příloze už obsahuje to úplné minimum, které opravdický funkční formulář musí umět, čili umožňuje listovat jednotlivými záznamy a editovat je. V případě, že je na listě nasazený filtr, tak neviditelné řádky ignoruje.
Pro listování bylo potřebné změnit vlastnost formuláře ShowModal na False (i když dalo se to ošetřit i přes ignoraci chyby On Error Resume Next). Toto rovněž umožňuje při otvřeném formuláři kopírovat hodnoty z a do formu, což při ShowModal = True nejde.
Věřím, že přidání poznámky, vyčištění kolonek atd zvládneš sám. Rovněž odstranění záznamu by už neměl být problém. Šak uvidíme... (možná)
To je důvod, proč jsem do formu přidal textbox s informací o číslu řádku.
Doufám, že s verzí 2 už ses seznámil a můžeme přistoupit k verzi 3. Pro účely zjišťování posledního řádku se vyplatí mít extra funkci, která jej spolehlivě najde i v případě, když je v tabulce zapnutý nějaký filtr - takže to tam taky najdeš.
Pro ukládání údajů z formuláře na list používám jednu rutinu, které předávám dva argumenty: číslo řádku a informaci o tom, jestli se jedná o nový záznam anebo editaci existujícího.
Všimni si jaké typy procedur jsou v kódu formuláře (událostní) a že ty volané je lepší mít v samostatném modulu.
Tak fajn. V přiloženém souboru je vyřešené načítání dat z listu do formuláře.
Kód je komentovaný, takže to určitě pochopíš.
Prvky formuláře jsem trochu přejmenoval, aby bylo zřejmé o jaký typ jde (txt... = textbox, btn...= tlačítko) a pak co nese za informaci. Čili txtID je mnohem výstižnější než Textbox4.
Jak si všimneš, u některých prvků jsem měnil vlastnosti.
Až to vstřebáš, tak další částí bude ukládání dat z formu na list
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.