Excel VBA feltételes formázás
2020-04-11T10:08:49+02:00
2020-04-12T09:14:43+02:00
2022-08-11T19:15:30+02:00
amatore
Sziasztok,

Excelben próbálok létrehozni egy "űrlapot" (nem userform). Lényege, hogy felhasználónként változik a kitöltendő adatok témaköre, gyakorisága és mérőszáma. Emiatt eltérő a sorok száma is. Ha a kitöltendő cella üresen marad vagy törtszámot visz be egész szám helyett a felhasználó, pirosra kellene, hogy változzon a cella. Makróval próbálom megoldani ezt a műveletet.

Nem tudom, hogy van-e lehetőség arra, hogy rögtön adatbevitelkor ellenőrizze a makró, hogy az adott cellába írt érték megfelel-e a cella formátumának. Ha igen, ez lenne a legjobb.
De én úgy indultam el, hogy egész egyszerűen az "Adatrögzítés" makrógombra kattintás után ellenőrizze le a bevitt adatokat cellánként, és ha nincs kitöltve, vagy törtszám lett beírva, legyen piros színű a cella. Az első adatbeviteli cella feltételes formázását makrórögzítéssel megoldottam, ami a konkrét cellára hivatkozik. Hogyan tudom ezt változóval kiváltani, ugyanis változó számú soraim vannak.

A konkrét cellára ezt kaptam makrórögzítéssel:

