< návrat zpět

MS Excel


Téma: Sledovanie bunky rss

Zaslal/a 30.6.2023 22:15

Zdravím.
Mám takú vec, v A1 je povedzme nejaký identifikátor(Meno) v Bunke B1 sa menia neustále hodnoty, v Bunke C2 je hodnota, ktorá je konštantná a nemení sa - plní funkciu kritéria a cieľa. V bunke D1 by som chcel dostať čas s dátumom, kedy hodnota v bunke B1 dosiahla(hodnotu ktorá je rovná, alebo väčšia ako hodnota v B2) hodnotu podľa bunky B2. A keď už dosiahne raz túto hodnotu, tak aby sa sledovanie skončilo, pretože hodnota v bunke B1 môže zas klesnúť pod hodnotu C2 a časom zas dosiahnuť, alebo ju prekročiť. Mne ide iba o ten prvý moment, keď sa tak stane. Čiže v Bunke E1 by mohlo byť ďalšie kritérium, ktoré by spúšťalo sledovanie, čiže keby tam bola hodnota "Sledované" a začalo by tak zas sledovať kedy hodnota v Bunke A1 dosiahla hodnotu podľa hodnoty v bunke B2 a keď by sa hodnota v E1 zmazala, alebo zmenila na inú hodnotu "Nesledované", tak by sa celý proces ukončil.
Zároveň, keby bolo možné aj zvukový oznam, keď sa tak stane a neviem či excel umožňuje takú funkciu, ale nejakú notifikáciu v podobe toastu, keď som napríklad v inom hárku, niečo ako: Fero dosiahol svoj cieľ!
Ďakujem za pomoc. :-)

Zaslat odpověď >

#055149
elninoslov
Ale makrom prichádzate o Undo.
Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("B2")) Is Nothing Then
If Range("E2").Value = "Sledovanie" Then
If Range("B2").Value >= Range("C2").Value Then
Range("D2").Value = Now
Range("E2").Value = "STOP"
End If
End If
End If

