Az „Excel” fórum célja, hogy keretet adjon az Excel felhasználók széles táborának tapasztalataik megosztására, és lehetőséget a segítséget kérőknek. Az alábbi összefoglaló azért készült, hogy segítse a helyes kérdésfeltevést.
– Írd le szabatosan a problémát. Úgy fogalmazz, hogy ne csak te magad, de a szakértő is megértse, mire szeretnél választ kapni.
– Írd le, hogy milyen verziójú Excellel dolgozol. (Vagy ha nem – ill. nem csak – Excel, akkor micsoda?)
– Írd le, hogy milyen úton indultál el, és hol akadtál el rajta.
– A kérdés megértése szempontjából sokat segíthet, ha feltölteszt egy képet, amin látszik, hogy mit szeretnél, vagy illusztrálja azt.
– Még jobb, ha feltöltesz egy minta munkafüzetet valahová (pl. data.hu). Feltöltés előtt távolítsd el belőle a nem publikus adatokat.
– Ha a feladat jellege olyan, célszerű az "előtte" és "utána" állapotokat bemutatni. (Miből kellene csinálni mit?)
– Ha VBA kódon kell javítani, másold be a releváns kódrészt. Rövid kód mehet hozzászólásba, hosszú kód inkább ide: http://pastebin.com/
– Ha valami nem úgy működik, ahogy kellene, add meg a rendellenes viselkedés jellemzőit, a hibaüzenetet, és a hibát okozó programsort.
Valamiért nem ismeri fel, hogy dátumot próbálsz meg bevinni.
Szerintem a következő a probléma: el van állítva a rendszer dátum formátuma vagy nem annak megfelelően próbálod bevinni a dátumot.
Nincs W11-em, de ha ugyan ott vannak a beállítások, akkor jobb klikk a tálcán a dátumon, majd "Dátum és időbeállítások", ott "Dátum, idő és regionális beállítások", majd "Adatformátumok módosítása", majd "További dátum-, idő- és területi beállítások", ott "Dátum, idő és számformátumok módosítása", majd "További beállítások", "Dátum" fül és itt láthatod a rövid és hosszú dátumformátumokat. Ezt módosítsd a neked megfelelőre és ennek megfelelően vidd be a dátumokat az excelbe. Ő ezeket fogja dátumként felismerni.
Önmagában 2026 dátum értékben teljesen korrekten 1905.07.18, mert az Excel dátum kezdete (1900.01.00) a 0 pont és attól számítva pontosan 2026 nap elteltével ez a dátum értéke.
Az Excel ugyanis minden dátumot (és időt) számként tárol, a dátum formátumot pedig így kezeli: Az egész szám a napokat, a számok tört része pedig a napon belüli időt jelenti. 1 nap 24 óra 1 egész, 12 óra az 0,5 míg 6 óra 0,25 számértéknek felel meg.
Ha csak a 2026-ot írtad be és nem írtál hozzá hónapot, napot, akkor a fenti eredményt kell kapjad dátum formátumban. Ha megváltoztatod a cella formátumot számra, szövegre akkor visszakapod a 2026-ot a cellában láthatónak (eddig is ott volt az, csak dátum formátumban megjelenítve, ahogyan a korábbiakban írtam).
Megjegyzem, ez nem Win, hanem Excel spedialitás, úgyhogy a korábbi office verzióban is egész biztosan így működött.
+ így szerintem mehet vissza az eredeti MSbox-os "okézós" üzenet is a felhsználói fileokba, mert a power Query -s adatkapcsolatot szerintem nem fogja megzavarni (legalábbis remélem, majd ha odajutok jelentkezem :-) )
Ezt is köszönöm. Bevallom még nem foglalkoztam korábban a feladatütemezővel ilyen szinten. Tudtam, h van, de hogy mire való, azt nem. Ez egy jó ötlet. Neki is estem tegnap, de nem boldogultam vele :-( . aztán néztem segítséget hozzá neten és több, mint valószínű azért nem működik, mert van egy olyan opció, hogy engedélyeznem kellene a "futtatás a legmagasabb szintű jogokkal" opciót, viszont az nálam le van tiltva az IT által, rendszergazdai jogosultág kell hozzá....
Végül olyan megoldást találtam alapnak, amivel egyelőre át tudom "szívni az adatokat" a master filebe, amivel egyelőre úgy tűnik működik a dolog.
Power Query - kapcsolattal kötöttem össze a felhasználói fileokat a masterfile-al. A master file megnyitáskor befrissül, és beállítottam rá még pluszban egy 5 perces automatikus befrissítési időismétlődést is. Teszt alapján (persze csak a saját gépemen), de jelenleg a master file megnyitáskor akkor is átszívja a friss adatokat, ha a felhasználói file nincs megnyitva és akkor is ha épp dolgoznak benne. (ha épp dolgoznak benne, akkor nyilván van benne egy 5 perces késés az új adatokkal, de az a mi helyzetünkben teljesen belefér.)
Szóval így jónak tűnik.
Persze még ott tartok a master file - elkészítésével, hogy megvannak az adatok benne és most fogom ráépíteni a többi funkciót. Ez még nincs kész, de legalább az alap úgy tűnik megvan, az adatok rendben befrissülnek benne.
Az előző válaszomból kihagytam a 2-es pontra való választ.
Erre létezik a windowsban gyárilag is lehetőség. Anno ezt a kollégám gépén állítottam be munkaidő vége utánra +15 perccel. Mert a monitorját is cseszett kikapcsolni és ha elment egy kamion az épület előtt, akkor az egér rázkódása felébresztette a monitort.
A start menüben megkeresed az "Ez a gép" ikont és ott rámész a kezelésre. A feladatütemezőben pedig létrehozol egy feladatot, aminek annyi lesz a dolga, hogy minden nap 16:10-kor elindítja azt az Excel dokumentumodat, ami a mester fájlod.
Én a leállítást egy batch fájllal oldottam meg. Ha jól rémlik, akkor volt benne egy 1 perces késleltetés, hogyha véletlenül még a gép előtt ülne (amire soha sem volt példa), akkor le lehessen állítani a leállítási parancsot.
A makró arra lenne jó, hogy ha megvan nyitva a mester fájl, akkor nem futna le a leokézandó makró. Viszont, ha nincs megnyitva, mert éppen dolgoznál benne, akkor ugyan úgy lefutna.
Eddig nem ismertem, de rákerestem és létezik automatikusan bezáródó "msgbox"
Sub Test1()
Dim AckTime As Integer, InfoBox As Object
Set InfoBox = CreateObject("WScript.Shell")
AckTime = 3
Select Case InfoBox.Popup("Click OK or do nothing within 3 seconds.", _
AckTime, "This is your Message Box", 0)
End Select
'ide jöhet a további kód
End Sub
Az "AckTime = 3" sor adja meg, hogy mennyi idő után záródjon be.
"365-ös verzió sajátossága" =>nincs 365-ös verzió, csak Office16
"arra nem emlékszem, hogy korábban veled néztük-e a gépnév ellenőrzést vagy sem" => igen, velem néztük Ez azért nem jó megoldás, mert nekem is van saját felhasználói fileom, ami így csak az én gépemmel nyitható meg.
A master file meg arra kell, hogy egyben lehessen benne látni az összes adatot ( a felhasználói file-ok adatait), napi frissítéssel. Ehhez a vezetőség kap hozzáférést a saját gépükkel megnyitva + ugye természetesen én, szintén a saját gépemmel megnyitva csak. Szóval az én gépem meg tudja nyitni a saját felhasználói fileomat és a master filet is.
"Ez csak akkor szükséges, ha így írod meg a makrót. A master file frissítő makróban simán kihagyhatod ezt a rákérdezést." =>A felhasználói file-okat úgy csináltam meg, hogy az autómatikus befrissülés a before open-be van bemakrózva. Azaz, amikor végig fut a before open parancssor / makrók, az után a végén jön a Msbox, a leokézós üzenettel. amikor leokézzák a MSboxot, akkor lesz a file használható.
Így, ha a masterfile-al nyitattom meg a felhasználói file-okat, akkor megnyitáskor lefut bennük a before open és így kérik a msbox leokézésát, ahhoz, hogy aztán a masterfile hozzá tudjon férni a bennük lévő adatokhoz és ki tudja azokat másolni. Amíg nincs leokézva "manuálisan" az msbox üzenet, addig lényegében nem nyílik meg a felhasználói file.
"Olvasásra akkor is meg lehet nyitni a fájlt, ha más éppen használja, a makróban ellenőrizheted, nyitva van-e már a fájl: megpróbálod megnyitni kizárólagosan, ha hibát ad, akkor nyitva van már." =>Az olvasásra megnyitás azért nem jó, mert ha jól tudom akkor abból nem lehet adatot másoltatni, vagy igen? (az olvasásra megnyitott file nem szerkeszthető - vagy nem jól tudom?)
Két gondolat: 1 - Meg lehet-e azt csinálni, hogy a felhasználói fileok megnyitásánál, a before open végén felugró msbox "csak" a szöveges üzenetet hozza és ne kelljen "leokézni" a msbox-ot ahhoz, h eltűnjön (mondjuk pl 10 másodperc után magától eltűnik) ?
2 - a felhasználói fileokat, mondjuk beállítom, hogy teszem fel minden nap 16:00-kor / a munkaidő végén automatikusan bezáruljanak. - ezt tudom, hogyan kell. Ezzel elérem, hogy minden felhasználói file be legyen 16:00-ra zárva, így egy időben aztán csak 1x lenne mindegyik megnyitva - elkerülve az 1 időben történő 2x-i megnyitást (felhasználó + master file által is megnyitva egyszerre). Így elkerülve, hogy a master file "csak olvasásra" tudja megnyitni a felhasználói fileokat és így tud már adatot kimásolni belőlük.
Ehhez mondjuk a master file-t meg bemakrózni úgy, hogy az meg mondjuk 16:10-kor nyíljon meg minden nap automatikusan és befrissítse önmagát, egyesével megnyitva - kimásolva - majd bezárva a felhasználói fileokat.. Ezt meg lehet oldani egyáltalán? mert ezt viszont nem tudom. Ha igen, akkor hogyan? azt a részét nem tudom, hogyan kell, hogy automatikusan 16:10 kor befrissüljön automatikusan - önmagától a master file.
Zárójeles megjegyzés: van olyan verzió, ahol lehet szimultán is dolgozni egy-egy fájlban. Ha jól rémlik ez az extra a 365-ös verzió sajátossága. Mivel olyannal nem rendelkezem, így sohasem próbáltam :)
@Andyyy42: Két ötletem is van. Egyrészt arra nem emlékszem, hogy korábban veled néztük-e a gépnév ellenőrzést vagy sem. Pl. ha a master fájlt csak te fogod futtatni és mindig ugyan arról a gépről és mások nem fognak azon a gépen dolgozni a saját dokumentumukkal, akkor meg lehet azt csinálni, hogy minden dokumentumba beleírod, hogy csak akkor fusson le a makró, ha nem XYZ gépen van megnyitva a dokumentum. Nyilván ennek hátránya, hogy ha valamiért gépet cserélsz, akkor az összes dokumentum makróját módosítani kell.
Másik megoldás, hogy nem a gépnevet ellenőrzöd, hanem hogy nyitva van-e a mester fájlod. Ezt pl. az alábbi makróval meg tudod csinálni:
Sub CheckWorkbookOpen()
Dim resultCheck As Boolean
Dim wb As Workbook
On Error Resume Next
Set wb = Application.Workbooks.Item("valami.xlsx")
resultCheck = Not wb Is Nothing
If resultCheck Then
Exit Sub
Else
'ide jön a saját makród
End If
End Sub
Ennek a módszernek is van hátránya. Ha sűrűn változtatod a mester fájlod nevét, akkor sűrűn kell a makrókat módosítani :)
"Ahhoz, hogy befrissüljön meg kell a master filenak nyitnia minden egyes felhasználó file-t és átmásolni magába az ott lévő adatot. Ezzel az a gondom, hogy a fent említett módon az egyes exel fileknál megnyitás után le kell okézni a msbox-ot, ahhoz, hogy megnyíljon a file, azaz a master file hozzáférjen az adatokhoz és át tudja másolni"
Ez csak akkor szükséges, ha így írod meg a makrót. A master file frissítő makróban simán kihagyhatod ezt a rákérdezést.
Olvasásra akkor is meg lehet nyitni a fájlt, ha más éppen használja, a makróban ellenőrizheted, nyitva van-e már a fájl: megpróbálod megnyitni kizárólagosan, ha hibát ad, akkor nyitva van már.
Igazából az a probléma szerintem, hogy mikor akarod frissíteni a master fájlt. Talán akkor lenne célszerű, amikor bezárja az aktuális felhasználó a saját fájlját - a before close makróban indíthatod.
van minden felhasználónak egy külön-saját excel file-ja, amiben dolgozik. ezek minden megnyitásnál automatikusan befrissülnek az új adatokkal. Megnyitás után, amikor "betölt" - azaz befrissül, a végén kiíratom Msbox-xal az üzenetet, hogy a "file-od befrissült az új adatokkal, használatra kész, stb..." Ezt nekik ugye le kell okézni, az msbox eltűnik, és lehet az excelben dolgozni.
Ezen kívül akarok egy master file-t még létrehozni, ami egyben tartalmazza mindenki saját excel adatait. Ezt is automatikus befrissítéssel oldanám meg, minden megnyitáskor
Ahhoz, hogy befrissüljön meg kell a master filenak nyitnia minden egyes felhasználó file-t és átmásolni magába az ott lévő adatot. Ezzel az a gondom, hogy a fent említett módon az egyes exel fileknál megnyitás után le kell okézni a msbox-ot, ahhoz, hogy megnyíljon a file, azaz a master file hozzáférjen az adatokhoz és át tudja másolni
1 gondolat: Ezt a lépést meg tudom oldani makróval? azaz a master fileban lefutó makró le tudja okézni a másik file Msbox üzenetét?
Mi van akkor, ha közben már meg van nyitva az egyes felhasználóknál a file és azt épp használják? akkor hogyan fut le a makró? ugyan azt a file-t meg tudja nyitni még 1x úgy h adatot is másoljon belőle?
2 gondolat:
Lehet olyan megoldást találni, hogy a master file úgy másoljon át adatokat az egyes file-okból, hogy azokat ne kelljen neki megnyitnia? (függetlenül attól, hogy azok éppen használatban vannak-e vagy sem)
a hétvégén sikerült foglalkoznom a témával. Végül más lett a vége.
"többszintű legördülő lista" =>nem feltétlenül kell, szóval egyelőre ez kimarad
"Ezt meg lehet úgy oldani, hogy a userformmal bevitt adatok automatikusan hozzáadódjanak a legördülő lista adataihoz? Azaz az dinamikusan frissüljön önmagától?" => itt pedig külön fülön tárolom a legördülő lista elemeit, amikor új adatot viszünk be, akkor azt az oszlopot makróval rendezem, kiveszem az ismétlődéseket és felülírom a külön fülön lévő legördülő lista elemeit, így az effektíve mindig "automatikusan és dinamikusan" befrissül, ha kerül hozzá új adat
A userformon mit használsz? Javaslom a Comboboxot. Ehhez hozzárendelhetsz forrás tartományt, amelyben tárolod a listaelemeket. A listába tennék egy új város/utca/házszám pontot, amit kiválasztva egy Textboxban megadható az új érték. Ezt feldolgozva hozzá lehet adni a lista forrásához.
Ha a város listából választ, akkor az utca listát szűrve megkaphatod az utca combobox forrását és így tovább. Ezek a makrók a Userformon belül az adott vezérlő feldolgozásához (eseményéhez) kapcsolódnak.
Vázlatosan kb. ennyi. Próbáld meg és az eredményhez tudunk hozzájárulni további segítséggel.
Példa: adatokat viszünk be mondjuk userformmal. pl: Városnév és utca és házszám
Azt tudom, hogyan lehet megcsinálni "manuálisan", hogy a városoknál, utcáknál, házszámoknál legyen legördülő lista és az legyen dinamikus. De ahogyan mondtam, ezt csak manuálisan tudom megoldani, azaz mindig hozzáírom az új adatokat a legördülő lista adataihoz.
Ezt meg lehet úgy oldani, hogy a userformmal bevitt adatok automatikusan hozzáadódjanak a legördülő lista adataihoz? Azaz az dinamikusan frissüljön önmagától?
Második lépcső:
ezt meg lehet-e még úgy pluszban csinálni, hogy a userformmal bevitt adatokkal autómatiukusan frissülő legördülő lista többszintű legyen?
azaz a már bevitt városhoz tartozó már bevitt utcákat hozza csak az utcánál lévő legördülő lista?
és ezt ugyan úgy a házszámnál? pl: Debrecen - Nagy János utca Kiss Tamás utca Tóth Lajos utca
Még nem jutottam odáig, de azt próbálom majd meg, hogy kilépés/mentés előtt (Workbook_BeforeClose) zárolom a táblázatot. Így újbóli megnyitásnál is már zárolva jelenik meg a teljes táblázat. Azt kell majd még kipróbálnom, h a zárolt táblázathoz, újbóli megnyitásnál engedi-e majd hozzászúrni a plusz sorokat.
Már van amúgy másik projectem is, ha őszinte akarok lenni .... :-)
Nagyrésze már a fejemben összeállt, hétvégén szerintem neki is ugrok és elkezdem :-)
Amit nem tudok még, hogy hogyan :-) ha az egyik fülön van egy táblázatos forma és azon a fülön zárolom a cellákat, hogy a táblázatot ne lehessen szerkeszteni. Ez az alapfelállás.
Egy makrógombbal szeretném megoldani majd, hogy a meglévő táblázathoz egy gombnyomással hozzáadjon + 1 sort (legutolsónak), ami nincs zárolva még és szerkeszthető, azaz manuálisan bele tudok írni (de a korábbi adatok zárolását ne oldja fel, azzaz, azokhoz ne lehessen nyúlni). Beleírás után ismét zárolni az egésztáblázatot (a kiegészített 1 vagy több sorral), hogy mentés után, újboli megnyitásnál, már ismét az egész táblázat zárolva jelenjen meg.
Aztán ha akarok, akkor megint tudok +1 sort vagy többet beszúrni a makrógombbal, menteni és így tovább.
Ennek még nem néztem utána neten, hogy hogyan. Esetleg erre van ötlet?
Felcseréltem a source-okat, ahogyan javasoltad, így igen, nekem is generálta a hibát.
aztán kipróbáltam, amit korábban javasoltál (de eddig vmiért még nem tettem meg :-( ), azaz ezt: "Megpróbálhatod még az On Error Resume Next sor elé beszúrni a következőt:
Az egyik a fő file, amit használunk. A másik egy másik helyen lévő adatfile, ami bizonyos időközönként frissül, új adatokkal.(ezt a file-t senki sem használja, csak én frissítem be az adatokat benne, a rendszerbe bekerülő új adatokkal, bizonyos időközönként)
Amikor megnyitjuk a fő file-t, az először befrissíti magát az adatfile adataival és a frissítés után használatra kész.
A fő fileban használom az Workbook_Open() rutint. azért, hogy csak akkor induljon el, ha az elérési útja az, amit megadok a Workbook_Open-ben ( azaz a tényleges helyét), ezzel úgymond megakadályozva, ha a filet lementi vki/áthelyezi máshová, akkor ne induljon el. Kizárólag abból a mappából lehessen megnyitni, ahol most van. + ehhez jön még a gépnév ellenőrzése is, h mindneki ne férjen hozzá, csak aki kap hozzáférést.
Még annyi kiegészítésként: Nem kell megvárnod a hétvégét és elkérni a munkatársad gépét.
A makróban cseréld fel a source1 és source2 nevét, ekkor a te gépedről először a másik gép elérési útja alapján szeretné megnyitni a fájlt.
Itt a második elérési útra (amit először fog keresni), adja a lehetséges hibajelzést.
Más:
Biztos, hogy a munkatársad gépén ugyanaz a makró van az általa megnyitott munkafüzetben, mint nálad? Lehetséges, hogy abban nincs is benne a hibakezelés?
A válasz szerint van egy Excel fájl, amiben fut a lekérdező makró. Ennek a fájlnak a nevét ellenőrzi a Thisworkbook.Fullname. Azt akarja, hogy a lekérdező makrót ne lehesen más helyről megnyitni.
Utána még ellenőrzi a számítógép nevét is.
Én úgy gondolom, hogy a Fullname lekérdezés már hibára fut az elején.
Azt javasoltam, hogy az elejére tegye bele az On Error Resume Next utasítást.
De a puding próbája az evés, meglátjuk mi történik.
Imre kérdése és az arra adott válaszod "világosított" meg.
"
Private Sub Workbook_Open() If ThisWorkbook.FullName = "Z:Mappa1Mappa2munka.xlsm" Or ThisWorkbook.FullName = "Z:KozosMappa1Mappa2munka.xlsm" Then Sheets("CP").Range("E10").Select Else: MsgBox ("...szöveg..." & vbCrLf & " ...szöveg...") ThisWorkbook.Close SaveChanges:=False End If
"
Itt a fullname lekérdezésekor nem fogja megtalálni szerintem.
Ha ide helyezed át első utasításként az On Error Resume Next utasítást, akkor nem lesz rákérddezés, úgy gondolom. Természetesen a további helyeken már nem kell megismételni ezt az utasítást.
Egyelőre csak azt nem értem, hogy mitől működik nálad az "If ThisWorkbook.FullName..." parancs a szándékod szerint. Lehet, hogy én nem tudok valamit? Ha az általad elindított programban megnyitsz egy munkafüzetet, akkor ez a parancs nem a megnyitott munkafüzet nevét kellene, hogy kiadja, hanem a saját nevét.
Vagy arról van szó, hogy már meg van nyitva a "Z:Mappa1Mappa2munka.xlsm" vagy a "Z:KozosMappa1Mappa2munka.xlsm", és ezt indítod el? Viszont akkor meg miért kell ellenőrizni, hogy ő maga meg van-e nyitva?
Szóval nem értem, de lehet, hogy nem is kell értenem.