Range("E13").Select
Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
"=OR(E13="""",MOD(E13,1)>0)"
Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
With Selection.FormatConditions(1).Interior
.PatternColorIndex = xlAutomatic
.Color = 255
.TintAndShade = 0
End With
Selection.FormatConditions(1).StopIfTrue = False


Előre is köszönöm a segítséget.

Üdv,
Mutasd a teljes hozzászólást!
Szia!
A következő problémákat látom:
1. A név kiválasztásnál (C8 cella) szerintem elég lenne adatérvényesítést használni, hiszen a Userformon is azt töltöd be. (Adatok - érvényesítés - lista) Adatérvényesítés esetén a cellában azonnal megjelenik a konkrét név, nincs szükség további manipulációra. A változás kapcsán pedig a további módosításokat a Change eseménykezelőben tudod rendezni.
2. A Munkalapoknál ne az indexet használd hivatkozásként, hanem a neveket. Nálam pl. egyáltalán nincs 4. munkalap, így rögtön hibakereséssel kellett kezdenem. Az index ugyanis a munkalapok áthelyezése esetén megváltozik, a név viszont nem.
3. A 2020 nevű munkalapon levő Private Sub Worksheet_SelectChange(ByVal Target As Range) makró nem eseménykezelő, ilyen eseménye nincs a munkalapnak. Ezért az soha nem fog lefutni eseménynél, csak akkor, ha külön meghívod (akkor pedig már nevezhetnéd másként is).
A kijelölt cella megváltozását a SelectionChange eseménykezelő vizsgálja.
4. A Worksheet_Change eseménykezelőben rosszul vizsgálod a kiválasztott cella helyét. Az Intersect metődus az összes paraméter közös részét adja vissza. Mivel külön-külön soroltad fel a szükséges cellákat, ezért soha nem talál közös részt. Ezért látod úgy, hogy nem fut le - pedig igen.
Ahhoz, hogy az általad szükséges terület lefedését vizsgálja, a szükséges területet egyesíteni kell az UNION függvénnyel. Tehát a feltétel:
If Not Intersect(Target, Union(range(1),Range(2)...stb)) Is Nothing Then
Így már megtalálja a közös cellát, ha valóban benne van.

Üdv.
Mutasd a teljes hozzászólást!

  • Szia!
    Miért kellene feltételes formázás, ha csak a rögzítés gombra kattintás után vizsgálod a kitöltést. Akkor egyszerűen legyen piros a háttere és/vagy üzenj a felhasználónak. A háttérszínt a
    Range.Interior.Color vagy Colorindex tulajdonságával állíthatod.
    Egyébként pedig a munkalap Change eseményéhez is kötheted az ellenőrzést, akkor minden cellát külön is tudsz ellenőrizni és hibás adat esetén ismételten bekérni az adatot.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Szia,

    De a munkalap eseményénél is felmerül a kérdés, hogy hogyan adom meg a feltételes formázáshoz a változó számú sorokat. A példában konkrétan a 13. sorban vagyok, de ha a sorok száma elmegy 20-ig, hogyan kell átírni a példát?

    Range("E13").Select
    Selection.FormatConditions.Add Type:=xlExpression, Formula1:= _
    "=OR(E13="""",MOD(E13,1)>0)"
    Selection.FormatConditions(Selection.FormatConditions.Count).SetFirstPriority
    With Selection.FormatConditions(1).Interior
    .PatternColorIndex = xlAutomatic
    .Color = 255
    .TintAndShade = 0
    End With
    Selection.FormatConditions(1).StopIfTrue = False


    Köszönöm.

    Üdv,
    Mutasd a teljes hozzászólást!
  • Ugyanis soronként kell vizsgálni a gyakoriságot (havi adat esetén 12 cellát - nem egybefüggű cellatartomány - kell kitölteni a sorban, negyedéves esetén 4 cellát, stb.), illetve a mérőszámot, ami lehet egész szám, százalék, törtszám, szöveg.
    Mutasd a teljes hozzászólást!
  • Szia!
    A Change eseménynek van egy Target nevű paramétere, ami az éppen megváltoztatott cellát - mint Range objektumot - tartalmazza. Tehát azt közvetlenül tudod vizsgálni és formázni.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Köszönöm az eddigi segítséget, de ezzel még nem tudok mit kezdeni.

    Üdv,
    Mutasd a teljes hozzászólást!
  • Szia!
    Ezt írtad, amikor a kérdést feltetted:

    Nem tudom, hogy van-e lehetőség arra, hogy rögtön adatbevitelkor ellenőrizze a makró, hogy az adott cellába írt érték megfelel-e a cella formátumának.

    Erre a válasz az, hogy a munkalap Change eseménye ad erre lehetőséget. A Target paraméter megmutatja, hogy melyik cella változott. Ha tudod, hogy abban minek kellene lennie, akkor tudod ellenőrizni is. 
    Ha esetleg kicsit konkrétabban, netán mintapéldával kérdeznél, talán többet tudnánk segíteni.
    Üdv.
    Mutasd a teljes hozzászólást!
  • Szia,

    Csatoltam a Test file-t. A 2020 munkalap kódjában látható, hogy meddig jutottam.
    Azt elfelejtettem megírni, hogy a munkalap kódjában már van egy SelectChange esemény, ami azért kell, mert ha valaki az adott sorba lép, akkor meg kell jelenítenie az adott sorhoz tartozó szöveget.
    És szerintem a Worksheet_SelectChange mellett nem fut le a Worksheet_Change esemény, vagy nem tudom, mi lehet a probléma.
    Tehát a sorok száma változó, soronként más a gyakoriság és más a mérőszám. Jelenleg fehér színűek a kitöltendő cellák.
    Remélem így már érthetőbb, hogy mit szeretnék.

    Köszönöm előre is.

    Üdv,
    Mutasd a teljes hozzászólást!
    Csatolt állomány
  • Szia!
    A következő problémákat látom:
    1. A név kiválasztásnál (C8 cella) szerintem elég lenne adatérvényesítést használni, hiszen a Userformon is azt töltöd be. (Adatok - érvényesítés - lista) Adatérvényesítés esetén a cellában azonnal megjelenik a konkrét név, nincs szükség további manipulációra. A változás kapcsán pedig a további módosításokat a Change eseménykezelőben tudod rendezni.
    2. A Munkalapoknál ne az indexet használd hivatkozásként, hanem a neveket. Nálam pl. egyáltalán nincs 4. munkalap, így rögtön hibakereséssel kellett kezdenem. Az index ugyanis a munkalapok áthelyezése esetén megváltozik, a név viszont nem.
    3. A 2020 nevű munkalapon levő Private Sub Worksheet_SelectChange(ByVal Target As Range) makró nem eseménykezelő, ilyen eseménye nincs a munkalapnak. Ezért az soha nem fog lefutni eseménynél, csak akkor, ha külön meghívod (akkor pedig már nevezhetnéd másként is).
    A kijelölt cella megváltozását a SelectionChange eseménykezelő vizsgálja.
    4. A Worksheet_Change eseménykezelőben rosszul vizsgálod a kiválasztott cella helyét. Az Intersect metődus az összes paraméter közös részét adja vissza. Mivel külön-külön soroltad fel a szükséges cellákat, ezért soha nem talál közös részt. Ezért látod úgy, hogy nem fut le - pedig igen.
    Ahhoz, hogy az általad szükséges terület lefedését vizsgálja, a szükséges területet egyesíteni kell az UNION függvénnyel. Tehát a feltétel:
    If Not Intersect(Target, Union(range(1),Range(2)...stb)) Is Nothing Then
    Így már megtalálja a közös cellát, ha valóban benne van.

    Üdv.
    Mutasd a teljes hozzászólást!
  • Szia,

    Köszönöm, sikerült megoldanom.

    Üdv,
    Mutasd a teljes hozzászólást!
abcd