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.
Ez akkor működik rendben, ha a vevők A oszlopában megtalálja a vevőkódot, tehát gondoskodnod kell arról, hogy az már ott legyen, vagy a hibakezelést kell megoldanod.
A sora hibát fog tartalmazni, ha nem talált adatot, tehát a következő feltételt kell beiktatnod:
if not iserror(sora) then a sora= sor után.
A sora változót pedig variantnak kell definiálnod.
Más: a cella meghatározás vagy Range("C5"), vagy cells(5,"C") illetve cells(5,3) formulával történhet. A cells("C5") hibát eredményez, ezért javítottam.
Amit kimásoltam az egy számlázó, raktárkezelő könyvelő stb "program" része lenne. Makrókkal vezérelve.
A folyamatot szeretném egyszerűsíteni azzal, hogy csak egy vevő kódot adok meg (és nem kell név város utca stb, mert az adatbázisból kikeresi) és a többit a makró elvégzi. Kitölti az űrlapot, számláz és nyomtat és stb.
Szóval makró és nem függvény.
Ha valaki ezek figyelembe vételével tudna segíteni.
Van egy Workbook 3 oldallal. 1oldal aminek a neve "Termékek", 2oldal "vevők", 3oldal "SZÁLLÍTÓ"
Azt szeretném, hogy ha a "termékek" oldal C1-es cellájába beírom a vevő kódot és lefuttatom a makrót akkor a "vevők" oldalon keresse ki a "termékek" oldalon megadott C1-es mezőbe beírt vevő kódot (ami az "A" OSZLOPBAN VAN) és a mellette lévő adatokat másolja be a "SZÁLLÍTÓ" oldalon lévő C5, C6, C7, C8 cellába.
If ActiveSheet.Cells(i, "A") = Vevő Then név = ActiveSheet.Cells(i, "B") város = ActiveSheet.Cells(i, "C") utca = ActiveSheet.Cells(i, "D") irsz = ActiveSheet.Cells(i, "E")
Sheets("SZÁLLÍTÓ").Cells("C5") = név Sheets("SZÁLLÍTÓ").Cells("C6") = város Sheets("SZÁLLÍTÓ").Cells("C7") = utca Sheets("SZÁLLÍTÓ").Cells("C8") = irsz End If
Set Rng = Sheets("Adatbázis").UsedRange.SpecialCells(xlCellTypeVisible) For Each terulet In Rng.Areas For Each cl In terulet.Columns(1).Cells If cl.Row > 3 Then
Select Case cl.Offset(0, 1).Value Case 10 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbRed Case 20 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbBlue Case 30 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbGreen End Select
Most így néz ki, de valami még mindig nem jó, mert 'object required' hibát kapok:
If Target.Address = Worksheet.Selectionhange Then Select Case cl.Offset(0, 1).Value Case 10 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbRed Case 20 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbBlue Case 30 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbGreen End Select End If
Lefutottam pár tesztet, és úgy néz ki, hogy ez nem pontosan az a kód, amire gondoltam.
Amit megadtál arra jó, hogy szűkítés után a megmaradt sorokhoz tartozó összekötőket színezi. Viszont ezzel csak egy féle színezést tudok egyszerre megjeleníteni, nekem pedig az összesre van szükségem (az eredeti fáljban, lesz 10 féle lehetőség, ahhoz rendelt színkódokkal).
Valami ilyesmire gondoltam (a feltöltöltött fáljra levezetve):
If Target.Address = Sheets("Adatbázis").Range("$C$4:$C$9") Then Select Case Target.Value Case Is = 10 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbRed Case Is = 20 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbBlue Case Is = 30 Sheets("Térkép").Shapes(cl.Value).Line.ForeColor.RGB = vbGreen End Select End If
Természetesen nem történik semmi, nyilván rosszul írtam valamit a kódban (makróban sajnos abszolút kezdő vagyok), de logikailag így tudnám levezetni a dolgokat.
Tehát:
- keressen az adatbázis megadott tartományában értékeket
- színezze az adatbázisra vonatkozó összekötőt a térképen
Egy raktárkezelő rendszerrel bíbelődöm egy ideje és a folyamatokat próbálom egyszerűsíteni.
A kérdés a következő:
Áru kiírásakor eddig a vevőt egy excel mappában összegyűjtött vevő listából választotta ki a program úgy, hogy kiírás előtt kijelöltem a vevőt és az adott kijelölést a makró egyszerűen kimásolta.
Amin módosítani szeretnék, hogy a központi rendszerben (ami szintén excel) adom meg a vevő KÓDOT (egy számsort) és ez alapján keresse meg a vevőt és ez alapján amikor kiállítom makróval a szállítót akkor ott jelenjen meg a vevő neve címe stb.
Addig a dolog teljesen jól megy, hogy F.Keres függvénnyel megkeresi nekem a vevőt és a központ rendszerben meg is jelenik a név cím stb.
A gond ott jelentkezik, hogy amikor a makrót lefuttatom akkor a szállító kiállításakor a vevő neve címe stb helyére HIÁNYZIK#-ot ír ki.
Tömören a kérdés: hogyan módosítsam a makrót, hogy a vevő adatait másolja át a központ rendszerből és ne az f.keres függvényt próbálja értelmezni?
Az első példádban amikor szűrsz az adatokra, akkor a vonal nevét használod úgy látom. Ez visszafelé is működik. Az adatbázisban ott a vonal neve, azt használd a kijelölésére.
A szűrés része az adatbázisban tiszta, a színezés is a térképen. Ott akadtam el, hogy nem tudom, hogyan kapcsoljam össze a kettőt, hogy a szűrt vonalakról elnevezett összekötőket színezze.
Kávézgass és gondolkodj nyugodtan. Én pedig megnézek egy filmet:)
Mindenesetra a nevével tudsz hivatkozni az összekötőre, mint objektumra és a tulajdonságaira. (pl. activesheet.shapes("Név").line.forecolor=vbblack - feketére állítja az adott shape vonalait).
Leszűröd az adatok munkalapon a kívánt adatokkal rendelkező összekötőket.
Végigmész a név oszlopon és a látható névnek megfelelő összekötő vonal vonalát (lineformat.color) beállítod a kívánt szinre.
(a celláról úgy tudod megállapítani, hogy range("A1") vagy cells(1,1).entirerow.hidden true akkor nem látható, ha false akkor látható).
Visszafelé úgy emlékszem, az összes összekötőt egy lépésben visszaállíthatod az alapszínre, ha nem a szűrés megszüntetése után végigmész ugyanúgy a szinbeállításon mint fent és visszaállítod az alapszint.
Ha a hiv_szöveg másik munkafüzetre hivatkozik (külső hivatkozás), a másik munkafüzetnek megnyitottnak kell lennie. Ha a forrásmunkafüzet nem megnyitott, az INDIREKT függvény a #HIV! hibaértéket adja eredményül.
Valószínűleg ez a baja.
A második verziód az maga egy közvetlen hivatkozás az adott adatra és az működik akkor is, ha a forrás munkafüzet nincs megnyitva.
Próbáld a hivatkozhást összerakni az indirekt használata nélkül.
Makrókkal kapcsolatos kérdésem lenne, illetve kíváncsi lennék, hogy az alábbi dolog megoldható-e.
Van nekem egy két munkafüzetből álló excel fájlom. Az első munkafüzet egy vaktérkép rajzolt pontokkal és azokat összekötő vonalakkal. A második munkafüzet a vonalak adatait tartalmazó adatbázis. Az adatbázis első oszlopa tartalmazza a vonalak neveit, a további oszlopokban meg a vonalakhoz tartozó adatok vannak, szűrhető formában.
Odáig már eljutottam, hogy csináltam egy 'clickline' makrót, vagyis, ha a térképen egy adott összekötőre kattintok, az adatbázis munkalapra vált és megjeleníti a vonalra vonatkozó adatokat:
Most egy olyan makrót szeretnék csinálni, hogy az adatok alapján különféle színekkel jelölje az térképen lévő összekötőket. Például: a D "sebesség" oszlopban szűrjön a 80-nál kisebb értékekre, és ezen vonalakhoz tartozó összekötőket a vaktérképen színezze kis vörösre. És természetesen kellene egy "visszaállító" makró is, ami visszaállít mindent az alap színezésre.