Ale tušíme, len sa nám nechce vymenovávať všetko aj s príkladmi. Tu je jeden. Ďalší by mohol byť tak, že tlačítko bude menšie ako bunka, každé makro zapíše do nejakej nepodstatnej/skrytej bunky hodnotu, na základe ktorej podmienené formátovanie zvýrazní bunku pod tlačítkom. Ďlaej, ak je tlačítkami volané obdobné makro, len s iným parametrom, dá sa urobiť jedno makro, ktoré bude identifikovať na základe Application.Caller, ktoré tlačítko je stlačené - teda nie tak ako je v tomto príklade. Ale to záleží na tom, čo tie makrá robia. A sme zase tam kde pred pár dňami v inej téme Ďalšou možnosťou je použiť ActiveX tlačítka, kde je možnosť zmeny pozadia. Prípadne použiť namiesto tlačítka Shape objekt...
Priložte prílohu. Reálnu a anonymizovanú.
Čo ste nám to poslal za prílohu ???
Záležať bude aj na tom, či sa bude hľadať 2t6552233 z rôznych bunkách, alebo iba v jednej napr. susednej. FIND/NAJÍT hľadá v jednej. Ak potrebujete otestovať nejaký rozsah, či obsahuje niektorá jeho bunka 2t6552233, tak použite COUNTIF(rozsah;"*"&hľadaná hodnota&"*")>0
Opravte tú prílohu za reálnu.
Obe verzie prerobené tak, že je jedno, či je to číslo alebo textočíslo. Každopádne to musí byť prevediteľné na číslo.
Ale ja by som si to určo previedol na čísla. Na to môžu nadväzovať ďalšie problémy ako filtre (časté aj pri dátum vs. textodátum) a pod. Jednorázové prevádzanie sa robí tak, že si niekde do bunky dočasne napíšete 1, tú bunku dáte Ctrl+C, označíte textočísla, pravý klik, Prilepiť špeciálne, Hodnoty a Násobenie, bunku s 1 zmažete. Ak to je často menené, napr. nejaký import, tak priamo v importe by to malo ísť, alebo pomocným stĺpcom so vzorcami ako to máte teraz. A možnosť je samozrejme aj takýto upravený vzorec čo Vám sem teraz dávam, ktorému je to jedno :)
=INDEX(V3:V45;INDEX(SMALL(IF(V3:V45*1<>0;ROW(V3:V45)-2;FALSE);ROW(OFFSET(A1;;;SUM(--(V3:V45*1<>0)))));RANDBETWEEN(1;SUM(--(V3:V45*1<>0)))))
=INDEX(V3:V45;INDEX(SMALL(KDYŽ(V3:V45*1<>0;ŘÁDEK(V3:V45)-2;NEPRAVDA);ŘÁDEK(POSUN(A1;;;SUMA(--(V3:V45*1<>0)))));RANDBETWEEN(1;SUMA(--(V3:V45*1<>0)))))
=SMALL(IF(V3:V45*1<>0;V3:V45*1;FALSE);RANDBETWEEN(1;SUM(--(V3:V45*1<>0))))
=SMALL(KDYŽ(V3:V45*1<>0;V3:V45*1;NEPRAVDA);RANDBETWEEN(1;SUMA(--(V3:V45*1<>0))))
Makrom by to šlo. Pri otvorení/ukladaní súboru by sa definovanému zoznamu mailov poslal mail. Či už Outlookom (na každom PC by musel byť) alebo len k tomuto účelu vytvoreným mailovým účtom gmail bez Outlooku cez tzv CDO (heslo bude v makre uložené, preto použiť iba na tento účel vytvorený učet).
A Vám nevadí, že Vám Excel jasne hovorí (zelený trojuholník), že tie "0" nie sú 0? Veď to tam jasne píše, že máte tie "čísla" uložené ako text. Použite normálne čísla a ten kratší vzorec. O tom, že to musí byť číslo, som písal aj ja.
EDIT:
A u dlhšieho vzorca je problém okrem textočísel aj v tom, že neviete ako funguje, a nesprávne ste ho upravil. Tučným som zvýraznil Vaše chyby. To A1 je tam na získanie číselného radu (indexu) začínajúceho 1 a končiaceho počtom <>0, to A1 bude vždy A1 bezohľadu akú oblasť chcete skúmať. A to -2 tam musíte dať z rovnakého dôvodu, aby ste získali číselný rad podľa počtu skúmaných buniek ale tiež začínajúcim od 1. Preto ak ste na riadku V3 tak -2.
=INDEX(V3:V45;INDEX(SMALL(IF(V3:V45<>0;ROW(V3:V45)-2;FALSE);ROW(OFFSET(A1;;;COUNTIF(V3:V45;"<>"&0))));RANDBETWEEN(1;COUNTIF(V3:V45;"<>"&0))))
=INDEX(V3:V45;INDEX(SMALL(KDYŽ(V3:V45<>0;ŘÁDEK(V3:V45)-2;NEPRAVDA);ŘÁDEK(POSUN(A1;;;COUNTIF(V3:V45;"<>"&0))));RANDBETWEEN(1;COUNTIF(V3:V45;"<>"&0))))
Napr.:
Sub Vyrobit()
Dim D(), i As Long
With ThisWorkbook.Worksheets("Hárok1")
D = .Range("AD4:AD48").Value
For i = 1 To UBound(D, 1)
If D(i, 1) = 0 Then D(i, 1) = Empty
Next i
.Range("E4:E48").Value = D
End With
End Sub
Predpokladám, že formáty v tom E sú nastavené, a tie netreba kopírovať.
EDIT:
Alebo môžete použiť aj nahradenie hodnoty:
Sub Vyrobit()
With ThisWorkbook.Worksheets("Hárok1")
.Range("E4:E48").Value = .Range("AD4:AD48").Value
.Range("E4:E48").Replace What:="0", Replacement:="", LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False
End With
End Sub
Farby v DropDown-e v Exceli nie sú možné. Jedine naprogramovať makro, ktoré by pri každom označení vybraných (vopred známych) buniek zobrazilo výberovú šípku (tlačítko), a tá by otvárala malý formulár napr. s podfarbenými Label-mi. Po kliku by sa stalo čo? Na čo to má slúžiť?
Jednoduchší vzorec ma zatiaľ nenapadol, tak snáď niekto iný:
(maticový vzorec Ctrl+Shift+Enter)
=INDEX(A1:A6;INDEX(SMALL(IF(A1:A6<>0;ROW(A1:A6);FALSE);ROW(OFFSET(A1;;;COUNTIF(A1:A6;"<>"&0))));RANDBETWEEN(1;COUNTIF(A1:A6;"<>"&0))))
=INDEX(A1:A6;INDEX(SMALL(KDYŽ(A1:A6<>0;ŘÁDEK(A1:A6);NEPRAVDA);ŘÁDEK(POSUN(A1;;;COUNTIF(A1:A6;"<>"&0))));RANDBETWEEN(1;COUNTIF(A1:A6;"<>"&0))))
kratší variant, ale musia to byť čísla
=SMALL(IF(A1:A6<>0;A1:A6;FALSE);RANDBETWEEN(1;COUNTIF(A1:A6;"<>"&0)))
=SMALL(KDYŽ(A1:A6<>0;A1:A6;NEPRAVDA);RANDBETWEEN(1;COUNTIF(A1:A6;"<>"&0)))
"Kivan" napsal/a:
a pak že to nejde
A ako prebieha to vkladanie dát z iného súboru? Súbor je otvorený/zatvorený? Jedná sa o import pomocou nástroju Importu (staršia verzia alebo novšia pomocou PowerQuery)? Jedná sa o makro aké robievam ja, ktoré vloží dočasné vzorce na vytiahnutie dát zo zatvoreného súboru? Jedná sa o čisté PowerQuery do pomocného listu a následné spracovanie makrom? Alebo sa jedná napr. o CSV načítané a delené makrom do polí? So všetkým suvísí ale základná otázka, či sa jedná o jeden záznam (riadok) či množstvo záznamov. A ďalšie a ďalšie otázky...
Ak sa jedná o jeden záznam, stačí Match alebo CountIf, ak sa jedná o množstvo záznamov, tak Collection s kľúčom.
Samozrejme zase bez prílohy...
To treba urobiť rovno v tom importovacom/kopírovacom makre ktoré nemáme.
To Vážne? Toto je tá "príloha"? Popisujete X buniek, ktoré treba kontrolovať a v prílohe je 1. Z toho nie je absolútne zrejmé, ako to má fungovať, keďže ste písal, že hodnota určujúca ktoré makro sa má volať, môže byť vo viacerých bunkách rovnaká. Takže podľa tejto Vašej prílohy čo bude v M13, ak A1=1 a B1=2? V M13 bude "ano" (ako výsledok makra volaného na základe A1) alebo "ne" (ako výsledok makra volaného na základe B1)? A tie makrá, ktoré ste dal na ukážku sú jednoznačne taký druh, ako som popisoval = určite ako jedno makro (či už s parametrom, alebo nie), a nie X makier obdobne podobných.
Očakával som ako prílohu tie makrá. Reálne makrá. Reálne rozloženie buniek v liste/súbore. Jedine čo má byť nereálne (anonymizované) sú dáta samotné. Teda nenapíšete "Ján Novák" ale "První Jméno", nenapíšete "plat 50000" ale "plat 12345". Všetko ostatné má ostať. Podľa Vás nie, ale podľa mňa na tom rozhodne záleží. Napr. či identifikovať číslo makra Indexom alebo Vlookupom. Nebudem popisovať všetky možné varianty riešenia problému ich výhody, podmienky, riziká, logiku apod. Napr. ak sa jedná o zápis nejakej hodnoty do inej bunky na základe zdrojovej bunky, pričom týchto buniek je X a rovnako je X výsledných, a zároveň má každá výsledná bunka Y svojich možných výsledkov, potom nie je potreba makro, stačí vzorec. Vy dodajte čo máte, a my skúsime nájsť riešenie.
Moje nervy ...
Prečo je vždy problém priložiť reálnu prílohu a namiesto toho zahmlievať a neodpovedať na upresňujúce otázky? Napr. ste neodpovedal, či sú tie makrá rovnakého typu (ako ste teraz uviedol v "prílohe").
no ale ono mi to nejde, mám office 2021
nahrál jsem jednoduchý sešit
Čo??? 100 makier??? Viď koniec môjho predošlého komentu - príloha aspoň s pár makrami. To máte fakt 100 diametrálne typovo odlišných makier, ktoré sa nedajú parametrizovať, aby ich nebolo toľko?
Veď som to urobil tak, aby ste si oblasť mohol zvoliť.
Toto:
Range("A1:A5")
nahraďte požadovanou oblasťou (inak v príklade máte 2x A2, to má byť asi A1,A2,A3):
Range("A1:A3,B1:B5,C1:C2")
alebo
Range("A1,A2,A3,B1,B2,B3,B4,B5,C1,C2")
A podľa mňa nie je jedno čo robia tie makrá. Teda nemusí to tak byť. Teraz keď zmením A2 na 2, vykoná sa Makro2 (nakopíruje nejaké data), C1 zmením na 2, a znova Makro2 vykoná to tisté (nakopíruje tie isté data). Nie je to divné ??? Preto hovorím o parametrizácii makra.
Kurňa chlapi, to je dnes dohadovanie v oboch témach o prílohu. Ach jaj...
To nebude žiadny problém pre viac sledovaných buniek. Len mi prezraďte čo tie makrá robia. Ak robia podobnú vec, tak stačí jedno, ale posielať sa bude do neho parameter. Myslím to takto nejako:
Makro1 má skryť stĺpce A:C, ostatné odokryť
Makro2 má skryť stĺpce D:F, ostatné odokryť
Makro3 má skryť stĺpce G:I, ostatné odokryť
nebudem robiť 3 rovnaké makrá, ale iba jedno, ktoré bude mať vstupný parameter (názvy stĺpcov), teda ho zavolám napr.
Moje_parametrizovane_makro 2
a v makre bude nadefinované, že typ 2 znamená "D:F" napr. cez pole Array().
Alebo ho zavolám
Moje_parametrizovane_makro "D:F"
a obdobne.
Proste by bolo dobré uviesť, čo presne tie makrá robia, ak sú obdobné. Ak sú typovo diametrálne odlišné, tak nič, a urobím to klasicky.
EDIT: Tak všeobecne, napr. takto:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Zmena As Range, Are As Range, Bunka As Range
Set Zmena = Intersect(Target, Range("A1:A5"))
If Not Zmena Is Nothing Then
For Each Are In Zmena.Areas
For Each Bunka In Are.Cells
Select Case Bunka.Value
Case 1: Makro1
Case 2: Makro2
Case 3: Makro3
Case 4: Makro4
Case 5: Makro5
End Select
Next Bunka
Next Are
End If
End Sub
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.