If Not Intersect(Target, Range("E2")) Is Nothing Then
If Range("E2").Value = "Sledovanie" Then
If Not Range("E2").FormulaHidden Then 'Vlastnosť bunky využitá na uchovanie predchádzajúceho stavu sledovania
Range("D2").ClearContents
Range("E2").FormulaHidden = True
End If
Else
Range("E2").FormulaHidden = False
End If
End If
End Sub
Příloha: zip55149_sledovanie-bunky-a-limitu.zip (15kB, staženo 4x)
citovat
#055151
avatar
funguje to podľa predstáv :-) zatiaľ ďakujem veľmi pekne. :-)citovat
#055152
avatar
Je možné to upraviť na celé stĺpce? A2, A3, ... a bolo by to možné doplniť o funkciu, že keď sa dosiahne/prekročí cieľ nejakou hodnotou, tak aby sa vedelo akou? že by sa tá hodnota ukladala do stĺpca F. ďakujem :-)citovat
#055153
elninoslov
Oznam pomocou formulára (sám zmizne), zistí počet riadkov podľa A:A, vypíše dosiahnuté hodnoty aj limity, mená a časy. Hodnoty zapíše. Reaguje na hromadné zmeny (jednotky, menšie desiatky). Ak je treba reagovať na 100-ky až tisíce naraz, treba to prekopať na polia z prípadných zmenených Areas, a robiť rovnako zápis polí do Offset-nutých Areas. Aj tak to bude spomaľujúce. Ak sa bude jednať o kontrolu 10-ok tisíc hodnôt tak jedine na kliknutie tlačidla, lebo "za letu" to bude s požadovaným zápisom do buniek pomalé. Iné so zápisom hodnôt, časov, funkciou Štart/Stop ma nenapadá...
Příloha: zip55153_sledovanie-bunky-a-limitu.zip (30kB, staženo 2x)
citovat
#055155
avatar
super riešenie, skvelá práca a ďakujem za Váš čas. Trochu som pracoval s prvým riešením a upravil to do mojej tabuľky podľa potreby, zatiaľ len na jeden riadok. Mám však jeden problém, že keď zadávam hodnoty manuálne, tak všetko funguje správne podľa mojich predstáv, ale keď hodnotu v bunke(v tomto našom príklade (stĺpec B) v mojom kóde AI64, ktorý prikladám, získavam cez vzorec a tá hodnota sa mi aktualizuje z DDE servera, tak mi to nefunguje. Viete mi prosím poradiť riešenie?
Uvedomujem si, že keby to bolo veľa tých riadkov, ktoré by sa mali sledovať, že by to zaťažilo a bolo pomalé.
Tak jedna oblasť by bola od riadku 64:78, ďalšia 107:121, ďalšia 150:164, 193:207, 236:250, 279:293, 322:336, 365:379, 408:422, 451:465. Potrebujem, aby to bolo čo najrýchlejšie a najpresnejšie.

Private Sub Worksheet_Change(ByVal Target As Range)
If Not Intersect(Target, Range("AI64")) Is Nothing Then
If Range("X64").Value = "YES" Then
If Range("AD64") = "SELL" Then
If Range("AI64").Value >= Range("AK64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
Range("Y64").Value = Range("AV64")
End If
If Range("AI64").Value <= Range("AJ64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
End If
End If
If Range("AD64") = "BUY" Then
If Range("AI64").Value <= Range("AK64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
Range("Y64").Value = Range("AV64")
End If
If Range("AI64").Value >= Range("AJ64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
End If
End If
End If
End If

If Not Intersect(Target, Range("X64")) Is Nothing Then
If Range("X64").Value = "YES" Then
If Not Range("X64").FormulaHidden Then 'Vlastnosť bunky využitá na uchovanie predchádzajúceho stavu sledovania
Range("AT64").ClearContents
Range("AU64").ClearContents
Range("Y64").ClearContents
Range("X64").FormulaHidden = True
End If
Else
Range("X64").FormulaHidden = False
End If
End If

End Subcitovat
#055156
avatar
Zatiaľ som pomocou pokusov došiel k takému niečomu a funguje to. Možno je nejaký lepší spôsob, ktorý by bol rýchlejší a menej náročný. Nie som tak zdatný vo VBA. Samozrejme potreboval by som to aspoň na tých 10 oblastí, kde by bol vždy sledovaný len jeden riadok z každej z nich. Čiže maximálne by sa sledovalo 10 riadkov súčasne. Ďakujem za pomoc. :-)
Private Sub Worksheet_Calculate()
Dim Target As Range
Set Target = Range("AI64")
If Not Intersect(Target, Range("AI64")) Is Nothing Then
Application.EnableEvents = False
If Range("X64").Value = "YES" Then
Range("AT64").ClearContents
Range("AU64").ClearContents
Range("Y64").ClearContents
If Range("AD64") = "SELL" Then
If Range("AI64").Value >= Range("AK64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
Range("Y64").Value = Range("AV64")
End If
If Range("AI64").Value <= Range("AJ64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
End If
End If
If Range("AD64") = "BUY" Then
If Range("AI64").Value <= Range("AK64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
Range("Y64").Value = Range("AV64")
End If
If Range("AI64").Value >= Range("AJ64").Value Then
Range("AU64").Value = Range("AQ64")
Range("AT64").Value = Now
Range("X64").Value = "NO"
End If
End If
End If
End If
Application.EnableEvents = True

End Sub
citovat
#055157
elninoslov
Kurňa chlape, to nemôžete napísať rovno všetko tak ako to je, a priložiť anonymizovanú prílohu? Veď nič, čo ste písal nesedí s realitou. Bunky sú úplne iné, rozsah nie je ani bunka, ako ste spomínal, ani stĺpec ako ste neskôr tvrdil, ale samostatné oddelené oblasti. Nejde o zmenu ale o výpočet, na čo Excel pozerá úplne odlišne. Takže nejaký Target a Intersect je Vám v procedúre Calculate k ničomu. Rozlišovacie stavy nie sú "Sledované", ale nejaké "SELL", "BUY", NO". Bunky nie sú vedľa seba aby sa dal použiť zápis poľa naraz ...

Ste dnes už druhý, čo ma nakrkol ... 6

Čo s Vami ?

Prílohu !citovat
#055158
Lugr
Tý jo, takhle naštvat elnina, to jsem ještě neviděl. 8 Je to stále stejná písnička.

DÁVEJTE TY PŘÍLOHY!!!citovat

Uživatelské menu

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

Menu

On-line nástroje

Formulář Faktura

Formulář Faktura IV

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

Aktivní diskuse