Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
If Range("X38") > 0 Then MsgBox "Az első érkezésnél NEGATÍV részmenetidő érték keletkezett! A piros színnel jelölt részmenetidőhöz tartozó időpont(ok) nem megfelelőek!", vbCritical, "HIBÁS IDŐPONT!"
If Range("Y38") > 0 Then MsgBox "Az első érkezésnél NEGATÍV menetidő érték keletkezett! A piros színnel jelölt menetidőhöz tartozó időpont(ok) nem megfelelőek!", vbCritical, "HIBÁS IDŐPONT!"
A fenti szövegek egy-egy sorban vannak. Azt szeretném, ha a 2. mondat ("A piros színnel" kezdődő mondat) egy újabb msgbox-ban jelenne meg (miután az előzőt leokéztam). - Ha egy sorba írom, külön msgbox-ként, akkor hibát jelez - Ha simán alá írom, akkor bár megjelenik, de a hibás cella törlésekor újra feladja a 2. msgbox-ot.
Private Sub Worksheet_Change(ByVal Target As Range) If Cells(4,3) > 0 then Msgbox ("A C5:C15 tartomány legalább egy cellája mínuszba került") If Cells(5,3) > 0 then Msgbox ("A D5:D15 tartomány legalább egy cellája mínuszba került")
End sub
Ha nincs Else ág, a feltétellel egy sorba írva a Then ágat nincs szükség End If-re.
Abba még tudnátok segíteni, hogy az msgbox szövege dinamikus legyen?
Tehát, ne a tartomány nevét írja ki (ahol a hiba), hanem, ha a J46-ban van szöveg, akkor azt. Ha azonban a J46 üres, akkor a J47-ben lévő (egyébként) fix szöveget.
Igen, a tartományokat mindenképpen külön akartam vizsgálni.
Bár tovább gondolva az előjel függvényre sincsen szükség.
a C4-be ezt írom =DARABTELI(C5:C15;"<0")
a makró meg így nézne ki
Private Sub Worksheet_Change(ByVal Target As Range) If Cells(4,3) > 0 then Msgbox ("A C5:C15 tartomány legalább egy cellája mínuszba került") End if End sub
Köszönöm Nektek a segítséget, az együttgondolkodást :-)
És mi a véleményetek arról, ha (rejtett oszlopban) az előjel függvénnyel vizsgálom a tartomány összes celláját, majd az egészből nézek egy darabtelit. Ha ennek eredménye 1, tehát van legalább egy negatív szám a vizsgált tartományban, akkor kiabálni kellene. Így a makrónak egy cellát (a darabteli eredményét) kellene vizsgálni?
Jimmy, én mindkét makrót kipróbáltam, de nem akarja az igazságot.
Próbaként egy egyszerű C5=D5-E5 függvényt tettem bele, aztán a D és E cellákba írtam olyan számokat, amik hatására a C-ben negatív szám jött ki, de semmit nem kiabált. Feltételezem a makróban lévő f8:f300 tartomány csak a lehetséges másik tartományt jelöli?
Szerintem erre a lassú de biztos (favágós) módszer az lenne, ha a vizsgált tartomány minden celláját ellenőriznénk negatív értékre:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Rng1 As Range, c As Range With ThisWorkbook.Sheets("Munka1") Set Rng1 = Union(.Range("C5:C15"), .Range("F8:F300")) For Each c In Rng1 If c < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1 lap " & c.Address & " cellája mínuszba került. " Exit Sub End If Next End With End Sub
Ha több munkalapon kell tartományokat figyelni, akkor lehet Rng2, Rng3, stb tartományokat definiálni, és mindre külön ciklus, ami végignézi őket.
Valamivel gyorsabb, és szerintem jó módszer, ha csak a vizsgált tartomány minimumát ellenőrzöm. Ha a C5:C15 számok bármelyike negatív, akkor ugyanezen számok legkisebbike is negatív. Tehát:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) Dim Rng1 As Range With ThisWorkbook.Sheets("Munka1") Set Rng1 = Union(.Range("C5:C15"), .Range("F8:F300")) If Application.WorksheetFunction.Min(Rng1) < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1!" & Rng1.Address(False, False) & _ " tartomány legalább egy cellája mínuszba került. " End If End With End Sub
Redlac eredetileg a C5:C15 tartományt akarta figyeltetni, később azt írta, hogy más helyekre is kiterjesztené. A makróddal 1 cellát lehet ellenőrizni, és nem látom, hogy lehetne ezt egy tartományra kiterjeszteni. Te biztosan tudod.
A cél végülis az, hogy az adatokat csak egyszer, egy helyre vigyük fel, és ne pedig tíz különböző táblába(adatbázis), a 10 kül. tábla mégis létezzen. Akik azt nézegetik nem kell tudniuk honnan van.:-)
Viszont ez a módszer minden és bármilyen cellamódosulásnál pampogni fog, akár van hatása C5-re, akár nincs, mindaddig, amíg a negatív értéket eredményező beírást nem módosítjuk...
Szerintem működne ez akkor, ha elhagynád a Target helyének vizsgálatát. Végül is tök mindegy, hogy melyik cellába írt be új adatot, ha attól megváltozik a figyelt cellákban a képlet értéke. A képlet értéke pedig általában akkor módosul, ha valahová új adatot írnak, tehát a változást el lehet csípni a Worksheet_Change eseménnyel.
Ha általánosabban akarjuk, akkor egyszerre figyelhetjük az összes munkalap változását:
Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If ThisWorkbook.Sheets("Munka1").Range("C5") < 0 Then MsgBox "A bevitt adat nem megfelelő, mert a Munka1 lap C5 cellája mínuszba került. " End Sub
Ezt már csak úgy lehet átverni, ha külső munkafüzetből, csatolással jön az adat, amiből C5 értéke származik.
Nem működne. Ha egy feltételes formázással színezett cella színét, vagy színkódját lekérdezed, az eredeti színt, kódot kapod.
Azt lehetne megcsinálni, hogy ha pl. a C5 képlete =E5-D5, akkor azt a cellát kellene vizsgáltatnod, amelyiket utóbb viszel be. Ha ez az E5, akkor If target.value-cells(target.row,4)<0 then msgbox ...
Az első két sor helyfoglalás az oszlop és a sor változónak, majd értékadás ezeknek. A sor legyen a változott cella sora, az oszlop pedig a változott cella oszlopa.
és akkor szerinted működne, ha feltételes formázással piros színnel jelölném, ha negatív szám jön ki a függvény eredményénél. Aztán a tartományban lévő piros szám megjelenését vizsgálom (ami ugye negatív számot jelent).
A 11292-es hsz. sajnos nem jó, mert a függvénnyel létrejött értékeket a target nem figyeli, csak ha másolod a függvényt tartalmazó cellát a C5:C15 tartományba. :(
Sajnos nem jött össze. A makród felsorolta a Fájl menü (nem eszköztár!) menüpontjait. Biztonság kedvéért, hogy jobban lássam, beírattam a neveket egy oszlopba. Még az utoljára megnyitott füzeteim nevét is megadta.
Megnéztem a linkeket. Végül arra a következtetésre jutottam, hogy az a bővítmény (?) hiányzik, vagy hibásodott meg nálam, ami a levélben küldést csatolással hajtaná végre. Próbálkoztam már az Office újabb telepítésével, hibajavításával, de nem akar sikerülni.
Azt szeretném elérni, hogy ha egy cellában lévő szám negatív lesz (függvény eredményeképpen), akkor egy üzenetpanel ugorjon ki, hogy azt nem lehet, tehát valamit elrontott.
Ezt próbáltam, de kutyafüle:
Private Sub h()
If Target.Range = "c5:c15" And Target.Value < 0 Then MsgBox ("Ez a cella negatív számot nem tartalmazhat")
End If End Sub
Valaki megtudná mondani, hogy miért? Azok a válaszok, hogy "csak", "me' buta vagy" nem érnek :-)