Hirdetés
- sziku69: Fűzzük össze a szavakat :)
- Luck Dragon: Asszociációs játék. :)
- btz: Internet fejlesztés országosan!
- Hieronymus: Az igaz barátság kezdete
- Lalikiraly: Mercis kalandok - Huszonkilencedik rész
- sziku69: Szólánc.
- D1Rect: Nagy "hülyétkapokazapróktól" topik
- ricsi99: 6. Genes alaplap tündöklése kontra MS/Zintel korlátozásai
- f(x)=exp(x): A laposföld elmebaj: Vissza a jövőbe!
- Luck Dragon: MárkaLánc
-
LOGOUT
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
Fferi50
Topikgazda
Szia!
Az Initialize csak egyszer fut le, akkor amikor betöltődik a form.
Az Activate mindig, amikor megjeleníted.Elképzelhető, hogy mást kell csinálnia az első megjelenéskor, mint a következőknél, ahhoz, hogy jól működjön.
Szerintem most az inicializálást el lehet hagyni. (De próba és már meg is tudod....)Üdv.
-
Fferi50
Topikgazda
Szia!
Tedd a kódot a Userform Activate eseménybe (is).
Egyébként lehetne rövidebben:
Private Sub togbutTranslate_Click()
Range("b_forditocellak").EntireColumn.Hidden = Not Range("b_forditocellak").EntireColumn.Hidden
End Sub
Private Sub UserForm_Activate()
Me.togbutTranslate.Value =Not Range("b_forditocellak").EntireColumn.Hidden
Me.labVersion.Caption = "Jegyzőkönyv verziója: " & Worksheets("MAGYAR").Range("N2").Value
End SubÜdv.
-
Fferi50
Topikgazda
válasz
snorbi82
#23970
üzenetére
Szia!
Itt ugyan a 25. sorban van Minta Janika, de sebaj, mindegy is melyik sorban van, azt majd megadod.
Nagy vonalakban a javaslatom:
Indulsz a meglevő, beolvasott csv adatokkal.
A változó deklarációkat rád bízom...set adatok=activesheet
utsor=cells(1000,1).end(xlup).row 'megkeressük az utolsó sort
For ugyfsor=18 to utsor ' ettőll eddig kell a ciklusnak menni
set ujws=workbooks.add.sheets(1) 'létrehozza az új munkafüzetet és aktívvá teszi
range(adatok.cells(ugyfsor,"J"),adatok.cells(ugyfsor,"Z").copy range("J18")
range(adatok.cells(ugyfsor,"AA"),adatok.cells(ugyfsor,"AB").copy range("J19")
range(adatok.cells(ugyfsor,"AC"),adatok.cells(ugyfsor,"AD").copy range("J20")
' és így tovább..... ha az első oszlopnál akarod kezdeni, akkor range("A18") a "J18" helyett stb.
' ha végig értél az ügyfélen
ujws.parent save as filename:=fájlnév ' (amit természetesen neked kell megadni)
ujws.parent close false
next 'és megy vissza az elejére a ciklusRemélem, tudsz belőle valamit használni.
Üdv.
-
Fferi50
Topikgazda
válasz
littleNorbi
#23900
üzenetére
Szia!
Makrókban erősen ajánlott az angol függvényneveket használni (de nem kizárt, mert a formulalocal paraméter a helyi nevekkel működik, csak nem hordozható).
A tisztánlátás kedvéért, ha jól lefordítod angolra, akkor nem lehet NAME hiba! De ha tudjuk, hogy angol az exceled, akkor az angol függvénynevet kapod a munkalapra beírandó képletekhez is, nem kell fordítani.
Üdv.
-
Fferi50
Topikgazda
válasz
littleNorbi
#23897
üzenetére
Szia!
Annyit azért elárulhattál volna, hogy angol nyelvű excelt használsz.....
(Mint az a következő hozzászólásodból ki is derül.)Üdv.
-
Fferi50
Topikgazda
válasz
Dr. Romano
#23886
üzenetére
Szia!
Az alábbi feltételes formázást javaslom:
A rendszámok a B2:C29 mezőben vannak.
Formázás képlettel,
a B2:B29 cellákra a következő a képlet:=ÉS(DARABTELI($B$2:$B$29;$B2)>0;DARABTELI($C$2:$C$29;$B2)>0)
a C2:C29 cellákra pedig a következő: =ÉS(DARABTELI($C$2:$C$29;$C2)>0;DARABTELI($B$2:$B$29;$C2)>0)Azért kell az abszolút ($-os) képlet a tartomány meghatározásához, hogy ne "csússzon ki" a tartományból a számolás.
Másrészt, azért kell különböző képlet a két oszlopra, mert nem egymás mellett is lehetnek az azonos rendszámok, tehát az első képlet "próbáját" is meg kell csinálni a második oszlopra.Üdv.
-
Fferi50
Topikgazda
Szia!
A dir() parancs korlátok között alkalmas arra is, hogy megkeresd vele az almappákat.
neve=dir("*.",vbdirectory) azokat a fájlneveket hozza, amelyek könyvtárak, vagy nincs kiterjesztésük.
Az első két ilyen elvileg a . és .. könyvtár, ami minden mappában benne van. (Könyvtár=mappa az én értelmezésemben most, ne zavarjon.)
Ezután folyamatos neve=dir() parancsokkal megkaphatod a többi nevet.
Ez lényegében ugyanaz, mint amikor a fájlokat nézed végig.
Mivel sajnos nem egyértelmű, hogy almappa-e amit hoz, annak is meg kell nézni hasonló módon az "almappáját", ha van benne "." könyvtár, akkor az is almappa.Most sajnos nincs elég időm arra, hogy pontos makrót írjak rá, de ezen elvek szerint próbáld végig.
Van még a filesystemobject objektum, amellyel szintén meg lehet találni a fájlokat.
Ezt is érdemes lenne végignézni.Üdv.
-
Fferi50
Topikgazda
Szia!
Nem egészen értem a kérdést. Ha a mappákban és almappákban levő fájlokat fel tudod dolgozni, akkor tudod a nevüket is.
A workbook.fullname megmondja a teljes (elérési úttal kiegészített) nevet is.
Tehát az éppen feldolgozott fájlodnak megnézed a fullname tulajdonságát és azt hozzáteszed infoként a rekordokhoz.Üdv.
-
Fferi50
Topikgazda
válasz
nebulo0128
#23792
üzenetére
Szia!
Most egy olyan dodonai választ fogsz kapni, hogy "az excel sokmindenre képes, de sokmindenre nem".
Alapjában véve táblázatkezelőnek "indult", de mára már "adatbázis kezelő" is nyomokban.Ahhoz amit szeretnél, szerintem kell egy olyan makró, amelyik a cella beírása után lefuttatja a cella értékének megfelelő lekérdezést és az eredményt beírja a cella melletti tartományba. Vagyis minden cellaértékre külön-külön kell lefutnia a lekérdezésnek. Viszont ez a lekérdezés (querytable) lehet egy konkrét helyen (akár rejtett munkalapon) és onnan másolódik be az adott cella mellé.
Vagyis a lekérdezés tábla értéke mindig változik az aktuális cella értékének megfelelően, viszont az egyszer már a cella mellé másolt értékek nem változnak.Pl. querytable helye munka2!A1:X2 egy sor fejléc egy sor adat
Munka1.A1 cellájába beírod "valami", a worksheet_change esemény erre lefuttatja a lekérdezést az A1 ez az eseménykezelőben Target nevű objektumként található - értékével, majd a Munka2!A2:X2 értéket bemásolja a Munka1. B1 cellájától kezdődően.
Ezután
Munka1 A2 cellájába beírod "valami2", a worksheet_change esemény megcsinálja a fentieket a Target.value értékkel -azaz az A2-ben levő valami2 -vel majd Munka2!A2:X2 értékekekt bemásolja a Munka1.B2 cellájától kezdődően (Munka1.B2 cella = Target.Offset(0,1) az eseménykezelőben.
És így tovább...."Csak" a lekérdezést és az eseménykezelőt kell jól megírni........ Nyilván ellenőrizni kell, hogy valóban olyan helyre írtak be értéket, ahova a cikkszám való és valóban létező cikkszámot írtak be.
Remélem, tudod hasznosítani amit írtam, ha gondolod privi is jöhet.
Üdv.
-
Fferi50
Topikgazda
válasz
nebulo0128
#23783
üzenetére
Szia!
Még az előző hozzászólásomhoz annyit:
Ha a feltételt a cellából veszi, akkor csak "WHERE (f_orszag like '" & Munka1!A1 & "')"
Amit az előbb írtam, a makrós megoldásra jó.
Üdv.
-
Fferi50
Topikgazda
válasz
nebulo0128
#23783
üzenetére
Szia!
Szerintem próbáld így:
WHERE " (f_orszag like ' & sheets("Munka1").range('A1").value & "')"
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23738
üzenetére
Szia!
Félreértettél, nem azt írtam, hogy nincs hibakezelés a makródban - természetesen láttam, hogy ott van az on error goto tovabb és a tovabb cimke - , sőt, még azt sem írtam, hogy nem jó a ws.match, hanem azt, hogy app.match esetén nem kell külön hibakezelést beépíteni a makróba.
Üdv.
Idézet a 23730-ból:
"A worksheetfunction.match helyett célszerűbb az application.match függvényt alkalmazni, (ezt én is egy másik topicban tanultam), mivel így más módon kell a hibakezeléssel foglalkozni." -
Fferi50
Topikgazda
válasz
Snoop-y
#23732
üzenetére
Szia!
Ha nem írod, hogy milyen nyelvű és verziójú excel verziót használsz, akkor bizony ilyen előfordulhat. Mivel a fórumon általában magyar nyelvű excellel találkozunk, ezért a magyar nyelvű függvényeket szoktuk megadni (kivéve makró).
De tudjuk ám az angol nevüket is....Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23724
üzenetére
Szia!
Néhány apró észrevétel:
" Cells(sor + 1, oszlop).Select
usor = Selection.End(xlDown).Row
"A select teljesen felesleges, egyszerűen usor=cells(sor+1,oszlop).end(xldown).row elég.
A worksheetfunction.match helyett célszerűbb az application.match függvényt alkalmazni, (ezt én is egy másik topicban tanultam), mivel így más módon kell a hibakezeléssel foglalkozni.
A ws.match hibát generál, ha nem találja a keresett értéket, az app.match hibaértékkel tér vissza, amit változóban vagy függvényben is "elkaphatsz", akár az iserror, akár az iferror függvény működik. Tehát ebben az esetben nem kell az on error goto vagy on error resume next sor és a hozzá kapcsolódó dolgok.Ha iserrort használsz, akkor "csak" arra kell figyelned, hogy a változó, amibe kéred a match eredményét, variantnak legyen definiálva - mivel értéke lehet szám és lehet hibaérték is. Iferrornál nem kerül a változóba hiba, tehát ott jó a double is.
Üdv.
-
Fferi50
Topikgazda
válasz
slashing
#23726
üzenetére
Szia!
Azért javaslom, nézd meg ezt is. Egyetlen követelmény, hogy a másolandó adatok az első oszlopban kövessék egymást - úgy ahogyan a képeken is van.
Sub masolo()
Dim mlap1 As Worksheet, masolando As Range, mlap2 As Worksheet, hovasor As Double, hovaoszlop As Double
Set mlap1 = Workbooks("Munkafüzet3").Sheets("Munka1")
Set mlap2 = Workbooks("Munkafüzet4").Sheets("Munka1")
Set terulet = mlap2.UsedRange
hovasor = terulet.Rows.Count
If terulet.Cells(1, hovasor) = "" Then
Do While True
If terulet(1, hovasor).End(xlToRight).Column < terulet.Columns.Count Then Exit Do
hovasor = hovasor - 1
Loop
End If
hovasor = hovasor + 1
Set terulet = mlap1.Range("A1").CurrentRegion
Do While True
For oszlop = 1 To terulet.Columns.Count
hovaoszlop = Application.IfError(Application.Match(terulet.Cells(1, oszlop), mlap2.Rows("1:1"), 0), 0)
If hovaoszlop <> 0 Then
Intersect(terulet, terulet.Offset(1, 0)).Columns(oszlop).Copy mlap2.Cells(hovasor, hovaoszlop)
End If
Next
hovasor = hovasor + terulet.Rows.Count - 1
Set terulet = terulet.Range("A1").End(xlDown).End(xlDown).CurrentRegion
If Intersect(mlap1.UsedRange, terulet) Is Nothing Then Exit Do
Loop
MsgBox "A másolás megtörtént!", vbInformation, "Másolás"
End SubÜdv.
-
Fferi50
Topikgazda
válasz
slashing
#23720
üzenetére
Szia!
Most ellenőriztem, sajnos a speciális szűrés nem megy, mert ha nincs olyan fejléc a szűrendő mezőben, akkor hibát dob (bár nem egészen értem a logikáját, hogy miért, de ez van, ezt kell elfogadni.)
Másik ötlet:
Képlet szinten: Hol.van függvénnyel meghatároznám, hogy az adott fejléc hanyadik oszlopban van a másik táblában és abba az oszlopba kell tenni az adatot. (Nyilván ezt le lehet makróval rendezni (match függvény)).
Tehát: kb.így nézne ki
set mlap1=workbooks("Munkafüzet3").sheets("Munka1")
set mlap2=workbooks("Munkafüzet4").sheets("Munka1")
itt kezdheted az oszlopok ciklusát
oszlop=application.match(mlap1.range("A1").value;mlap2.rows('"1:1"),0)
if not iserror(oszlop) then ' ez csak azért kell, ha mégsem lenne olyan fejléc a másik munkalapon
yy=mlap.cells(40000,oszlop).end(xlup).row+1
for xx=2 to mlap1.range("A2").end(xldown).row
mlap2.cells(yy,oszlop).value=mlap1.cells(yy,"A").value
yy=yy+1
next
else
msgbox "Nincs ilyen fejléc: " & mlap1.range("A1").value
endif
next oszlopokA makró csak szemléltető, nem feltétlenül hibátlan.
Ezt végigcsinálod minden oszlopon, és minden kis táblán.
Ha deklarálod a változókat, az oszlop mindenképpen variant legyen, mert annak értéke hiba is lehet, mint látod.Remélem érthető és tudod használni.
Üdv.
-
Fferi50
Topikgazda
válasz
slashing
#23716
üzenetére
Szia!
Ha jól értem, akkor a fejlécek különbözőek, csak más-más sorrendben vannak.
Ebben az esetben én a következőt javaslom:
Csinálj egy "átmeneti" táblát(munkalapot), ahová a fejléceket a második táblában levő sorrendbe teszed be. (Praktikusan beillesztesz egy munkalapot és ide bemásolod a második tábla első sorát).Ezután az első tábládra csinálsz egy "advanced filtert", ahol a szűrendő tartomány az első tábla usedrange, a szűrőfeltétel az átmeneti tábla első sora és új helyre másolás helyének kijelölöd az átmeneti tábla első sorát.
Végrehajtod az irányított/speciális szűrést - ekkor az átmeneti tábládban már ugyanolyan sorrendben lesznek az oszlopok, mint a második táblában. Innen már csak egy sima copy kell és az átmeneti tábla törlése.DE még egyszerűbb szerintem a következő:
Szintén advanced filter, a következők szerint:
Szűrendő az első táblád
Feltétel: a második táblád fejléc sora (csak az első sor!)
Másolás helye: a második táblád vége!
Új helyre másolással a szűrés végrehajtása.
Az tábla közben (az eredeti második tábla utolsó sora után) keletkező "álfejléc" sor törlése. Nyilván ezt akkor tudod megtenni, ha megjegyezted, melyik sort jelölted ki másolási célnak.Talán bonyolultnak tűnik, de hidd el egyszerűbb megcsinálni, mint leírni volt.
Én rögtön a második verzióval kezdeném.Üdv.
-
Fferi50
Topikgazda
Szia!
Egy oszlopot csinálj a városnevekből irányított szűrővel, csak az egyedi adatokra szűrve, másolás másik helyre. Utána az első cella mellé beírod a darabteli képletet és végighúzod az oszlopon.(A darabteli képletben $E$2:$E$4000 legyen a tartomány!)
Utána a darabtelis oszlopot átalakítod értékké. (másolás, irányított beillesztés - értéket).
Majd a két oszlopot rendezed a második oszlopra kívánalmaid szerint.Üdv.
-
Fferi50
Topikgazda
válasz
tgumis
#23693
üzenetére
Szia!
Természetesen megy 2003-as excelen is.
A fejlécnek a szűrni kivánt adatok (nálad oszlop) első cellájának kell lennie (azért fejléc), nem lehet máshol.
A feltételt teheted máshová is, akkor annak a cellának a címét kell beirni a criterirange paraméter után, az lehet akár a cél cella is. DE: a szűrendő adatok fejlécének meg kell egyeznie a kritériumcellák fejlécével.
Nézd meg lsz. a magyar help-et az excel irányított szűrőre.Üdv.
-
Fferi50
Topikgazda
Szia!
A makróban is használhatod és nagyon jól működik a szűrés.
Másrészt viszont kereshetsz a range.find metódussal, nézd meg a példát a VBA helpben.
Használhatod match munkalapfüggvényt makróban is, ami a keresett érték helyét adja meg az adott sorban, vagy oszlopban.Ha egy rövid mintát felteszel, akkor még többet tudunk segíteni.
Üdv.
-
Fferi50
Topikgazda
válasz
tgumis
#23669
üzenetére
Szia!
Az advanced filternél FONTOS: a szűrni kívánt oszlop első cellája legyen fejléc!!!. Ezért viszi be neked a legelső értéket 2x, mivel azt tekinti fejlécnek. (Anno a fejléc szükségességét jeleztem a hsz-ban.)
Tehát Te is tekintsd a D1 cella értékét "fejlécnek". Ha ezzel együtt tudsz élni, akkor nem kell csinálnod semmit....(bár arra figyelni kell, ha csak egy olyan adat van, mint a fejléc, akkor viszont nem lesz 2x az értéke.)Üdv.
-
Fferi50
Topikgazda
válasz
Mr.Scofield
#23663
üzenetére
Szia!
Egyszerű: azért, mert torlo makródban cellánként törölsz és alapesetben ez azzal jár együtt,hogy a törölt cella helyére becsúszik a következő cella, jelen esetben az A helyére a B, a B helyére a C, de ugye Te utána az A-cellát már nem törlöd mégegyszer, csak a B-t és ilyenmódon a C törlése már teljesen felesleges is, mert abban már régen nincs is adat. (Próbáld ki manuális törléssel, hogy lásd, miről is beszélek.)
Megoldás: töröld egyben a 3 cellát, vagy töröld 3 x az A oszlopban levő cellát.
Egyben törlés: Sheets("Adatok").Range(Sheets("adatok").Cells(sorszam, "A"), Sheets("adatok").Cells(sorszam, "C")).DeleteDe még jobb szerintem, ha csak a tartalmat törlöd: cells(sorszam,"A").clearcontents, de ezt is csinálhatod egyszerre mindhárom cellán.
Üdv.
-
Fferi50
Topikgazda
válasz
mr.nagy
#23660
üzenetére
Szia!
Elvileg két lehetőséged is van erre.
Az egyik, hogy amikor végigmész a sorokon, akkor megnézed, hogy az éppen látható-e:
cells(i,col).entirerow.hidden = true akkor a sor el van rejtve, ellenkező esetben látható. Nyilván a nem látható sorokat nem kell beszámolni a nyomtatásnál.A másik a specialcells metódussal kiválasztod a látható sorokat és azon mész végig, de itt vigyázni kell, mert nem lesz összefüggő a területed, tehát minden területet figyelembe kell venned:
set lathato=activesheet.usedrange.specialcells(xlcelltypevisible)
for each terulet in lathato.areas
for each sor in terulet.rows
'ide írod a kódot
next
nextNyilván az oldaltörési kritériumot figyelned kell.
Üdv.
-
Fferi50
Topikgazda
válasz
tgumis
#23657
üzenetére
Szia!
Excel 2007- ben adatok speciális szűrő, Excel 2003-ban adatok, irányított szűrő (makróban advancedfilter metódus.
Ha a c1 cellába tettél egy fejlécet, akkor az irányított/speciális szűrő párbeszéd paneljében csak azt kell beállítanod, hogy C1:C700 az adattartomány, C1 a szűrőtartomány, helyezze át máshova, ide beírod a D1-t, és bejelölöd a csak az egyedi értékeket.Makróval:
range("C1:C700").advancedfilter action:=xlfiltercopy, criteriarange:=range("C1"),unique:=true,copytorange:=range("D1")Ennyi az egész.
Üdv.
-
Fferi50
Topikgazda
válasz
kriszwells
#23654
üzenetére
Szia!
A fájl mentésekor lehet beállítani. A mentés másként opciót válaszd a fájl menüből. A párbeszédpanel ha jól emlékszem alul van egy eszközök, arra rákattintva egy beállítások opció, ha ezt kinyitod, akkor ott vannak a védelmi opciók: jelszó kérés betekintéshez, módosításhoz.
Oda beírod a jelszót, megismétled és elmented a fájlt ugyanazon a néven - megkérdezi, hogy kicserélje-e, erre azt mondod, hog igen - vagy adsz egy másik fájlnevet.Üdv.
-
Fferi50
Topikgazda
válasz
Mr.Scofield
#23641
üzenetére
Szia!
Akkor ez így mégis makró lesz a Userformhoz. és a törlést is meg kell valósítanod.
Üdv.
-
Fferi50
Topikgazda
válasz
Mr.Scofield
#23637
üzenetére
Szia!
Még egy lehetőség makró nélkül:
A második munkalapnak azt a celláját, ahová a nevet szeretnéd látni, kijelölöd, majd az Adatok- érvényesítés menüpont alatt az érvényesítés legyen lista, a forrása pedig az első munkalap név oszlopának értékes cellái. (még jobb, ha ezt a cellatartományt elnevezed és csak a nevet írod be).
A két másik adatot tartalmazó cellát fkeres függvénnyel tudod kitölteni.
Ennek is az a hátránya, hogy magától nem fordul vissza. Viszont a listát akár egészében is láthatod a kiválasztás során.Üdv.
-
Fferi50
Topikgazda
válasz
Mr.Scofield
#23637
üzenetére
Szia!
A formot már megvan? Akkor tegyél fel legalább egy képet róla, hogy lehessen látni, mi van benne.
A makró elvi vázlata:
a rekordokat számolja egy változó
amikor megjeleníted a userformot (activate exemény), a rekordszámláló változó legyen egy, utána meghívsz egy olyan eljárást amelyben kitöltöd az első szövegmezőt az A oszlop rekordszámlálónak megfelelő sorú cellája értékéve, a másodikat a B oszlop ugyanazon cellája értékéve, a harmadikat a C oszlop ugyanazon cella értékével (rekordbetöltő).
amikor a következő gombot megnyomják (gomb_click esemény) megnézed, hogy a rekordszámlálód elérte-e a huszat. Ha igen, egyre állítod, ha nem növeled eggyel. utána meghívod a rekordbetöltő eljárást.
amikor az előző gombot megnyomják (gomb_click esemény) megnézed, hogy a rekordszámláló érte egy-e, ha igen, húszra állítod, ha nem, akkor csökkented eggyel. utána meghívod a rekordbetöltő eljárást.A rekordsorszámot megadhatod egy publikus változóban, akkor minden eljárás használhatja, amelyik a form kódlapján van.
Üdv.
-
Fferi50
Topikgazda
válasz
Mr.Scofield
#23635
üzenetére
Szia!
A második oldalra tegyél fel egy userformot a megfelelő vezérlőkkel (cimkék, parancsgombok, spinbutton) és írj hozzá megfelelő megjelenítő makrót.
Üdv.
-
Fferi50
Topikgazda
válasz
vigyori78
#23620
üzenetére
Szia!
Az egérrel való húzás letiltása lehetséges a beállítások között is, makró nélkül. Excel 2010-ben a speciális beállítások között (a kitöltőjel használatának és a cellák egérrel húzásának engedélyezése.
De az egérklikkeket csak makróval lehet tiltani, ezért makróbarát (xlsm) formában kell menteni.
Üdv.
-
Fferi50
Topikgazda
Szia!
Nézd meg a sorszám függvényt. Ha azt beírod a B oszlopba, megmondja neked, hogy az A oszlopban levő szám hanyadik a sorrendben, növekvő vagy csökkenő sorrendet is választhatsz.
=sorszám(A1; $A$1:$A$100;0) növekvő sorrend szerinti helyet mutatja, ha az utolsó paraméter 1 akkor csökkenő sorrend szerinti helyet.
Figyelj rá, hogy a második paraméter dolláros legyen.Üdv.
-
Fferi50
Topikgazda
válasz
vigyori78
#23602
üzenetére
Szia!
Húzás kikapcsolása: Application.CellDragAndDrop = False
Az egérkattintás kikapcsolása:
A munkafüzet eseménykezelőjében:
dupla kattintás
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Cancel =True
End Subjpbb egérgomb
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean)
Cancel=True
End SubÜdv.
-
Fferi50
Topikgazda
válasz
Carasc0
#23589
üzenetére
Szia!
Megnyitás előbb kikapcsolod az automatikus számolást a menüből. Megnyitás után visszakapcsolod.
De akkor meg a szám beírása után lesz hosszú idő, amíg "magához tér" a fájl.
Szerintem mindenképpen vizsgáld meg, hogy minden képletre szükséged van-e és abban a formában.Üdv.
-
Fferi50
Topikgazda
válasz
Carasc0
#23585
üzenetére
Szia!
Az egyik gyorsítási lehetőség az, hogy kikapcsolod az automatikus ujraszámolást. Amikor változtatsz valamit, akkor kézzel számoltatsz (Természetesen ez makróból is megy mindkettő.) Az Excelt azelőtt állítsd át kézi számolásra, mielőtt behívod a munkafüzetet. (Makróban: application.calculation= és innen felajánlja a lehetőségeket).
A másik, hogy végiggondolod, melyek azok a képletek, amelyeknek az eredménye frissítés. Ezek általában olyan képletek, amelyek rendszer változó dolgokra vonatkoznak pl. ilyen az indirekt, az offset meg még van egy pár belőle. Ezek minden egyes cella megváltozásakor azonnal újraszámítódnak, akkor is, ha nem a "hozzájuk tartozó cella" változott.
Harmadik dolog, a képeket biztosan nem éri meg "belegyömöszölni" az excelbe. Tedd be őket egy adott könyvtárba és a programban csak a hivatkozás kell bele, az excel betölti és utána el is tudod vele felejtetni.
Ugyanez vonatkozik nagytömegű szövegre (pl. help, magyarázat). Ezt is bele lehet tenni egy külön fájlba.Ha megnézed tömörítővel pl. zip, abból is kiderülhet, hogy melyik rész az ami "nyomja" a területet.
(fájl kiterjesztést átírod zip-re utána a zip tömörítővel meg tudod nézni, ki is tudod tömöríteni egy külön helyre azt, amire kíváncsi vagy. Arra vigyázz, hogy ne szerkessz bele, mert akkor baj lehet belőle. Ajánlatos mindezt a fájl másolatával megcsinálni.) Ha nem "rondítottál bele", akkor a visszanevezés után ugyanúgy lehet vele dolgozni, mint azelőtt.Üdv.
-
Fferi50
Topikgazda
válasz
m.zmrzlina
#23575
üzenetére
Szia!
Azért van ez, mert a sima range és cells mindig az AKTÍV munkalapra hivatkozik, ha nincs előtte a pontos megjelölés.
Tehát a második: wsKabelo.Range(wsKbelo.Cells(2, intDigitlista_oszlop), wsKabelo.Cells(intListahossz, intDigitlista_oszlop))formában működik megfelelően. (Én is bele szoktam néha esni ebbe a hibába....)
Az első viszont a betűkkel direktben a wsKabelo -ra hivatkozik.
Üdv.
-
Fferi50
Topikgazda
válasz
Carasc0
#23572
üzenetére
Szia!
Csináld meg a képletet vizszíntesen: =AA$100, ezt húzd el vizszintesen addig, ameddig szükséged van rá.
Utána: Másolás - uj cella kijelölése az oszlopban - irányított beillesztés: képletet és transzponálás ! A képleted számodra megfelelően másolódik át lefelé.
Üdv.
-
Fferi50
Topikgazda
válasz
sedyke
#23547
üzenetére
Szia!
Ezt attól függ, hogy milyen "technikával" hoztad létre összesítéseket.
Ha ugyanannyi sorral van lejjebb, használhatod az indirekt függvényt:
pl. Az első sorban = indirekt("munka1!B" & (sor()-1)*X+1) ahol az X az a szám, amennyivel lejjebb van a következő számlaszám. Ezt a képletet húzod végig az oszlopon.
Az összegre hasonlóan, csak nem +1 amit hozzáadsz, hanem az első összegnek a sorszámát (itt 45).Üdv.
-
Fferi50
Topikgazda
válasz
m.zmrzlina
#23546
üzenetére
Szia!
Így van, elég így csinálni, de ennyi viszont kell.
Üdv.
-
Fferi50
Topikgazda
válasz
m.zmrzlina
#23542
üzenetére
Szia!
Paraméteresen is definiálhatod az egyes makrókat és akkor minden meghíváskor meg tudod mondani neki, hogy melyik változó melyik értékét használja.
pl. sub valami (byval valt1 as string,byref valt2 as integer)
eljárás
end subA byval és byref jelentőségét olvasd el a súgóban, illetve az előző hsz.-ban foglaltak miatt is a változók élettartama (variables scope) részt is.
Egy másik lehetőség:
Az egyes változó értékét "eltárolod" egy munkalap cellájába. Ide írják ki az egyes makrók az értékét és innen olvashatják ki mások az értéket. Ebben az esetben nem kell public változót használnod, sem paraméters meghívást, helyette minden eljárásból kilépéskor utolsó műveletek a változók értékeinek beírása az adott cellákba, az eljárások indulásakor pedig a változókba beolvasod a cellák értékét.Ebben az esetben a cellákban mindig a legutoljára eltárolt érték lesz benne és az olvasható ki, így megoldódik a legutóbbi kérdésedben levő probléma is.
Üdv.
-
-
Fferi50
Topikgazda
válasz
Mittu88
#23467
üzenetére
Szia!
A Public deklaráció nem azt jelenti, hogy globálisan van generálva a változó. Az osztálymodulokban (Thisworkbook, Munkalapok kódmoduljai, stb) deklarált Public változók is elérhetőek mindenhonnan, csak az általam korábban már mutatott módon. (Ha elkezded írni bárhol máshol pl. Thisworkbook. a pont után láthatod a többi tulajdonság között a Public módon deklarált változókat is.)
A Global deklaráció csak standard (nem osztály) modulban használható.
A Public deklaráció standard modul esetén szintén nem kér teljes nevet, mert ott megtalálja.Üdv.
-
-
Fferi50
Topikgazda
Szia!
A ciklus(ok) kb. így néznének ki:
sub masolom()
set m1=sheets("Munka1") ' ahonnan másolok
set m2=sheets("Munka2") ' ahova másolok
m2sor=2 'ide jön a másolás első sora
for xx= 2 to m1.usedrange.rows.count
if not isempty(cells(xx,1)) then
for yy=2 to 13
m2.cells(m2sor,1).value=m1.cells(xx,1).value
m2.cells(m2sor,2).value=m1.cells(xx,yy).value
m2.cells(m2sor,3).value=yy-1
m2sor=m2sor+1
next
endif
next
end subElvileg a Munka1 munkalap minden sorát átmásolja a Munka2-be függőlegesen, az első oszlopba beírja mindig a terméknevet, a második oszlopba a hónap adatát, a harmadik oszlopba a hónap számát.
Üdv.
-
Fferi50
Topikgazda
Szia!
Szerintem a makrót a teljes nevével kell meghivatkozni. Ezt meglesheted, ha megnyitod mindkét munkafüzetet, majd a fejlesztőeszközök - makrók menüpontra kattintva láthatod, hogy az aktív munkafüzet makrói "simán", a másik munkafüzetéi pedig "hosszú névvel" vannak az ablakban.
Ez alapján próbáld.
(Bár én inkább beletenném az y makrót is az első munkafüzetbe (ha lehet), pláne, ha utána már nem csinál semmit egyik munkafüzet sem.)
Üdv.
-
Fferi50
Topikgazda
válasz
Mittu88
#23446
üzenetére
Szia!
Akkor produkálja ezt a hibát szerintem, ha a selection_change úgy következett be, hogy nem volt előtte egyik cellában sem változás (pl. egy celláról simán tab-bal ment tovább valaki, vagy csak belekattintott valahonnan).
Próbáld ezt a selection_change -nél, mielőtt a cells(sor,1) utasításra mennél:
if sor=0 then msgbox "Nem volt változás" :exit subTermészetesen a then után azt írsz be, amit szeretnél, hogy végrehajtódjon. Pl. adhatsz értéket a sor változónak.
Üdv.
-
Fferi50
Topikgazda
Szia!
Csinálsz egy un. "belépő" lapot. Amikor belép a felhasználó, csak ezt látja.
Egy cellát "kinevezel" felhasználónak ezen a munkalapon. Ehhez rendeled adatérvényesítéssel (adatok - érvényesítés - lista) a lehetséges belépők listáját - amit tehetsz egy elrejtett munkalapra, vagy az adott munkalap nem látható/elrejtett oszlopába.
Amikor belép,csak ez a "belépő" munkalap látszik, a legördülő listából kiválasztja magát. Ha ez megtörtént, megmutatod neki az ügyeleti beosztást. Ha nem választ a listából, akkor csak a "belépő" lapot látja továbbra is. (A nem választást úgy figyelheted, hogy adsz egy "semleges" értéket a lista elejére (pl. Válassz), ami megjelenik belépéskor. Ha a cella értéke ez, akkor még "nem lépett be".Üdv.
-
Fferi50
Topikgazda
válasz
m.zmrzlina
#23418
üzenetére
Szia!
Ez a kód 2010-es verziótól jó. Korábbi verziókban nem működik.
Üdv.
-
Fferi50
Topikgazda
Szia!
Szerintem ez elég bonyolult makróval oldható meg csak, mivel a feltételes formázás feltételeit kell megvizsgálnod, hogy az adott cellára melyik teljesült.
Makróban pl. a cells(1,1).formatconditions(x).interior.color adja meg a szín számát, ahol
cells(1,1) az A1 cella, formatconditions(x) az x-edik feltételes formázás. Hogy hány feltételes formázás van az adott cellánál, azt pedig a cells(1,1).formatconditions.count eredménye adja meg.
De a feltételes formázásnak sok egyéb tulajdonsága is van még, amiket mind meg kellene nézni, hogy teljesül-e a cellára (típusa, a tipustól függően a hozzá tartozó kifejezés, operátor....).
Én most nem vállalkoznék egy ilyen makró megírására....Üdv.
-
Fferi50
Topikgazda
válasz
bteebi
#23407
üzenetére
Szia!
"For i = 1 To Worksheets.Count
If Left(ws.Name, 5) = "Lista" Then"Hol adod meg a ws értékét?
Helyette: For each ws in activeworkbook.worksheets
if left(ws.name,5)="Lista" then" ws.Activate
For Each cella In ActiveSheet.UsedRange"Nem kell aktívvá tenni a munkalapot, hogy tudj vele dolgozni.
Helyette: For Each cella in ws.usedrangeViszont akkor e helyett " Sheets("Összefoglaló").Cells(j, 3).Value = Cells(5, cella.Column) & " - " & Cells(cella.Row, 1) & " - " & Cells(6, cella.Column)"
ezt kell írnod: Sheets("Összefoglaló").Cells(j, 3).Value = ws.Cells(5, cella.Column) & " - " & ws.Cells(cella.Row, 1) & " - " & ws.Cells(6, cella.Column)
A végén levő next i helyett pedig sima next (az első for each bezárására).
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23370
üzenetére
Szia!
Itt egy példa:
Ez a munka1 munkalapon működik. (Munka2-t felejtsd el, csak nem töröltem ki.)
Ha közben makrót írsz, akkor elképzelhető a hibára futás. Viszont ezt el tudod kerülni azzal, hogy a munka1-en levő, a célkereszthez tartozó feltételes formázásokat a feltételes formázás kezelővel kitörlöd, a többit viszont hagyd változatlanul.Utána ha lépsz egyet, megjön a célkereszt ismét.
Üdv.
-
Fferi50
Topikgazda
-
Fferi50
Topikgazda
válasz
Delila_1
#23348
üzenetére
Szia!
Sikerült még rövidítenem a Thisworkbook BeforeClose -on:
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If MsgBox("Valóban kilép?", vbQuestion + vbYesNo, "Bezárás") = vbNo Then
Cancel = True
Else
valasz = MsgBox("Menti a változásokat?", vbQuestion + vbYesNoCancel, "Bezárás")
If valasz = vbCancel Then Cancel = True: Exit Sub
If Munka1.fmtcondis.Count > 0 Then
For Each fmt In Munka1.fmtcondis
fmt.Delete
Munka1.fmtcondis.Remove 1
Next
End If
If valasz = vbNo Then
ThisWorkbook.Saved = True
kilepo = True
Else
kilepo = True
ThisWorkbook.Save
End If
End If
End Sub -
Fferi50
Topikgazda
Szia!
A szövegből először oszlopokat csinálsz a "megtalált opcióval" mondjuk az A1-től kezdődően.
Azután kijelölöd a kivánt adatokat a sorban.
Másolás
Kijelölöd az A2 cellát.
Irányított beillesztés - transzponálás
Máris oszlopban sorakoznak a számaid.
Utána még nyomj egy ESC-t, hogy kilépj a másolás módból.Üdv.
-
Fferi50
Topikgazda
-
Fferi50
Topikgazda
válasz
Delila_1
#23348
üzenetére
Szia!
Ezt kell a Thisworkbook kódlapjára beírni:
Public kilepo As Boolean
Private Sub Workbook_AfterSave(ByVal Success As Boolean)
If kilepo Then Exit Sub
Application.ScreenUpdating = False
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).Select
Application.ScreenUpdating = True
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
If Munka1.fmtcondis.Count > 0 Then
For Each fmt In Munka1.fmtcondis
fmt.Delete
Munka1.fmtcondis.Remove 1
Next
End If
If MsgBox("Valóban kilép?", vbQuestion + vbYesNo, "Bezárás") = vbNo Then
Application.ScreenUpdating = False
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).Select
Application.ScreenUpdating = True
Cancel = True
Else
valasz = MsgBox("Menti a változásokat?", vbQuestion + vbYesNoCancel, "Bezárás")
If valasz = vbNo Then
ThisWorkbook.Saved = True
kilepo = True
ElseIf valasz = vbYes Then
kilepo = True
ThisWorkbook.Save
Else
Application.ScreenUpdating = False
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).Select
Application.ScreenUpdating = True
Cancel = True
End If
End If
End Sub
Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean)
If Munka1.fmtcondis.Count > 0 Then
For Each fmt In Munka1.fmtcondis
fmt.Delete
Munka1.fmtcondis.Remove 1
Next
End If
End Sub
Private Sub Workbook_Open()
Application.ScreenUpdating = False
ActiveCell.Offset(0, 1).Select
ActiveCell.Offset(0, -1).Select
Application.ScreenUpdating = True
End SubEzzel elérhető, hogy a "célkeresztet" nem menti le, de a fájl megnyitásakor első dolga, hogy létrehozza: ezért lép oda-vissza egyet az aktív munkalapon.
Mentés előtt eltünteti a célkeresztet, de ha csak mentés volt, utána vissza is hozza.
Kilépéskor végigjátssza a verziókat, ha mégsem lép ki, akkor marad a célkereszt.Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23344
üzenetére
Szia!
Szerintem nem beszéltünk el egymás mellett, de ez nem is lényeges.
A 2010-es exceltől biztosan (de valószínűleg a 2007-ben is már) igen egyszerűen megoldható a feladat:Public fmtcondis As New Collection
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim ujfmtr As FormatCondition, ujfmtc As FormatCondition, ujfmtt As FormatCondition
On Error Resume Next
If IsError(Target.Cells.Count) Then Exit Sub
On Error GoTo 0
If Target.Cells.Count <> 1 Then Exit Sub
If fmtcondis.Count > 0 Then
On Error Resume Next
For Each fmt In fmtcondis
fmt.Delete
fmtcondis.Remove 1
Next
On Error GoTo 0
End If
With Target
With .EntireRow
Set ujfmtr = .FormatConditions.Add(Type:=xlExpression, Formula1:="1")
With ujfmtr '.FormatConditions(1)
With .Borders(xlTop)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 5
End With
With .Borders(xlBottom)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 5
End With
.Interior.ColorIndex = 20
.SetFirstPriority
End With
End With
fmtcondis.Add ujfmtr, "fmt1"
With .EntireColumn
Set ujfmtc = .FormatConditions.Add(Type:=xlExpression, Formula1:="1")
With ujfmtc '.FormatConditions(1)
With .Borders(xlLeft)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 5
End With
With .Borders(xlRight)
.LineStyle = xlContinuous
.Weight = xlThin
.ColorIndex = 5
End With
.Interior.ColorIndex = 20
.SetFirstPriority
End With
End With
fmtcondis.Add ujfmtc, "fmt2"
Set ujfmtt = .FormatConditions.Add(Type:=xlExpression, Formula1:="1")
ujfmtt.Interior.ColorIndex = 36
ujfmtt.SetFirstPriority
fmtcondis.Add ujfmtt, "fmt3"
End With
End SubHiszen itt már be lehet szúrni "akárhány" feltételes formázást és elsőnek tenni, ha pedig megváltozik a kijelölés, akkor az előző formázást törölni.
Ha egy kijelölés közben megváltoztatod az oldalon a feltételes formázási szabályokat, akkor nem tudja a kijelölés elhagyása után letörölni a régi formázást - viszont, ha már úgyis benne vagy a szabályokban, egyszerűen ki kell törölni a kijelölésre vonatkozó feltételes formázásokat, utána az új kijelöléstől már ismét működik az automatizmus.2007. előttre olyan ötletem van, hogy az adott munkalapról csinálni kell egy másolatot és arról minden kijelölés váltásnál vissza kell másolni a formátumot az eredetire.
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23339
üzenetére
Szia!
"Nem tudod eltárolni az adatokat."
Már miért ne tudnám. A formatcondition objektum egymaga tárolja a benne levő összes beállítást, nem kell mindenhez külön változó - még azt is tudja, hogy mely tartományra vonatkozik.
Tehát elég "csak" az adott területen található formatcondition objektumokat eltárolni. Igaz, az állapotok visszanyerése jóval bonyolultabb az eltárolásnál.Viszont amit én írtam, az egyetlen cellára vonatkozott, hiszen a feladat az volt, hogy a feltételeknek megfelelően történő ugrálásnál váltson színt a cella. Egy színt azért csak meg lehet jegyezni a cella címével együtt...
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23321
üzenetére
Szia!
Az igaz, hogy a makró a feltételes formázás törlésével indít, de ki tart vissza bennünket attól, hogy előtte elmentsük a feltételes formázásnak azt az értékét, amit meg akarunk változtatni (mert nyilván, nem az egész formázás fontos, hanem annak mondjuk a színe), amikor pedig "kilépünk" belőle, akkor visszaadjuk az eredeti értéket. (De most másban vagyok benne, nem érek rá megírni - bár nyilván csak pár sor.)
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23319
üzenetére
Szia!
Akkor azt javaslom, hogy a Thisworbook SheetSelectionChange eseménybe írja be a makrót:
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range)
End SubA fenti két sor közé. Az Sh.name megmondja, hogy melyik munkalapon van éppen. Ezt megvizsgálva eldöntheti, hogy menjen-e a feltételes formázás vagy nem.
Nem kell sok-sok munkalapra másolni, csak egy változóban meg kell adni a munkalapok neveit, amit aztán többféle módon lehet ellenőrizni. (Pl. Instr függvény)
Üdv.
-
Fferi50
Topikgazda
Szia!
Mit értesz azalatt, hogy csak munkalapra linkelés? Akkor honnan tudtad, hogy melyik cellára vonatkozik? Viszont sajnos azt gondolom, csak kézzel - vagy makróval lehet átírni a hivatkozásokat, de ha az Adatok menüpontban a hivatkozásokra ránézel, akkor ott egyenként végig lehet menni rajta úgy emlékszem.
A makró nyelve most is "international", azaz angol. Tehát, ha makróból írsz képletet egy cellába, akkor a függvények angol nevét kell írnod. Van ugyan egy könnyítés a formulalocal property, amelyikkel a magyar neveket használhatod, DE akkor a makród nem lesz hordozható, mivel más nyelven nem érti majd meg a képletet.
Üdv.
-
Fferi50
Topikgazda
válasz
fluxion
#23244
üzenetére
Szia!
Tényleg nagyon figyelmetlen vagyok, hiszen rossz helyen kerestetem:
set ujszam= Sheets("pm_nk_arlista_uj").UsedRange.columns(1).Find(What:=Sheets("pm_nk_arlista_uj").Cells(i, 1).Value, LookIn:=xlvalues, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
helyett:
set ujszam= Sheets("pm_nk_arlista").UsedRange.columns(1).Find(What:=Sheets("pm_nk_arlista_uj").Cells(i, 1).Value, LookIn:=xlvalues, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)Remélem, több elnézésem már nem lesz benne.....
Üdv.
-
Fferi50
Topikgazda
válasz
fluxion
#23242
üzenetére
Szia!
Most látom, hogy egy kicsit "fordítva ültem a lóra".
Ezt a sort:
if not ujszam is nothing thencseréld ki erre lsz:
if ujszam is nothing thenMivel ez jelenti azt, hogy nem találta meg az új cikkszámot a régi listában.
Elnézést, hogy elnéztem, nem volt szándékos.
De az end parancs az egyértelmű futás megszakítást jelent, ezért lépett ki az első találat után.Üdv.
-
Fferi50
Topikgazda
válasz
fluxion
#23231
üzenetére
Szia!
A bajt az ide
" Range("K11").Select
End
endif"
beszúrt end parancs okozza, mert ez véget vet a program futásának azonnali hatállyal.
Ezt kellene kivenned és akkor nem áll le az első találatnál.Egyébként pedig:
Nem kell a selection, és nem kell activálni sem a megtalált értéket.
Próbáld így:For i = 2 To sheets("pm_nk_arlista_uj").usedrange.rows.count
set ujszam= Sheets("pm_nk_arlista_uj").UsedRange.columns(1).Find(What:=Sheets("pm_nk_arlista_uj").Cells(i, 1).Value, LookIn:=xlvalues, LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False)
if not ujszam is nothing then
Sheets("pm_nk_arlista").Cells(lastRow + 1, 1).Value = Sheets("pm_nk_arlista_uj").Cells(i, 1).Value
Sheets("pm_nk_arlista").Cells(lastRow + 1, 2).Value = Sheets("pm_nk_arlista_uj").Cells(i, 2).Value
Sheets("pm_nk_arlista").Cells(lastRow + 1, 3).Value = Sheets("pm_nk_arlista_uj").Cells(i, 3).Value
Sheets("pm_nk_arlista").Cells(lastRow + 1, 4).Value = Sheets("pm_nk_arlista_uj").Cells(i, 4).Value
Sheets("pm_nk_arlista").Cells(lastRow + 1, 5).Value = Sheets("pm_nk_arlista_uj").Cells(i, 5).Value
Sheets("pm_nk_arlista").Cells(lastRow + 1, 9).Value = Sheets("pm_nk_arlista").Cells(2, 9).Value
lastrow=lastrow+1
End If
Next i
Üdv. -
Fferi50
Topikgazda
válasz
m.zmrzlina
#23212
üzenetére
Szia!
Annyi adat, ami itt lesz, már nem biztos, hogy befér az excel által kezelt memóriába.
Egyébként is, ha már excel, annak a lehetőségeit kellene kihasználni szerintem.Üdv.
-
Fferi50
Topikgazda
válasz
billyjoe
#23211
üzenetére
Szia!
Mi lenne, ha pivotok helyett szűrést és összegzést (vagy feltételes összegzést) használnál?
Másik megoldás, hogy az alapadatok egy külön excel fájlban vannak, a lekérdezések egy másikban. Akkor nem kell a nagy adatállományokat megnyitni a lekérdezések futtatásához.Ha valamilyen adatszerkezetet és egy-két pivot szerkezetet mutatnál mintának, ennél biztosan többet tudnánk segíteni.
(Nem az érzékeny adatokat kell feltenni és nem kell nagy adattömegnek sem lennie.)Milyen excel verziót használsz? (Év, nyelv)
Üdv.
-
Fferi50
Topikgazda
Szia!
A makróban egy ciklussal végigmész a neveken, kitöltöd a nyilvántartó lapot, kiadod rá a printout parancsot (ha szükséges, előtte beállítod a pagesetup paramétereket).
A makróhoz segít a makórögzítő. Egy nyilvántartó lapot kinyomtatsz a makrórögzítővel és az eredmény lesz a ciklus belseje nagyjából. Egy kicsit bizonyára "szépíteni" kell majd rajta, de a mag az lehet.
A ciklus meg a neveket tartalmazó tartományon vagy változón megy végig.Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#23187
üzenetére
Szia!
Bocsánat, hogy belekotyogok, de ha rész szövegre keresünk, akkor a Range.Find utasításban nem elég a lookat paraméter elhagyása.
A Find ugyanis megőrzi a korábbi beállításokat (gyakorlatilag a Ctrl+F nek a VBA megfelelője, olyannyira, hogy az ottani beállítások is "átjönnek" a makróba és viszont), tehát ajánlott beírni a lookat:=xlpart paramétert is hozzá - mivel ki tudja, hogy mit kerestek korábban.
Vagy ugyanazt eredményezi, ha marad a lookat:=xlwhole, de a keresendő betúk elé és mögé egy-egy csillagot teszünk. (Pl.: *lil* xlwhole beállításnál megtalálja a delila szót is - sőt, ebben az esetben nem is jó az xlPart beállítás!!!)De ha már makróról beszélünk, akkor inkább a Range.Replace utasítás jöhet szóba a fenti megkötésekkel, vagy a replace függvény.
Üdv.
-
Fferi50
Topikgazda
válasz
botond187
#23162
üzenetére
Szia!
Itt az egész makró, hátha elírtál valamit:
Sub kieg()
Dim sor As Long, usor As Long, sorS, sorK As Long, szamol As Integer
Dim ehhez As String, tol$, ig$
Columns(2) = ""
usor = Range("A" & Rows.Count).End(xlUp).Row: sor = 1
For sor = 2 To usor
ehhez = Cells(sor, "A")
If ehhez <> "" Then
sorS = Application.Match(ehhez, Range("D:D"), 1)
szamol = 0
For sorK = 1 To usor
tol$ = Cells(sorS, "E"): ig$ = Cells(sorS, "F")
If Cells(sorK, "A") >= tol$ And Cells(sorK, "A") <= ig$ Then
If szamol = 6 Then Exit For
If Cells(sor, "B") = "" Then
Cells(sor, "B") = Cells(sorK, "A")
Else
Cells(sor, "B") = Cells(sor, "B") & "|" & Cells(sorK, "A")
End If
szamol = szamol + 1
End If
Next
End If
Next
End SubÜdv.
-
Fferi50
Topikgazda
válasz
botond187
#23145
üzenetére
Szia!
A makró elejére írd be egy uj sorba:
Dim szamol as integerIde szúrd be a félkövér sort:
sorS = Application.Match(ehhez, Range("D:D"), 1)
szamol = 0
For sorK = 1 To usorIde szintén:
If Cells(sorK, "A") >= tol$ And Cells(sorK, "A") <= ig$ Then
If szamol = 6 Then Exit For
If Cells(sor, "B") = "" Then
És még ide:
End If
szamol = szamol + 1
End IfÜdv.
-
Fferi50
Topikgazda
válasz
botond187
#23141
üzenetére
Szia!
Két dolog okozta a hibát:
1. Az első sortól indítottad a ciklust és így a cikkszámot is kereste, ami persze nem volt.
Ezért ezt a sort: For sor = 1 To usor át kell javítani erre: For sor = 2 To usor
2. Az A oszlopban vannak üres cellát, ami szintén hibát okoz. Vagy "eltünteted" az üres cellákat, vagy beírod a következő feltételt a makróba:
ehhez = Cells(sor, "A")
If ehhez <> "" Then
sorS = Application.Match(ehhez, Range("D:D"), 1)valamint a lezárását:
Next
End If
NextA félkövérrel szedett sorokat kell beszúrnod a másik kettő közé.
Üdv.
-
Fferi50
Topikgazda
-
Fferi50
Topikgazda
válasz
Dolphine
#23123
üzenetére
Szia!
Szinválasztásra ott a jobb egérgomb, cellaformázás, kitöltés. A három szined gyorsan ott lesz a kiválasztható szinek elején.
Vagyis beírod a jegyet, enter. Utána egérrel visszaállsz a cellára és végigcsinálod a fenti műveletet.De szerintem ennél sokkal jobb lenne, ha a három különböző eredményt 3 külön oszlopba írnád az adott tanulónál. Máris megvan oldva a probléma, még az oszlopot is színezheted, ha akarod.
Üdv.
-
Fferi50
Topikgazda
válasz
botond187
#23116
üzenetére
Szia!
Képlettel nem lehet módosítani az adott cella tartalmát, mert az körkörös hivatkozás hibát ad.
Vagy makrót írsz, vagy a mellette levő cellába beírod a következő képletet:
B1-be pl. ="XY" & A1 ahol XY a két új karakter. Ezután a cellát kijelölve másol, beilleszt értéket és ezt teszed át az eredeti cellába.Üdv.
-
Fferi50
Topikgazda
válasz
tgumis
#23112
üzenetére
Szia!
Tettem fel ide egy kis példát. A combobox forrása az A2:A48 cellákban található. Hozzá van kapcsolva az F1 cellához.
Amikor elkezdesz gépelni valamit, akkor a megfelelő értékek automatikusan töltődnek, ha lehúzod a legördülő listát, onnan kezdődnek a választható értékek. Kiválasztod enterrel, majd kijelölsz egy cellát és rákattintasz. Ebbe a cellába automatikusan beíródik a combo (és az F1 cella) értéke.Remélem, segít neked ez a dolog.
Van még egy kikommentelt része is, ott a B oszlopot tölti folyamatosan, függetlenül attól, hogy hova kattintottál el a comboboxról.
Üdv.
-
Fferi50
Topikgazda
válasz
Szilard7
#23107
üzenetére
Szia!
Ha biztos, hogy minden H oszlopbeli értékre van J oszlopbeli érték és az első H előfordulás mellett van a J oszlopban érték, akkor fkeres a barátod. Ha nem így lenne, akkor kapsz hibaértéket, amit az első előfordulásnál átírsz a helyesre és a többi kijavul (persze ezt H értékenként kellene megtenni).
Ha J11-től kezdődnek az üres cellák:
J11 képlete =fkeres(H11;$H$5:$H10;3;0)
Ezután húzd végig a J oszlopon a képletet.Vagy:
Csinálsz egy irányított (speciális) szűrést a H:J tartományodból átmásolva egy másik tartományba, bejelölve, hogy csak az egyedi értéket másolja át.
Ezután az fkeres kereső tartománya az új, kimásolt tartomány lesz, képlet mint fent, csak a $H$5:$H10 helyett az új tartomány $-os címét kell beírnod ($X$2:$Z$30).
Üdv.
-
Fferi50
Topikgazda
válasz
tgumis
#23104
üzenetére
Szia!
Tervező módban:
Tegyél fel egy combobox activexvezérlőt a munkalapra, a listfillrange a listát címe.
A matchentry tulajdonságot állítsd 1-fmmatchentrycomplete értékre
Így amint elkezded begépelni az értéket, a mejelenő lista szűkülni fog.
Hozzákötheted egy cellához (linked cell), ahonnan kimásolhatod az értéket.
Ha kilépsz a tervező módból látod a listádat és választhatsz belőle, amint rákattintottál, megjelenik az értéke a hozzákötött cellában.Üdv.
-
Fferi50
Topikgazda
-
Fferi50
Topikgazda
Szia!
Kérdés:
Az egyes táblázatok között van üres sor, vagy a fejléc (A csoport, B csoport) választja el egymástól őket?
Hova szeretnéd az eredményt tenni?Egyébként a darabüres függvény használható az üres cellák megszámolására, vagy a darabhatöbb függvény, ha feltétel szerinti üreset keresel.
Egy minta sem ártana.... Mert amit itt leírtál, az nem mutatja a munkalapon való elhelyezkedést.
Üdv.
-
Fferi50
Topikgazda
válasz
Thrawnad
#23091
üzenetére
Szia!
Nem tudom, Ora milyen változónak lett definiálva.
Valószínűleg azért kapsz ilyen üzenetet, mert nincs a keresett értéknek megfelelő eredmény és így egy hiba értéket ad vissza a Vlookup, amit csak variant tipusu változó tud megenni.Ezért inkább másként szoktuk a problémát megkerülni:
dim talalt as variant
on error resume next
talalt=Application.WorksheetFunction.VLookup(Kod, Sheets("Adatok").Range("E14:ei34"), 16, False)
if err=0 then
volt találat
else
nem volt találat
endif
on error goto 0vagy
dim talalt as variant
talalt=Application.VLookup(Kod, Sheets("Adatok").Range("E14:ei34"), 16, False)
if iserror(talalt) then
nincs találat
else
van találat
endifA dim talalt önmagában is elég, mert az variant tipusu változót deklarál, csak azért írtam oda a típust, hogy jobban feltűnjön.
Üdv.
-
Fferi50
Topikgazda
válasz
the radish
#23083
üzenetére
Szia!
Az index és a hol.van függvényt próbáld meg:
=Hol.van("*darab";2:2;0) megmondja azt az oszlopot, amelyben a darab(számok) vannak listázva, ha a fejléc a 2.sorban van. Természetesen ha másik sorban van a fejléc, akkor annak a számát kell odaírni.Ha a fejléc másik munkalapon/másik munkafüzetben van, akkor a teljes hivatkozást be kell írnod a sor elé:
=Hol.van("*darab";Munka2!2:2;0), vagy = hol.van"*darab"; '[file name.xlsx]Munka2'!2:2;0)
Ezután az Index függvénnyel megtudod kapni a tényleges értéket:
=index(Munka2!A2:I200; 3;hol.van("*darab";munka2!2:2;0)) képlettel megkapod a 3.sorban levő értét a darab fejlécet tartalmazó oszlopból.
Ezáltal nem kell pontosan tudnod, hogy a fejlécben melyik oszlop tartalmazza a darab szöveget.
A sorokat pedig természetesen folyamatosan növelned kell, erre jó például a sor függvény, amit ha paraméter nélkül írsz be, akkor az adott cella sorát tartalmazza:
Tehát, ha az 5. sorban van az adat és az 5 sorba teszed a képleted, akkor a fenti képletben az ;3; helyett beírhatod a ;sor(); képletet.
Ha másik táblára váltasz és ott újra a 3. sortól kezdődnek az értékek, akkor az addig teleírt sorok számát ki kell vonnod:
Pl. 15. sorban végződött az előző tábla, akkor a 16.sorba jön a következő tábla adata:
A képletben kicseréled a munkalap nevét, a sor() helyett pedig beírod, hogy sor()-13, mert ez adja ki a 3. sor számát, ahol a forrástáblában kezdődik az adat.
Ezt a képletet is lehúzhatod addig, amíg üressé nem válik a cella értéke (0-át nem ad vissza).
Majd névváltás, sorváltás és lehet tovább lehúzni a képletet.Remélem elég érthető volt.
Üdv.
-
Fferi50
Topikgazda
Szia!
Van egy dolog, amire még oda kell figyelni: Ha nem választanak, akkor nem fog a mentésed lefutni.
Ezért ezt a részt egy kicsit módosítani kell:With fd
.InitialFileName = Range("gyariszam") & "_jegyzokonyv"
.FilterIndex = 2 'xlsm, azaz makróbarát munkafüzetként
---------
.Show
.Execute
----------
helyett
if show=-1 then
.execute
else
msgbox "Nem választottál, a mentés nem történt meg!",vbinformation
endif
End WithHa mindenképpen kell, hogy legyen mentés, akkor figyelned kell, hogy megtörtént-e. Amennyiben nem, úgy meg kell ismételtetni.
Üdv.
-
Fferi50
Topikgazda
válasz
Thrawnad
#23078
üzenetére
Szia!
Bocsi, most látom, hogy a "programkód" vezérlés egy kissé átvert.
Az első sor így néz ki: set talalt=
A többi része jó.Az mindegy, hogy hol van a kód és hol van a táblád, mert a kódban lehet direktben hivatkozni a keresés helyére, lást munka1.range("A1:A50'), vagy sheets("Munkalapnév").range("A1:A50").find
De ha egy kis mintát felteszel, még pontosabb lehet még többet tudunk mondani.
Pld. működik az is, ha a cellába először a képletet írod be, majd utána átalakítod értékké.
Üdv.
-
Fferi50
Topikgazda
válasz
Thrawnad
#23073
üzenetére
Szia!
A worksheetfunction.vlookup-on kívül a VBA -ban a Range.find metodust is használhatod(ez kb. ugyanaz minta Crtl+F a munkalapon):
Cset talalt = munka1.range("A1:B50").find(what:=keresem,lookin:=xlvalues,lookat:=xlwhole)
if not talalt is nothing then
megtalálta
else
nemtalálta
endif
[/][/M]
Viszont az időkeresés az külön figyelmet kíván és ki kell többször próbálni, mert az excel a dátumot, időt számként tárolja.
Üdv.
Új hozzászólás Aktív témák
Hirdetés
- The Elder Scrolls Online Imperial Collector s Edition
- Eredeti Microsoft termékek - MEGA Akciók! Windows, Office Pro Plus, Project Pro, Visio Pro stb.
- Vírusirtó, Antivirus, VPN kulcsok GARANCIÁVAL!
- Eladó jogtiszta, Windows 11/10, Office 2019/2021/2024, Fizikai és Digitális licencek, Számlával.
- Játékkulcsok ! : PC Steam, EA App, Ubisoft, Windows és egyéb játékok
- Lenovo X13 Yoga 2in1 Thinkpad Gen2 LTE i7-1165G7 16GB RAM 512GB SSD Intel Iris XE Win11 Pro Garancia
- iPhone 13 Pro 256GB Sierra Blue -1 ÉV GARANCIA - Kártyafüggetlen, MS4383, 100% Akkumulátor
- 27% - ASUS NUC 15 Performance Core Ultra 9 275HX / RTX5070 MiniPC! BeszámítOK
- Apple iPhone 15 Pro / 128GB / Kártyafüggetlen / 12Hó garancia / Akku: 88%
- AKCIÓ! Intel Core i9 9900K 8 mag 16 szál processzor garanciával hibátlan működéssel
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest
