-
Fototrend
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
válasz
bakabaka
#26768
üzenetére
Szia!
A ciklusodon belül egy DoEvents utasítást helyezz el, ekkor a billentyűzet lenyomásokat egy idő után érzékeli az op rendszer és megáll a program futása (Debug párbeszédablak jelenik meg).
Esetleg egy változóban számolhatod a "kísérleteket" (lefutott ciklus számát) és adott érték után kilépsz a ciklusból, vagy megállítod a programot.
A ciklusba az adat bevitele után az ellenőrzés megkezdése előtt beviszel egy stop utasítást. Innen pedig lépésenként futtatod a programot tovább.
Üdv.
-
Fferi50
Topikgazda
válasz
csferke
#26766
üzenetére
Szia!
Sheets("Számla könyvelése").Hyperlinks.Add Anchor:=Sheets("Számla könyvelése").Range("B"& sor+1), Address:="g:\valami\2015\szamlaneve.pdf", TextToDisplay:=szamlaszam
A szamlaszam helyére a konkrét számlaszámot írod, ami a Számla készítése lapon a B oszlopban van, ha jól látom.
Ezzel kell kiegészítened a makrót szerintem.Üdv.
-
Fferi50
Topikgazda
Szia!
Az A1 cellát másolod és ugyanoda beilleszted értékként, de ez elég macerás minden adatbevitel után.
Ezért javaslom a következő makrót:Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column <> 2 Then Exit Sub
If Target.Value <> "" Then
Application.EnableEvents = False
Target.Offset(0, -1).Value = Now()
Application.EnableEvents = True
End If
End SubEzt úgy viheted be, hogy a munkalapfülre jobb egérgombbal rákattintasz, kód megjelenítése, majd a megjelent kódlapon az üres területre bemásolod.
A makró azt csinálja, ha a B oszlop egy cellájába adatot írsz (vagy megváltoztatod az ott levő adatot), akkor beírja az A oszlopban mellette levő cellába a Most függvény értékét, ami természetesen nem fog a továbbiakban változni.
Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#26750
üzenetére
Szia!
Ott is a beállítások között kell keresgélned, csak valószínűleg lista van az adattartomány helyén.
(Nekem nem volt 2007-es excelem, de valaki más hátha besegít.)Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#26747
üzenetére
Szia!
Excel 2010-ben Fájl - Beállítások - Speciális - Adattartomány végén a formázás és a képletek folytatása bejelölöd.
Üdv.
-
Fferi50
Topikgazda
válasz
Mindless
#26726
üzenetére
Szia!
Mivel a keresőfüggvények (így a hol.van is) az első találatnál megállnak, így azt gondolom, ha tényleg az utolsó találatra vagy kíváncsi, legegyszerűbben úgy oldhatod meg, hogy - most kapaszkodj - megfordítod a táblázatodat fejjel - lefelé és abban keress.
Ebben az esetben az lesz az első találat, ami "normál állásban" az utolsó volt.
Valahol - valamelyik topicban csináltam már egy olyan képletet (igaz, fkeres függvényre), amelyiknek meg lehet mondani, hanyadik előforduláshoz tartozó értéket adja vissza, de ahhoz idő kell, hogy előbányásszam és hol.van-ra aktualizáljam.Üdv.
(a hangulatjeleket gondold a megfelelő helyre...) -
Fferi50
Topikgazda
válasz
Zola007
#26709
üzenetére
Szia!
"Sajnos ez sem működik valamiért." (Nálam is Office 2010 Professional van egyébként.)
Ebből szerinted mit tudok meg? Legalább annyit írhatnál, hogy milyen hibát ír ki.Itt egy 10 tartomány paraméterét kezelő változat:
Function SumBold(WorkRng1 As Range, Optional WorkRng2 As Range, Optional WorkRng3 As Range, Optional WorkRng4 As Range, Optional WorkRng5 As Range, Optional WorkRng6 As Range, Optional WorkRng7 As Range, Optional WorkRng8 As Range, Optional WorkRng9 As Range, Optional WorkRng0 As Range)
Dim rng As Range, terulet As Range, xSum As Long, WorkRng As Range
Set WorkRng = WorkRng1
If Not WorkRng2 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng2)
If Not WorkRng3 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng3)
If Not WorkRng4 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng4)
If Not WorkRng5 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng5)
If Not WorkRng6 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng6)
If Not WorkRng7 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng7)
If Not WorkRng8 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng8)
If Not WorkRng9 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng9)
If Not WorkRng0 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng0)
For Each terulet In WorkRng.Areas
For Each rng In terulet.Cells
If rng.Font.Bold Then xSum = xSum + rng.Value
Next
Next
SumBold = xSum
End FunctionÜdv.
-
Fferi50
Topikgazda
válasz
Zola007
#26707
üzenetére
Szia!
Ha munkalap függvénynek szeretnéd használni, akkor szerintem minden tartományt külön paraméterként kell bekérni. A példa 4 tartományt tud kezelni, az elsőt kötelező megadni, a többi opcionális:
Function SumBold(WorkRng1 As Range, Optional WorkRng2 As Range, Optional WorkRng3 As Range, Optional WorkRng4 As Range)
Dim rng As Range, terulet As Range, xSum As Long, WorkRng As Range
Set WorkRng = WorkRng1: If Not WorkRng2 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng2)
If Not WorkRng3 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng3)
If Not WorkRng4 Is Nothing Then Set WorkRng = Union(WorkRng, WorkRng4)
For Each terulet In WorkRng.Areas
For Each rng In terulet.Cells
If rng.Font.Bold Then xSum = xSum + rng.Value
Next
Next
SumBold = xSum
End FunctionHa még több tartományt szeretnél kijelölni, akkor növelni kell a paraméterek számát, a vizsgálandó terület meghatározását pedig a logika szerint folytatni.
Remélem, sikerül.
Üdv.
(Az előző makró csak makróból meghívva működik helyesen, munkalapon nem, sorry.) -
Fferi50
Topikgazda
válasz
Zola007
#26705
üzenetére
Szia!
A nem összefüggő tartományokban területek (Areas) vannak. Ezeken kell "végiggyalogolnod", majd ezen belül az egyes cellákon:
Function SumBold (WorkRng as Range)
Dim rng As Range, terulet As Range,xSum as Long
For Each terulet In WorkRng.Areas
For Each rng In terulet.Cells
If rng.Font.Bold Then xSum = xSum + rng.Value
Next
Next
SumBold=xSum
End FunctionÜdv.
-
Fferi50
Topikgazda
válasz
szami777
#26686
üzenetére
Szia!
Az értékek területére is be kellene vinni az egyetlen meglevő meződet (mármint az A oszlopot), úgy hogy a darabszám függvénnyel legyen összesítve. (Mivel most csak sorcimkéid vannak, hozzá tartozó adatok pedig nincsenek, ezért nem tud megjeleníteni semmit a diagram.)
Üdv.
-
Fferi50
Topikgazda
Szia!
Indulj el az így rendezett listád utolsó sorától felfelé. Ez a sor megmarad, az előző sorokat addig törlöd visszafelé, amíg az első 6 karaktere ugyanaz mint a megmaradó(utolsó) soré. Ha változott az első 6 karakter, kezded újra az eljárást (az eltérő sor megmarad, a többit visszafelé törlöd, amíg másik programot nem találsz.)
Arra figyelj, hogy a sor kitörlése után az aktulális sor száma nem változik meg, de helyére bekerül az alatta levő sor, ezért mindig vissza kell lépni egyet a sorokon.
Üdv.
-
Fferi50
Topikgazda
válasz
kőbaltazár
#26636
üzenetére
Szia!
A helyi menüt is a ribbon kezeléssel tudod megváltoztatni - saját ribbon (menüszalag) hozzáadásával.
Az egyik legjobb útmutató:Az egyéni szűrés (speciális szűrés) menüpontot a Beállítások - Menüszalag testreszabása menüpontban ki tudod tenni egy általad preferált - akár mindig látható helyre.
Egyébként az Alt+G és utána Alt+C billentyűk kombinációja indítja a párbeszédpanelját (magyar nyelvű verzióban).Üdv.
-
Fferi50
Topikgazda
válasz
k_miso
#26619
üzenetére
Szia!
"Kézzel" egyszerűen kijelölsz egy meglevő formátumot és átírod arra a formára, amit szeretnél látni.
Makróval a numberformat tulajdonságot kell használni, ha beállítasz egy új formátumot, akkor az bekerül az egyéni formátumok közé.
Nézd meg a format függvényhez kapcsolódó magyarázatot is légy szíves.Üdv.
-
Fferi50
Topikgazda
válasz
k_miso
#26616
üzenetére
Szia!
"Csak nem tudom, hogy hogyan lehet változót adni meg fájl névként."
Nem túl bonyolult:
dim masolt as workbook
fajlneve=forras.cells(sor,oszlop).value ' sor= az aktuális kimásolandó sor száma, oszlop= az egyedi értéket tartalmazó oszlop száma
set masolt=workbooks.add 'ennek az új munkafüzetnek az első munkalapja lesz aktív
'bemásolod a kívánt adatokat, utána
masolt.save filename:=fajlneve
masolt.closeArra viszont figyelj, hogy a fájlnévben lehetőleg ne legyenek magyar ékezetes karakterek, pontok,vesszők és egyéb olyan karakterek, amelyek "megbolondíthatják" a fájlkezelőket.
Üdv.
-
Fferi50
Topikgazda
válasz
k_miso
#26614
üzenetére
Szia!
Ez véleményem szerint csak makróval oldható meg.
A makró végiglépked a sorokon, létrehoz egy új excel munkalapot(vagy fájlt?), annak az első sorába bemásolja az éppen aktuális sor értékét.
Ez megy mindaddig, amíg talál az adott sorban értéket.Azért annyit jó lenne támpontként tudni, hogy
a.) az adatsorok között lehetséges-e üres sor, ha igen,akkor azzal mit kell tenni
b.) a forrás munkafüzetben kell létrehozni új munkalapokat, vagy minden sort új munkafüzetbe kell elhelyezni (erre utalt a kérdőjeles rész fentebb). Ha ez utóbbi, akkor nyilván valamilyen (milyen?) néven el is kell menteni a keletkezett munkafüzetet.A fentiek ismeretében a makró egyszerű - a makrórögzítés funkcióval megcsinálsz egy munkalapot/füzetet, majd belefoglalod egy ciklusba a létrejött makrót, hogy annyiszor fusson le, ahány sora van a forráslapnak.
Üdv.
-
Fferi50
Topikgazda
válasz
ritterkrisz
#26603
üzenetére
Szia!
Használd az Fkeres (Vlookup), vagy az Index függvényt az azonosak megtalálásához a másik lapon.
Üdv.
-
Fferi50
Topikgazda
Szia!
Próbáld így:
Worksheets("Monthly").Range(Worksheets("Monthly").Cells(2, REPORT_YEAR - 12),Worksheets("Monthly"). Cells(15, REPORT_YEAR))
Akkor ugyanis, ha nem írod be a "teljes címet", az aktív lapról veszi az információkat a program.
(Ilyeneket én is szívtam párszor...)A második eset azért hibás szerintem, mert nem deklaráltad előtte a TestRange változódat, ezért az variant típusú és nem range (bár range az amit hozzárendeltél).
Üdv.
-
Fferi50
Topikgazda
válasz
alfa20
#26598
üzenetére
Szia!
Nem tudom, hogy a tömb-e az optimális megoldás ebben az esetben. Én valószínűleg másképp valósítanám meg.
Pl a betűket és a számokat egymás mellé írnám egy szöveges változóban szép sorban, valamivel elválasztva.
Ezután instr függvénnyel megkeresném a szövegben az A1 cella értékét, és a hozzá tartozó számértéket kinyerhetem a következő elválasztójel után.Vagy: használnám a Collection objektumot. Létrehoznék egy Collection típusú változót. A collection tartalmazhat egy kulcsot, ami jelen esetben a betű lenne, valamint egy, a kulcshoz tartozó értéket, ami a betűhöz tartozó szám. A számot úgy lehet elérni, hogy a Collection-ban a betű elemre hivatkozol.
Pl.
sub szamos
dim betuszam as new collection
betuszam.add key:="aa",item:=11
betuszam.add key:="bb",item:=22
msgbox betuszam("aa")
msgbox betuszam("bb")
end subÜdv.
-
Fferi50
Topikgazda
Szia!
Kellene hozzá egy segédoszlop, ahova a "sorszámokat" kigyűjtöd ismétlés nélkül.
A két számokat tartalmazó oszlopot egymás alá másolod,kijelölöd, majd adatok - ismétlődések eltávolítása.
Ezt én az O oszlopba tettem be.
Ezek után a képletek:
F1 cella: =HAHIBA(FKERES(KICSI($O:$O;SOR());A:A;1;0);"")
G1 cella:=HA(ÜRES(F1);"";HAHIBA(FKERES(F1;A:B;2;0);""))Ezt a két képletet átmásolhatod a H és I oszlop első celláiba, majd a 4 képletet lehúzod, ameddig adatod van.
Üdv.
Ha angol exceled van, akkor HAHIBA -> IFERROR, FKERES ->VLOOKUP, HA ->IF, ÜRES -> ISBLANK -
Fferi50
Topikgazda
válasz
bara17
#26516
üzenetére
Szia!
Mit látsz az adott cellában a munkalapon? 5.500 vagy valami mást? Mert az egy dolog, hogy a csv fájlban pontok vannak. Szám megjelenítésnél - ha a cella számformátumú, akkor nem tudsz így cserélni.
A cella számformátumától függ, hogy egy szám milyen módon jelenik meg. Először azt kellene megnézni, gyanítom, hogy elég lenne a cellaformátumot megváltoztatni.Üdv.
-
Fferi50
Topikgazda
válasz
Törpella
#26515
üzenetére
Szia!
Elnézést, amiért csak most válaszolok, de vannak különböző "tavaszi" elfoglaltságaim is.
Ahogy én elnézem, itt nem szűrőről van szó, hanem a megfelelő rowlabel (sorcimke9 kiválasztásáról.
Ezt a következőképpen oldhatod meg (a kód általános, aktualizálhatod magadra, a számok helyére a mező nevét is írhatod természetesen):Sheets(2).Pivottables(1).Pivotfields(1).Pivotitems(kiválaszott).visible=true
For each pi in Sheets(2).Pivottables(1).Pivotfields(1).Pivotitems:pi.visible=pi.caption=kiválasztott: NextEzután az adott pivottáblában már csak a kiválasztott tételed fog látszani.
Az egész táblát (már az eredményt) átmásolhatod egy másik helyre a következő kóddal:
Sheets(2).Pivottables(1).Tablerange1.Copy Destination:=Sheets(3).Range("A1")Ha tudod, hogy hány soros a kiválasztott tételed, akkor
Sheets(2).Pivottables(1).Tablerange1.Rows("3:5").Copy Destination:=Sheets(3).Range("A1")Viszont, ha csak az utóbbi eredmény szükséges, akkor nem kell "szűrni" a pivottáblát. Legyen minden sorcimkéje látható.
A kiválasztottat megtalálod a következőképpen:
set kiv=Sheets(2).Pivottables(1).Tablerange1.Find(what:=kiválasztott,lookin:=xlvalues,lookat:=xlwhole)
másolása:
sheets(2).Pivottables(1).Tablerange1.Rows(kiv.row-sheets(2).Pivottable(1).Tablerange1.Cells(0,1).Row).Copy Destination:=Sheets(3).Range("A1")Még egy megjegyzés: Úgy gondolom, szerencsésebb lenne, ha a lekérdező formon mutatnád a listát, hogy miből lehet választani, mert akkor biztosan nem lesz hibás találat. Ehhez egy dropdown vagy listbox control kell, amit a pivotokból tudsz feltölteni a kiválasztható értékekkel.
Mivel úgy látom elég sok rowlabel van és azok mind "alá vannak rendelve" a fő labelnek, természetesen a másoladó sorok száma is aszerint alakul, ahány label van.
Üdv.
-
Fferi50
Topikgazda
válasz
swoody
#26498
üzenetére
Szia!
Csak erre a 3x3-as variációra:
2. táblázat képletei:
F2 cella =HA(FKERES(F$1;$A$2:$D$4;2;0)=1;$B$1;HA(FKERES(F$1;$A$2:$D$4;3;0)=1;$C$1;HA(FKERES(F$1;$A$2:$D$4;4;0)=1;$D$1;"")))
F3 cella =HA(FKERES(F$1;$A$2:$D$4;3;0)=1;HA(F$2=$C$1;HA(FKERES(F$1;$A$2:$D$4;4;0)=1;$D$1;"");$C$1);HA(FKERES(F$1;$A$2:$D$4;4;0)=1;HA(F$2=$D$1;"";$D$1)))
F4 cella =HA(FKERES(F$1;$A$2:$D$4;4;0)=1;HA(VAGY(F$3=$D$1;F$2=$D$1);"";$D$1);"")
Ezeket a képleteket kell mindhárom oszlopon végighúzni.4. táblázatban összefűzés van:
pl. F6 cella képlete =F2 & $B$7
Ezt is lehet húzni a többi cellába.
Üdv. -
Fferi50
Topikgazda
válasz
tgumis
#26496
üzenetére
Szia!
Kézzel: Kijelölöd a nyomtatási területet
Oldalbeállítás: beállítod az álló v. fekvő formát. Kinyomtatod azokat az oldalakat, amiket ebben a formában szeretnél látni.
Ezután kijelölöd a másik tájolású nyomtatási területet, átállítod a lap tájolását és kinyomtatod a többi oldalt.
(Együtt azért nem lehet, mert nyilván más helyen lesz az oldaltörés, ha más a lap tájolása.)
Makróval a Worksheet.Pagesetup objektumának tulajdonságait kell állítanod.
Nyomtatási terület: PrintArea
Tájolás: OrientationÜdv.
-
Fferi50
Topikgazda
válasz
azopi74
#26483
üzenetére
Szia!
Úgy gondolom, abba most nem érdemes belemenni, hogy ki és miért döntött a lokalizálás mellett (nyilván ezer meg egy indok volt pro és kontra és a pro "győzött"). Az egyéni véleményeket is tiszteletben tartom/tartjuk. Annyit azonban még hozzá tennék - nem hiszem, hogy az egyébként nagy %-ban angol nyelvvizsgát (is) abszolváló felsőoktatási hallgató számára olyan bonyolult dolog lenne, ha az életben nem a magyar, hanem az angol nyelvű excellel/worddel stb. kellene elboldogulnia. Sokkal nagyobb bajnak tartom, hogy még mindig ezen programok alapfunkcióinak meg (nem) értésével vagyunk tele ezen a fórumon is (és igen, ifjaktól is...)
A vállalkozásoknak - a multiknak és a magyaroknak is - természetesen joguk van ahhoz, hogy egységes it rendszereket üzemeltessenek (sőt ez hatékonysági követelmény is!), a munkavállalónak meg kötelessége, hogy ehhez is - mint minden más, munkáltató által támasztott feltételhez - alkalmazkodjon.Itt a fórumon pedig általában a segítés a célunk és talán egy kis %-ban a (nép)nevelés. Elsősorban a kérdező által felvetett problémára próbálunk megoldást találni - sokszor gondolatolvasásra kényszerítve -, figyelembe véve a "hatékonyság" kritériumát is... Ha azt látjuk, hogy magyar függvényneveket használ, akkor nem fogunk neki angol függvényeket feldobni és viszont. Persze sokat segít, ha ismerjük a működő excel verziót is.
Ez szakmai vagy politikai kérdés? Szerintem, ha abból indulsz ki, hogy létezik magyar verzió az office-ból, akkor bizony szakmai a kérdés. Mint ahogy az is szakmai, hogy melyik "évi" excelt használja valaki. "Politikai" kérdéssé akkor válik, amikor el kell dönteni, hogy melyiket vezessük be a cégnél.
Mindent összevetve - és Delila kenyerét nem elvéve - úgy gondolom, ebben a topikban teljesen jogos a magyar és angol függvénynevek verziófüggő jelenléte akkor amikor képletezésekkel oldunk meg feladatokat és teljesen egyértelmű, hogy a makró használatban viszont a nemzetközi verzió a "menő".
Más:
Nagyon örülök a jelenlétednek, máris sok hasznos dolgot tanultam Tőled, pedig több 10 éve használom az excelt.
Tartsd meg a jövőben is az aktivitásodat. Egy kis szakmai vita mindig jól esik.
Üdv.
-
Fferi50
Topikgazda
válasz
azopi74
#26479
üzenetére
Szia!
Bocsi, hogy beledumálok a polémiátokba:
"angol excelből, be tudok szúrni magyar makrólapot?"
Senki nem mondta, hogy egy makrólapnak magyarnak kellene lennie, a makrólap nemzetközi.
Egyébként pedig van formulalocal tulajdonság a VBA-ban, amelyik "megérti" a magyar (ill. a lokális) függvénynevek beadását a cella képleteibe. De ez csak azon a nyelven működik akkor, amelyikre be van állítva."akkor az angol függvények bárki számára elérhetőek, a lokaizáltak viszont csak a lokalizálton"
Állította itt valaki az ellenkezőjét? A makrólap nemzetközi, az excel függvények nevei pedig zömmel le vannak fordítva lokális nyelvre, hogy az angolt nem tudók is értve használhassák. Semmi szükség a "visszafordításukra". A lokalizációra pedig írtam az előző bekezdésben.Üdv.
-
Fferi50
Topikgazda
válasz
Gravity1234
#26476
üzenetére
Szia!
" A11,A3 részt emeli ki"
A képletekben mivel vannak elválasztva a különböző paraméterek? Próbáld a vessző helyett a pontosvesszőt, illetve azt, ami nálad az elválasztó.Üdv.
-
Fferi50
Topikgazda
válasz
Gravity1234
#26473
üzenetére
Szia!
Ezt biztosan nem nekem szántad.
De: A kapcsos zárójeleket nem kell beütnöd, azt az excel maga teszi bele a shift+control+enter hatására.Üdv.
-
Fferi50
Topikgazda
válasz
layerke
#26448
üzenetére
Szia!
Ilyen esetben kell az indirekt függvényt használni. Egy cellába összerakod a tényleges hivatkozást és utána azt a cellád teszed be az indirekt függvénybe.
pl: a1 cella képlete ="'\\fsl1\GMV\Napi\2013\"
b1 cella képlete ="Január\[GMVj20130101.xls]GMVjelentés'!"
c1 cella értéke $D$5F1 cella képlete =indirekt(A1&B1&C1)
Természetesen a képlet "szétszedés/összerakás" a változó szükségletnek megfelelő, lehet, hogy csak a napot kell változtatni, akkor azt teszed egy külön cellába.
Viszont nagyon súlyos korlát, hogy az indirektes képlet csak akkor működik, ha megnyitott a forrásfájl, egyébként hibát ad vissza (legalábbis 2010-es verzióban így van.
Ha viszont képlettel írod be a hivatkozást (vagy makróval!) akkor nem kell nyitva lennie egyáltalán a forrás fájlnak.
Ha makró segítség kellene, tégy fel egy mintát (két fájl kamu adatokkal) és segítünk.
Üdv.
-
Fferi50
Topikgazda
válasz
layerke
#26430
üzenetére
Szia!
"Próbáltam az excelben meghivatkozni egyes cellákat, de ehhez nyitva kell lennie a fájloknak vagy helyben tárolva kell lenniük, "
Ez így nem követelmény. Az excelben meg tudod hivatkozni a munkafüzet kapcsolatokat a teljes elérési út beírásával.
A formulát tartalmazza a help is, de konkrétan kipróbálhatod: Megcsinálod a hivatkozást egy megnyitott fájllal - amelyik máshol van -, majd bezárod a megnyitott fájlt. Látni fogod, hogy a hivatkozás átvált a teljes bekerülési útvonallal megadottra.
Ezen minta alapján a többi cella/fájl hivatkozást is meg tudod csinálni.
Kis ügyeskedéssel azt is össze tudod hozni, hogy egy táblázat alapján képlettel keletkezzen a hivatkozás,(Év-hó-nap) alapján indirekt függvény használatával - bár ez utóbbi pokoli lassúvá teszi a rendszert.Inkább azt javasolnám, hogy makróval helyezd el a képleteket, majd utána váltsd át a képletet értékre, hiszen az elmúlt időszak adatai gondolom nem változnak tovább, tehát amikor elkészültél, onnantól már csak a frissülő adatokhoz kell a képlet.
Üdv.
-
Fferi50
Topikgazda
válasz
Heno1974
#26378
üzenetére
Szia!
Esetleg megpróbálhatnád az excel adatkapcsolat varázslójával létrehozni a lekérdezést - makró rögzítéssel.
Aztán az eredményből vagy lehet tanulni, vagy nem.
Miután azt látom, hogy SAP objektumot hozol létre és azt szeretnéd programozni, akkor viszont szerintem az SAP oldal követelményeivel kell tisztában lenned és nem az excel oldallal.Üdv.
-
Fferi50
Topikgazda
válasz
tonermagus
#26362
üzenetére
Szia!
A másolás - beillesztés értékként lépést kihagytam a segédoszlopra.
Bocsi.
Üdv.
-
Fferi50
Topikgazda
válasz
tonermagus
#26357
üzenetére
Szia!
Szerintem két lépésben tudod megcsinálni. Az A oszlopban vannak az adataid, A1-től.
1. lépés:egy segédoszlopban végighúzod ezt a képletet: =helyette(A1;karakter(10);";")
Ezzel a "nem látható" sortöréseket átalakítod pontosvesszővé.
2.lépés:
kijelölöd a segédoszlopot. Adatok - szövegből oszlopok - tagolt - a tagoló pontosvessző, ezt kijelölöd. Beírod, hogy melyik cellánál kezdje a kiírást. Majd OK.Az eredeti oszlopod és a segédoszlopod is "eldobhatod" utána.
Ha az első lépésben nem cserél semmit, akkor meg kell nézned, hogy milyen karakter van a sortörés "helyén".
Ezt úgy tudod meg, ha egy cellában beírod =kód(közép(A1;2,1)), ha nem 0 van az A1 cellában az első sorban, akkor kiszámolod, hányadik karakter lehet a sortörés, azt a számot írod a 2 helyére.Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#26345
üzenetére
Szia!
Akkor valami "összeférhetetlenség" van az op.rendszer és az Excel között, nálam Win7 és Excel 10 van, mindkettő magyar és szépen megnyitja a dir függvény által visszaadott "Munkaidő nyilvántartó rendszer-új-2015.....xlsm" nevű fájlt is (a szóközzel és sok-sok ponttal közben.
Azt nem tudjuk, hogy nála milyen verziók vannak ezekből?
Üdv.
-
Fferi50
Topikgazda
Szia!
Bocsi, lehet, hogy nem követtem elég figyelmesen a témát. Hol van a makróban, hogy átnevezi a fájlt?
Mert én csak azt látom, hogy megnyitja a fájlokat, a sheets(1)-ben kicseréli amit kell, majd visszamenti a fájlt.Ennek nem lenne szabad problémát okozni - kivéve, ha angol az op rendszered, de akkor már az eredeti névben sem lehetne szerintem ékezetes betű - , hiszen csak mentés van és nem átnevezés.
Üdv.
-
Fferi50
Topikgazda
Szia!
Most aztán már végképp nem világos, mi lenne a feladat...
Ha jól értem, egy "összevissza" vezetett, lényegében egyetlen logikát tartalmazó (mármint csoporthoz rendeli a tagokat) munkalapról kellene egy rendezett táblázatot csinálni.
Ha most töltődik a táblázat, akkor eseménykezelésben nézném meg, hogy az új jövevény hova tartozik és attól függően szúrnám be a "kimutatás" táblába. De úgy látom, még naponta is figyelni kellene, ki mit csinál, amit szintén valami ilyen módon oldanék meg.
Ezt az eseményvezérelt táblát adnám oda "folyamatos kitöltésre" és a beíráskor kvázi azonnal aktualizálódna a rendezett táblád.
Egy szöveges példa:
Bejön Jocó az I csoportba 21-én: beírja, hogy Jocó - eseménykezelés - megnézem, hogy melyik csoport van fölötte - a saját táblámba beszúrnék egy sort az adott csoport végére és beírnám oda Jocót. Majd miután beírta 21-re a feladatot -eseménykezelés - beírja Jocó sorába a 21-hez a feladatot szintén.
Az eseménykezelést a Worksheet_Change eseménykezelő végezné a "zavaros" táblán történtek alapján.Üdv.
-
Fferi50
Topikgazda
Szia!
"A magyar függvényneveket meg én is utálom."
"Bár a CONCATENATE vs. ÖSSZEFŰZ esetén a magyar javára billen a mérleg
"Ennél az egy "függvénynél" - és szándékos az idézőjel - aztán végképp nem indokolt mérleget billegtetni, mert helyette az & jelet kell használni, egyszerűbb és sokkal rövidebb.
Üdv.
-
Fferi50
Topikgazda
válasz
Gandalf80
#26260
üzenetére
Szia!
1. kérdés:
"Megpróbáltam JOBB, ill. BAL szövegfüggvénnyel, de "számokká" váltak"
Mivel a dátumot számformátumban tárolja az excel, ezért ha a cella dátumformátumú, akkor nem ad helyes eredményt a szövegfüggvény manipuláció.
A dátum egész része a napot, a tört része pedig az órát jelenti. Tehát az egyik oszlopba a dátumod egész részét kell tenni - éééé.hh.nn formátumra formázva a cellát, a másik oszlopba pedig a "maradékot", idő formátumra formázva a cellát.2. kérdés:
"egy oszlopban található (adott naphoz tartozó) két nevet valamelyik keresőfüggvény kiszűrje, és beírja automatikusan"?
A kérdés az, hogy mivel van elválasztva a két név. A Szöveg.keres függvénnyel megtalálhatod az elválasztó karakter helyét, ellőtte van az egyik név (bal függvénnyel), utána van a másik név (közép függvény, vagy jobb függvény, hossz függvény kombó). A műszak helye pedig index és hol.van függvény kombóval található meg.Üdv.
-
Fferi50
Topikgazda
válasz
Geryson
#26241
üzenetére
Szia!
"Ja, hogy ezt a felhasználó szintű dolgot ezt programozni kellene?"
Néhány dolog megoldható (pl. tartományok módosítási lehetősége), tartományok védelme. De változó körülményeket csak programozás árán tudsz kezelni általában.
(pl. azt biztosan nem tudod menüből, hogy Kis Piroska csak egy munkalapot, Nagy Márton viszont kettőt lásson.)Üdv.
-
Fferi50
Topikgazda
válasz
Geryson
#26212
üzenetére
Szia!
Az Excel munkafüzet és munkalap védelmét érdemes átnézned. Ebben szerintem egy olyan rész van, ami felhasználóhoz köthető, a tartományok módosítási lehetőségének felhasználóhoz kötése.
Más jogosultság kezelésről nem tudok az Excel eszközei között. A felhasználó függő "korlátozások és beállítások" ügyét, ahogy korábban is írtam, neked kell meghatároznod és leprogramoznod. Kezdve onnan, hogy megnézed, ki lépett be (ezt meg tudja mondani az excel is pl. a munkafüzet userstatus tulajdonsággal, vagy az Applicaiton.Username tulajdonsággal).
Az információ alapján mutatsz neki lehetőségeket.Üdv.
-
Fferi50
Topikgazda
válasz
Geryson
#26206
üzenetére
Szia!
Több lehetőség is van rá.
Pl. indításkor bekéred a felhasználó nevét és jelszavát és a belépett felhasználótól függően határozod meg, hogy mit láthat és mit tehet. Viszont a felhasználókat és a hozzájuk tartozó jelszavakat és jogosultságokat neked kell nyilvántartani és kezelni.
Lehet védeni a munkalapot, illetve kijelölni felhasználótól függően módosítható területeket.
Elrejtheted az adatokat tartalmazó munkalapokat úgy, hogy csak programból lehet előhívni (visible tulajdonság xlveryhidden értéke).
A felhasználónak csak az adatbevitelre szolgáló munkalapot mutatod meg. Esetleg csinálsz egy userformot az adatbevitelre és azt egy teljesen üres/ vagy semleges munkalapon mutatod meg.Fontos, hogy legyen koncepciód, ki mit és miért tehet.
Üdv.
-
Fferi50
Topikgazda
Szia!
Akkor félreértettél:
"File = Pathname & "\" & Filename & "\*.xlsx"
Workbooks(File).Worksheets("Target").Cells(1, 1)"
Itt a File változó a teljes nevet tartalmazza. Ezt nem szereti ebben a pozícióban az Excel VBA, ide elég a Filename (amiben a kiterjesztés is benne van, legalábbis 2010-ig biztosan.
Viszont most látom: A Filename & "\*.xlsx" -ben miért is van benne a backslash? , illetve így a File fogja tartalmazni a * karaktert, ami aztán végképp nem szerepelhet a fájlnévben.
Szóval úgy néz ki, több sebből vérzik az elképzelés."Mondjuk az nem működhetne, hogy Workbooks(Dir(Source_file)).Worksheets?" Szerintem túlbonyolítod a dolgot, a Source_file is teljes, path-t is tartalmazó név, ezért nem felel meg. Másrészt, ha már megnyitottad, akkor csak a rövid név müxik.
Megnyitás nélkül pedig nem kell a Workbooks, csak a teljes fájlnév szögletes zárójelben, aposztróffal kezdve a több tag lehetősége miatt, utána a munkalap neve, aposztróf bezárva felkiáltójel cellacím.Üdv.
-
Fferi50
Topikgazda
Szia!
Ha ugyanabban a könyvtárban(mappában) van a forrásfájl, mint a célfájl, akkor elég a fájlnév a hivatkozásban, ha máshol van, akkor a teljes fájlnév kell hozzá, elérési úttal együtt.
Bezárt munkafüzetre való hivatkozás egyébként mindig a teljes fájlnevet használja (az előző pontban is, ha megnézed a beírás után, ha átlépsz egy másik cellára, a teljes fájlnevet fogod látni) a képletben.A dir függvény mindig csak a fájl elérési út nélküli nevét adja vissza. Elképzelhető, hogy ez a probléma.
Üdv.
-
Fferi50
Topikgazda
Szia!
Ebben a pár sorban van egy kis ellentmondás:
Workbooks.Open(Filename)
'Itt jön a másolgatás.
Range("B2").Select
Selection.Copy
Workbooks("Master.xlsx").Worksheets("Sheet1").Range(Cells(ActiveSheet.Usedrange.Rows.Count,1)).PasteSpecial xlPasteValues
A munkafüzet megnyitása után a megnyitott munkafüzet lesz aktív, eddig rendben.
A Select nélkül is lehet másolni: Range("B2").Copy
A bibi itt van szerintem:
Workbooks("Master.xlsx").Worksheets("Sheet1").Range(Cells(ActiveSheet.Usedrange.Rows.Count,1)).PasteSpecial xlPasteValues
mivel az ActiveSheet továbbra is az, ahonnan a másolást csinálod, azaz a megnyitott munkafüzet aktív munkalapja!
Helyette a Master fájl "Sheet1" munkalapjára kellene itt is hivatkozni. Ráadásul minden egyes file adatát ugyanabba a sorba (usedrange.rows.count) fogja beírni - azaz csak az utolsó fájl adata marad meg.
Ezen kívül a másolást lehet direktbe is csinálni:
Range("B2").Copy Destination:=Workbooks("Master.xlsx").Worksheets("Sheet1").Cells(Workbooks("Master.xlsx").Worksheets("Sheet1").UsedRange.Rows.Count + 1, 1)Természetesen a többi cella másolásánál már a UsedRange.Rows.Count kell.
Ha viszont csak az értéket szeretnéd átvenni, akkor működik ez is:
Workbooks("Master.xlsx").Worksheets("Sheet1").Cells(Workbooks("Master.xlsx").Worksheets("Sheet1").UsedRange.Rows.Count + 1, 1).Value=Range("B2").ValueÜdv.
-
Fferi50
Topikgazda
válasz
alevan
#26181
üzenetére
Szia!
A következő megoldást javaslom:
Sub fajlmasolo()
' A makró legyen a Master fileban, amit makróbarát fájlként kell a művelet elindítása előtt elmenteni!
' Így a Master.xlsm legyen a forrásfájlokkal egy mappában, ez a mappa mindegy, hogy hol van!.
Dim Filename As String, Pathname As String,xx as Double
Activesheet.Usedrange.Clear ' a munkalap tartalmát kitöröljük
'Hol vannak a fájlok
Pathname = ActiveWorkbook.Path
Filename = Dir(Pathname & "*.xlsx") 'Ha régi formátumban vannak, akkor .xls-re írd át.
xx = 1 'ez az első fájl helye - az első oszlop
'Menjen végig minden fájlon
Do While Len(Filename) > 0
'NEM KELL Megnyitni a forrást!!!
Cells(1, xx).Formula = "='[" & Filename & "]Sheet1'!B2" 'Sheet1 helyére azt a munkalapnevet kell írnod, ahol az adatok vannak a forrásfájlban.
Cells(2, xx).Formula = "='[" & Filename & "]Sheet1'!C8"
Cells(3, xx).Formula = "='[" & Filename & "]Sheet1'!B15"
' itt folytatod a kitöltést a fentiek szerint
xx = xx + 1 ' vesszük a következő oszlopba
Filename = Dir() 'a következő fájlt
Loop
ActiveSheet.UsedRange.Value = ActiveSheet.UsedRange.Value ' a képleteket átváltjuk értékre
MsgBox "A másolásnak vége!", vbInformation
End SubMakrót az Alt+F11 után "feltűnő" VBA ablakba tudsz másolni. A menüből ki kell választanod az Insert - Module opciót. Ezután tudod a modulba bemásolni.
A forrásfájlokat utána kitörölheted - vagy az újakkal felülírhatod és ismételten lefuttatod a makrót.
Üdv.
-
Fferi50
Topikgazda
válasz
bteebi
#26167
üzenetére
Szia!
Egy apróság van benne. A fajlnev változód a megnyitott fájl teljes nevét tartalmazza és így nem találja meg a megnyitott fájlok között, mert ott viszont csak a rövid név szerepel.
Ezért be kell egy sort iktatni:
End If
fajlnev=activeworkbook.name ' ezt kell beszúrni
For adat = 1 To 10Szerintem így már mennie kell. (De a szövegfeldolgozást továbbra sem értem, hiszen egyszer már megbeszéltük, hogy a számot nem lehet szövegfüggvénnyel darabolni.)
Üdv.
-
Fferi50
Topikgazda
válasz
bteebi
#26165
üzenetére
Szia!
Milyen hibát ír ki? Szerintem továbbra is az a baj, hogy nem szövegformátumból akarsz szöveget kivágni a left és len függvényekkel. Ez mire lenne jó?
De a fajlnev is okozhat problémát, mivel az egy szöveges (string) változó és nem objektum.
Ezért így kell használni Workbooks(fajlnev).Sheets("Sheet1"), de a szituációból kiindulva írhatod így is Activeworkbook.Sheets("Sheet1") (mivel megnyitás után ez lesz az aktív munkafüzet).A munkafüzet bezárása is hasonló: Workbooks(fajlnev).Close Savechanges:=False ez utóbbi paraméter alapján nem menti a változásokat és nem is kérdez rá, hogy szeretnéd-e menteni (nem is kell, hiszen a forrásfájlt nem változtatod).
Üdv.
-
Fferi50
Topikgazda
válasz
bteebi
#26162
üzenetére
Szia!
Az világos, hogy honnan szeretnél másolni, az viszont nem egészen, hogy hova.
Mert a "forrás" munkafüzet megnyitása után az abban levő munkalap válik aktívvá, tehát az itt
" For oszlop = 2 To 10 Step 4
'ebben a sorban valószínűleg több hiba is van:
ActiveSheet.Cells(19 + 2 * adat, oszlop) = 1000 * (Left(fajlnev.Sheets("Sheet1").Cells(36 + 2 * (adat - 1), 16), Len(fajlnev.Sheets("Sheet1").Cells(36 + 2 * (adat - 1), 16) - 1)))
ActiveSheet.Cells(19 + 2 * adat, oszlop).NumberFormat = "0"
Next oszlop"
hivatkozott Activesheet sajnos a forrás fájlodban van.Tehát ebben az esetben neked nem a forrás fájl hivatkozással van problémád, hanem a cél fájl hivatkozásával.
Ezt pedig úgy tudod megoldani, hogy az "eredeti" munkafüzeted kitöltendő munkalapját (amiből a többit megnyitod), egy változóhoz rendeled mielőtt még egy másik fájlt megnyitnál (pl.Set cellap=activesheet), mivel most még az az aktív munkalap.
Ezek után a számolás: cellap.cells(19+2*adat,oszlop) -ra kell hogy hivatkozzon és persze akkor fajlnev.sheets("Sheet1").cells helyett maradhat az Activesheet.cells."az eredeti adatok általános formátuma pl. "3.2k"" Ez azt jelenti, hogy mindig van a szám után egy betű és a formátum szöveg?
Ha igy van, akkor a használható a replace függvény is: replace(activesheet.cells(36+2*(adat-1),16),right(activesheet.cells(36+2*(adat-1),16),1),"").
Viszont a "beszúrt" programsorból úgy látom, az eredeti érték számformátum, ezért működik a közvetlen szorzás 1000-el, vagyis nem kell semmilyen levágás, átalakítás!Még valami: ahol Activesheet.Cells van, ott az Activesheet elhagyható, mert az az alapértelmezés.
Üdv.
-
Fferi50
Topikgazda
válasz
Delila_1
#26155
üzenetére
Szia!
Most nekem is összejött. Szerintem az a "siker kulcsa", hogy "simán" csak a kifejezést kell beírni képletként, azaz egyenlőségjellel kezdve. Ekkor megjelenik a kifejezés eredménye a kritérium cellában. (Tehát pl. =B2=C2 - ami igaz/hamis -ként jelenik meg- és nem ="=B2=C2", ami =B2=C2 -ként jelenik meg a cellában.)
Üdv.
(Az a szép az ilyen fórumokban, hogy mindig tanul az ember valami újat és hasznosat.)
-
Fferi50
Topikgazda
válasz
cellpeti
#26104
üzenetére
Szia!
Át kell menni a VBA ablakba. Alt+F11 billentyű.
Itt látod a VBA projektet (ha nem látod, akkor menüben view - Project explorer).
Abban van egy Thisworkbook nevű elem, ha rákattintasz kettőt, akkor megjelenik a kódlapja.
A bal oldali lenyílóból válaszd ki a Workbook -ot. Megjelenik egy
Private Sub Workbook_Open()
End Subkódkeret.
Ide kell bemásolnod amit írtam a korábbi hsz-ban.Üdv.
-
Fferi50
Topikgazda
Szia!
" ha az f mezőbe beírok valamit, akkor a d mezőbe beírja az aktuális dátumot, és időt."
Remélem oszlopra gondoltál...
If Not Intersect(Target, Range("F:F")) Is Nothing Then
For Each cl In Intersect(Target, Range("F:F")).Cells
Cells(cl.Row, "D").Value = Now()
Next
End IfÜdv.
(Elkerülheted a "hangulatjeleket", ha használod az alul levő programkód gombot.)
-
Fferi50
Topikgazda
válasz
cellpeti
#26098
üzenetére
Szia!
A Thisworkbook kódlapon a Wokbook_Open eseményben rejtsd el a többi munkalapot:
For each sh in worksheets
if sh. name<>"Munka1" then sh.visible=xlsheethidden 'vagy xlsheetveryhidden
next
Munka1 helyére beírod a láthatónak hagyott munkalap nevét.
xlsheetveryhideen esetében nem látszik a munkalap a munkalapfül listán sem.Üdv.
-
Fferi50
Topikgazda
válasz
SzlobiG
#26078
üzenetére
Szia!
"Nem kompatibilis visszafelé vagy mi?"
Bizony nem, vannak olyan eszközök a 2010-es excelben, amik nem működnek a 2007-esben. Pl. ilyen az adatérvényesítés, ha másik munkalapon levő tartományra hivatkozik. Ezt úgy lehet elkerülni, ha elnevezed a tartományt és az érvényesítésben a névvel hivatkozol rá. Így működik a korábbi verzióban is.
Üdv.
-
Fferi50
Topikgazda
válasz
slashing
#26063
üzenetére
Szia!
Sokmindenben egyetértek veled (s bár ez a topic a problémamegoldásról szól és nem a diskurzusról) még egy-két gondolatot megosztanék veled:
Ha a másik felet kérdezed - akkor a reakciók olyanok, mint amit leírtál: miért használunk excelt, miért így van programozva, mért ezt számol és nem mást, ráadásul a programozó azt sem tudja, mire szeretnénk használni (ez utóbbi nyilvánvalóan azért, mert maguk sem tudják, de jó ezt másra kenni).
A munkalapok "elrontását" szerintem egy módon lehet elkerülni: Nem szabad a táblát a felhasználó "kezébe" adni, hanem Userformokkal kell operálni adatbevitel céljából.
Lekérdezéses - szűrős - kimutatásos - diagramos munkafüzetet pedig csak olvasásra engedni megnyitni, csak "egy értelmes ember" kapjon módosítási lehetőségeket.Most befejezem, mert ugrik a netem.
Üdv.
-
Fferi50
Topikgazda
válasz
azopi74
#25992
üzenetére
Szia!
Nincs annak más baja, csak annyi, hogy az ArrayCol() tömb vízszintes, ezért ha a tömbképletet függőlegesen írod be, akkor csak az első elem kerül be minden sorban a cellába.
Ha egy sorban jelölöd ki a kimeneti cellákat, akkor szépen kiírja az eredményt.
De más baja is van. Ha nem oszlopban helyezkednek el a bemeneti cellák, hanem pl.sorban, vagy téglalapban, máris bukik a dolog hibával, mert csak a sorok számát nézed meg a tömb dimenzionálásánál.Ha oszlopban szeretnéd az eredményt kiíratni, akkor ezt az értékadást kell a végén alkalmaznod:
IntColor2 = Application.Transpose(ArrayCol())Üdv.
-
Fferi50
Topikgazda
válasz
Chesterfield
#25955
üzenetére
Szia!
Nézd meg légyszives a feltételes formázás beállításait.
Üdv.
-
Fferi50
Topikgazda
válasz
Fferi50
#25908
üzenetére
Kiegészítés:
Igaz, akkor az esetleges hibás értékek nem fogják kiakasztani. De előtte megnézheted, hogy van-e benne hibás érték egy
Set vanhiba=Activesheet.UsedRange.Find(what:="#",lookin:=xlvalues,lookat:=xlpart)
if not vanhiba is nothing then
msgbox "Hibát találtam a " & vanhiba.address & " cellában",vbinformation
exit sub
endifprogramrészlettel.
Üdv.
-
Fferi50
Topikgazda
válasz
azopi74
#25864
üzenetére
Szia!
Ez egy kissé bonyolultabb lett és hasonlít nagyon a tiedre:
HA(ÜRES(INDIREKT(VÁLASZT(MARADÉK(SOR()-10;4)+1; "E";"F";"G";"H") &INT( (SOR()-10)/4)+1));"";INDIREKT(VÁLASZT(MARADÉK(SOR()-10;4)+1; "E";"F";"G";"H") &INT( (SOR()-10)/4)+1))
A cella tartalom vizsgálat azért kell, hogy ne 0 kerüljön az üres cella értékeként a cél cellába.
Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#25865
üzenetére
Szia!
"Múltkorában azt mondtad, hogy egy felhasználói függvény nem módosíthatja a cella tartalmát" Ez így nem pontos - hiszen ahová beírod a képletet, annak a cellának a tartalmát módosítja (hiszen ezért írod be). A pontos fogalmazás az, hogy másik cella tartalmát nem módosíthatja.
"Amit te írtál makró az mégis tudja" Nem tudom, melyik makróra gondoltál (a munkanaposra valószínűleg).
Két különböző dolog van a VBA -ban: A függvény (function) és az eljárás (sub). A függvény meghívható a munkalapról is (ha betartjuk az ide vonatkozó szabályokat, mint pl. a fenti is), az eljárás viszont nem.Az as Date a végén azt jelenti, hogy a függvény visszatérési értéke dátum típusú lesz.
Az eljárások képesek módosítani más cellák - adott esetben másik munkafüzetben levő cellák - adatait és jellemzőit is.
Ennél persze "kicsit" bonyolultabbak a szabályok, az egyik lényeges viszont ez.
Ha másik állományból kell importálni adatokat, ahhoz is lehet akár függvény, akár eljárás a makró típusa (a nézet menü makró listájában csak az eljárások (sub) láthatók, azok közül is csak olyanok, melyek paraméter nélkül hívhatók).
Ha a problémát vázolod, akkor biztosan akad itt segítő kéz - több is akár.
Üdv.
-
Fferi50
Topikgazda
válasz
Agostino
#25886
üzenetére
Szia!
A Type mismatch hiba akkor következik be, ha egy változót nem a neki megfelelő értékkel szeretnél feltölteni.
Akkor tudnál közelebb jutni a probléma megoldáshoz, ha a hiba jelentkezésekor a debug gombra kattintasz. Ekkor megjelenik a VBA nézet és sárgával az a sor, amelyiken a hiba jelentkezik.Ezt a képet feltehetnéd. Az immediate ablakban (ha nem látsz ilyet, akkor a felső menüsorban view immediate) pedig meg lehet tudni, hogy melyik cella okozta a problémát. Ha beírod az ablakba: ? cella.address és nyomsz egy entert, kiírja a cella címét, ? cella.value enter kiírja a cella aktuális értékét, cella.select enter az adott cellára ugrik.
Utána átmész az excel ablakba és meg is nézheted a cella tartalmát.(Gondolom erről a makróról van szó:
For Each cella In Selection.Cells
If InStr(1, cella.Value, "!") <> 0 Then
cella.Value = "*" & cella.Value & "*"
End If
Next)Üdv.
-
Fferi50
Topikgazda
válasz
rigo99
#25857
üzenetére
Szia!
A10 cella képlete: =INDIREKT("E" &INT( (SOR()-10)/4)+1)
A11 cella képlete: =INDIREKT("F" &INT( (SOR()-10)/4)+1)
A12 cella képlete: =INDIREKT("G" &INT( (SOR()-10)/4)+1)
A13 cella képlete: =""Ezt a négy képletet másold végig az A oszlopon (4-gyel osztható cellaszámmal).
Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#25849
üzenetére
Szia!
Az idő "eltüntetésére" használhatod a Dátum(év(kiindulásicella);hónap(kiindulásicells);nap(kiindulásicella))képletet. Természetesen a saját jelöléseid figyelembe vételével.
Üdv.
-
Fferi50
Topikgazda
válasz
Emil-l
#25819
üzenetére
Szia!
Ilyen nagy állománynál nem szabad szűrést használni a műveletk előtt, mert duplán dolgoztatja a procit.
Nem tudom, mit jelent a hibás és hogyan állapítod meg. De a keres-cserél funkciót érdemes használni:
pl. keresed: röv. cseréled:rövidítés összes cseréje.Sajnos nem ismerem a 2013-as excelt. Nem tudom, hogy a Tisztít ott hogyan műxik, de továbbra is az a gondom, hogy az eredményét csak egy másik cellába lehet betenni, ami tovább növeli az adathalmazodat.
Ehhez is felesleges a szűrés, mert legfeljebb ugyanazt az eredményt fogja adni az új cellában, mint ami a régiben volt.Leírnád, hogy hogyan alkalmaztad a Tisztít képletet?
"Eddig nem próbáltam a makrót ... előbb akartam a tisztítást"
Ezeket a feladatokat is el lehet látni makróval és sokkal gyorsabb is lesz szerintem.
Üdv.
-
Fferi50
Topikgazda
válasz
Emil-l
#25810
üzenetére
Szia!
Az adathalmaz nagysága miatt ezek úgy gondolom - sajnos - nem feltétlenül irreális számok, attól függ hogyan csinálod.
Hány munkalap van a munkafüzetben? Vannak-e benne már képletek? Hány sor -oszlop? (Persze a méret az már önmagában mutat valamit, de nem mindegy a belső szerkezete sem.)
A keres-cserél funkciót milyen tartományon futtattad? Egy munkalap, egész munkafüzet?
Excel verzió?A tisztít képlet egy cellára alkalmazva fut 8 percig???
Ilyen feladatokra már ajánlatos a makrók használata - > képlettel csak új cellába tudod az adatot módosítani(kivéve cserél), makróval a meglevő cella tartalma is módosítható.
Szóval egy ici-picit több információra lenne még szükség.
Üdv.
-
Fferi50
Topikgazda
válasz
Emil-l
#25808
üzenetére
Szia!
Mit értesz függvény futtatása alatt? Ha egy képlet beírását egy cellába - és ebből szeretnél sokat, akkor kapcsold ki az automatikus számolást - képletek - számolási beállítások - manuális.
Beírod a képleteket, majd utána F9 a számolás végrehajtására (vagy visszaállítod automatikusra).Másik megoldás, hogy egy teljesen új munkafüzetet nyitsz az "elemzéshez", ide írod be a képleteket - természetesen a forrásadatokra hivatkozva (3 dimenziós hivatkozás - excel help). Ehhez első körben nyitva kell lennie a forrás fájlnak. A későbbiekben elég csak a frissítést kérni inditáskor vagy bekapcsolni, nem kell hozzá megnyitni a forrásfájlt.
Üdv.
-
Fferi50
Topikgazda
válasz
Smogus
#25790
üzenetére
Szia!
Nem tudom mit találtál az Excelben. 2010-ben a Fejlesztőeszközök Dokumentumpanel menüpontban elő tudod hozni a dokumentum ablakot, ahová megjegyzéseket is tudsz írni. Be lehet állítani, hogy mikor jelenjen meg. De ebben a menüpontban mindig elő tudod hozni az aktuális állapotát.
Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#25785
üzenetére
Szia!
"ettől lehalt az egész excel"
Igazad van, szégyellem magam miatta, mert ezzel belekergettem egy végtelen ciklusba a függvényt.
Ezt most kipróbáltam és működik. Magyarázatokat is fűztem hozzá:
Function munkanapos(ByVal mettol As Date, Optional hanynap As Integer) As Date
Dim unnepek As Range, munkanap As Date, napi As Range, napok As Date, napjai As Integer
Set unnepek = Sheet1.Range("G2:G19") 'itt vannak az ünnepnapok és a dolgozós szombatok
napjai = 0 'nulláról indul a munkanap számláló
munkanap = mettol
napok = mettol 'innen indulunk
Do While napjai <= hanynap 'addig kell a ciklust csinálni, amíg a munkanapok száma eléri a kívánt értéket
Set napi = unnepek.Find(what:=napok, LookIn:=xlValues, lookat:=xlWhole) ' benne van-e az ünnep listában a dátumunk
If Not napi Is Nothing Then ' ha benne van a listában a dátumunk
If Application.Weekday(napok, vbMonday) = 6 Then ' és az szombat, akkor ez munkanap
munkanap = napok ' tehát visszatérési érték lehet
napjai = napjai + 1 'növeljük a munkanap számlálót
End If
Else 'ha nincs benne a listában a dátum
If Application.Weekday(napok, vbMonday) < 6 Then ' és nem szombati nap
munkanap = napok 'akkor lehet visszatérési érték
napjai = napjai + 1 ' növeljük a munkanap számlálót
End If
End If
napok = napok + 1 ' növeljük a dátumunkat egy nappal
Loop 'és folytatjuk a ciklust
munkanapos = munkanap ' ha vége a ciklusnak, akkor a munkanap változó aktuális értékét kell visszaadni
End FunctionNem probléma a kérdés - akkor sem, ha több van. Viszont jónéhányra a VBA help-ben megtalálod a választ.
Pl. Range.Find paramétereinek a magyarázata (illetve egyáltalán a nevesített paraméterek használata).
Szerintem nem úszod meg, hogy alaposan átnézd legalább a VBA help átlalános részét.
Az unnepekben mint írtam, benne vannak a nem munkaszüneti nap szombatok is.
Ezért kell mindkét ágat használni.
If not = magyarul "ha nem" (not ugye a logikai tagadás). Tehát az adott helyen, ha nem semmi(üres) a napi változó értéke - azaz talált a keresés egy olyan napot a listában. Keresésnél ezt a formulát érdemes alkalmazni, mert így nem fogsz hibát kapni.
Ha egyből a keresés eredményével akarnál dolgozni - pl. az abban levő dátumot szeretnéd megtudni, akkor hibaüzenetet kapsz. Van még egy csomó ilyen finomság, amit kb.20 év alatt sikerült összeszednem és még mindig tanulok új dolgokat.
A Weekday a nap számát adja vissza valóban, de hogy melyik napot tekinti a hét első napjának, az a második paraméterétől (ami itt vbMonday) függ.
A növelés logikáját szerintem megérted a makróból.Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#25778
üzenetére
Szia!
A javított függvényemben is sikerült egy hibát benne hagyni, ezért nem úgy számol, ahogyan kellene.
A napjai = napjai+1 sort oda kell átirni, ahol a munkanap=napok sorok vannak, az után a sorok után, mivel csak akkor szabad növelni, ha munkanapot talált.
Tehát az a rész így nézne ki:
Do While napjai <= hanynap
napok = mettol + napjai
Set napi = unnepek.Find(what:=napok, LookIn:=xlValues, lookat:=xlWhole)
If Not napi Is Nothing Then
If Application.Weekday(napok, vbMonday) = 6 Then
munkanap = napok
napjai=napjai+1
End If
Else
If Application.Weekday(napok, vbMonday) < 6 Then
munkanap = napok
napjai=napjai+1
End If
End If
LoopTermészetesen az oszlopot is elnéztem, valóban nem a H, hanem az I oszlop adatait kell átírni a G alá. Mégpedig azért, mert a függvény logikája a következő:
Az ünnepek között felsorolt hétköznap (H-P) azt jelenti, hogy az a nap nem munkanap.
Az ünnepek között felsorolt szombat viszont azt jelenti, hogy az a szombat munkanap.Elnézést kérek a hibák miatt.
Üdv.
-
Fferi50
Topikgazda
válasz
pirit28
#25772
üzenetére
Szia!
Akkor nálad egyszerre van nyitva a két fájl egyazon alkalmazásban - ezt mutatja a kódod. Bár ettől még mindig nem értem, miért kell új Excel alkalmazást indítani hozzá - hiszen a makró az "anya" alkalmazásban levő munkafüzetben fut és ide hozzá lehetne nyitni a másik két munkafüzetet is. A fromBook és toBook ugyanúgy hozzárendelhető ezekhez itt is. Szerintem műxik a direkt értékadás - csak a tartományokat kell összehangolni, mert ez csak folyamatos egybefüggő tartománynál lehetséges.
Az időingadozás (de főleg a "lefagyás" tünet) oka lehet a hálózati hozzá(nem)férés időszükséglete is.
(Néha az én excelem is csinál ilyet, pedig csak egy gépen van - jól "elszórakozik" saját magával) Az automatikus mentésnek is van ilyen "fagyásosnak tűnő" hatása.Nem lenne baj, ha valahogyan szöveges formában is lehetne látni a kódokat. Ha így lehet látni a kódot, akkor nem tudod a modult exportálni vajon?
Üdv.
-
Fferi50
Topikgazda
válasz
KaliJoe
#25770
üzenetére
Szia!
Annál inkább nem ártana egy viszonylag pontos modellt összerakni és utána folytatni a történetet. Esetleg érdemes lenne utánanézni a neten, hátha másvalakinek is eszébe jutott már ilyesmi.
Maga a feladat pedig eléggé zsetonos formát kezd ölteni (úgy tűnik, nem "kisujjból kirázós").
Üdv.
-
Fferi50
Topikgazda
válasz
pirit28
#25764
üzenetére
Szia!
Azt szeretném megkérdezni, mi az oka annak, hogy új Excel applikációt töltesz be a program futásához. Annak a betöltése is időt vesz igénybe, másrészt akár befolyásolhatja az időzítőt is (bár ezt nem tapasztalatból mondom).
Ha csak az értékeket szeretnéd átmásolni, akkor "be lehet rántani" egy tömbbe egyszerre az egész tartományt és egybe ki is lehet írni a másik munkalapra, nem kell hozzá ciklus.
dim uploadA()
uploadA=Fsheet.range(cells(1,1),cells(80,36)).value
Tosheet.range(cells(1,1),cells(80,36)).value=uploadAés törölni sem kell a tömb értékét.
De szerintem még annál is gyorsabb a közvetlen értékadás:
Tosheet.range(cells(1,1),cells(80,36)).value=Fsheet.range(cells(1,1),cells(80,36)).value
Hiszen egyébként a két munkafüzeted együtt nyitva van.
Üdv.
-
Fferi50
Topikgazda
válasz
TrollBalint
#25744
üzenetére
Szia!
A #25749 hozzászólásomban levő függvény nem teljesen jó sajnos, mert nem a munkanapokat számolja, hanem csak a napokat. Javítottam, ezt próbáld meg légy szíves:
Function munkanapos(ByVal mettol As Date, Optional hanynap As Integer) As Date
Dim unnepek As Range, munkanap As Date, napi As Range, napok As Date, napjai As Integer
Set unnepek = Sheet1.Range("G2:G19")
napjai = 0
munkanap = mettol
Do While napjai <= hanynap
napok = mettol + napjai
Set napi = unnepek.Find(what:=napok, LookIn:=xlValues, lookat:=xlWhole)
If Not napi Is Nothing Then
If Application.Weekday(napok, vbMonday) = 6 Then
munkanap = napok
End If
Else
If Application.Weekday(napok, vbMonday) < 6 Then
munkanap = napok
End If
End If
napjai = napjai + 1
Loop
munkanapos = munkanap
End FunctionÜdv.
Új hozzászólás Aktív témák
- Nintendo Switch 2
- Brogyi: CTEK akkumulátor töltő és másolatai
- Milyen monitort vegyek?
- Path of Exile (ARPG)
- AMD Ryzen 9 / 7 / 5 7***(X) "Zen 4" (AM5)
- Kerékpárosok, bringások ide!
- PlayStation 3
- Apple AirPods Pro (2. generáció) - csiszolt almaságok
- Milyen billentyűzetet vegyek?
- Windows 11
- További aktív témák...
- The Elder Scrolls Online Imperial Collector s Edition
- Bitdefender Total Security 3év/3eszköz! - Tökéletes védelem.
- Számlás!Steam,EA,Epic és egyébb játékok Pc-re vagy XBox!
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
- Bomba ár! Dell Latitude 5290 - i5-8GEN I 16GB I 256SSD I 12,5" HD I Cam I W11 I Garancia!
- Gamer billentyűzetek /Akko/Monsgeek/Asus/SteelSeries/Das Keyboard/Ozone/Deltaco/DE/EN/UK/Számlával!/
- Okosóra felvásárlás!! Samsung Galaxy Watch 6, Samsung Galaxy Watch 7, Samsung Galaxy Watch Ultra
- iKing.hu Realme 14 Pro+ Pearl White 512GB használt karcmentes 6 hónap garancia
- ÁRGARANCIA!Épített KomPhone Ryzen 7 9800X3D 64GB RAM RTX 5080 16GB GAMER PC termékbeszámítással
Állásajánlatok
Cég: Laptopműhely Bt.
Város: Budapest

)
