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.
ActiveSheet.Shapes(1).Width = 566.9291338583 With ActiveSheet.Shapes(1).Line .Visible = msoTrue .ForeColor.RGB = RGB(0, 0, 0) .Transparency = 0 End With With ActiveSheet.Shapes(1).Line .Visible = msoTrue .Weight = 3 End With
Ezzel remekül tudtam méretezni, keretezni. Köszönöm :-)
Valóban, ha kijelöltem a képet, akkor indítható volt a makrórögzítő. Olyankor Selection.ShapeRange volt a neve, de az általad megadott nevet használva nem kellett kijelölnöm sem.
A VBA nézetben megtaláltam az "Objektumokat", de ott nem találtam a tulajdonságokat.
A beillesztett képet az aktív munkalapon kétféleképpen is megtalálhatod:
Shape illetve Picture objektumként, mindkettő gyűjteményben van, ha egy db van belőle akkor is. Az eltérés az, hogy másképpen érhetőek el a tulajdonságok.
Tehát az objektumod vagy set sh=Activesheet.Shapes(1) vagy set pict=Activesheet.Pictures(1) módon érhető el (sh és pict szabadon választott változónév).
A VBA nézet Objektum tallózójában a Shape tekintetében megtalálod a tulajdonságokat, a Picture nincs benne.
Egyébként szerintem ha kijelölöd a beimportált képet és utána indítod a makrórögzítőt, akkor működik pl. a jobb egérgombos parancs.
Hogyan tudnám a beillesztett képet módosítani? Ha makrórögzítéssel próbálkozom, akkor amint elindítom a rögzítést, a képpel nem tudok semmit kezdeni, nem lesz aktív. Hogyan tudom "megcímezni" a beillesztett képet. Keretet tennék rá, a méretét növelném.
Most már minden működik, ahogy kell. Sejtettem, hogy valami beállítás probléma lesz, mert már egy harmadik gépen is kipróbáltam, ahol szintén jól működött.
És igen, az oldalszámoknál is jelentkezett a probléma csak eddig nem tűnt fel, amiből látszik, mennyit használom a wordöt ezen a gépen :)
Mindenkinek nagyon köszönöm a segítő hozzáállását!
1. Az egy nappal ezelőtti leveledből (34399) az az egyetlen probléma, hogy a MERGEFIELD típusú mezőkódokat mutatja. Egyéb hiba nincs, hiszen azt írod: "Ugyanakkor a Levelezés menüpontban Befejezés/egyesítés (Mind) parancsra már mutatja a számokat."
Azt már meg sem merem kérdezni, hogy csak a körlevélben van így, vagy pl. az oldalszámoknál is? Mert lehet, hogy a Word beállításaiban van átállítva a mezőkódok megjelenítése a mezőérték helyett. Akkor pedig megnyitáskor ez az alapértelmezett.
Azért van egy-két dolog, amit nem értek a hibaleírásodból.
1. Az egy nappal ezelőtti leveledből (34399) az az egyetlen probléma, hogy a MERGEFIELD típusú mezőkódokat mutatja. Egyéb hiba nincs, hiszen azt írod: "Ugyanakkor a Levelezés menüpontban Befejezés/egyesítés (Mind) parancsra már mutatja a számokat."
2. Kicsit később (30404) azt írod, hogy "Az Eredmény megjelenítésére nem reagál semmit". Ez nem világos, hiszen ennek ugyanazt kell adni azon az egyetlen lapon, amit a befejezés és egyesítés. Nehezen tudom elhinni, hogy az egyik jól működik, a másik meg nem. Biztos, hogy ez a helyzet?
3. Ugyanitt azt írod: "A Mezőkód váltást is megcsináltam, végrehajtotta (a Mezőkód váltás azóta nem is látszik a jobb klikkben), de a helyzet nem változott"
Namármost, ha a Mezőkód váltás azóta nem is látszik a jobb klikkben, akkor valami nagy baj van. Ennek oda-vissza működnie kell. Biztos, hogy egy mezőkód fölött volt az egér, amikor a jobb klikket nyomtad?
Végül: "de a helyzet nem változott". Mi is akkor most a helyzet pontosan?
Ha biztos, hogy nem adatszerkezeti probléma okozza a jelenséget, akkor csak elállítódhatott a megjelenítés.
Jelöld ki azt a területet, amely az érintett Adatmezőket tartalmazza, majd a kijelölt terület fölött kattints az egér jobb gombjára, és a megjelenő listában válaszd a Mezőkódok - váltásra!
Tudom nem közvetlenül Excel probléma, de remélem tudja valaki a megoldást...
Van egy körlevelem, aminek - a hozzátartozó excel forrástáblával együtt - megváltozott a helye (másik gép/meghajtó/útvonal)
Természetesen az első indításkor beállítottam az új útvonalat, de a doc megnyitása után (miután rákérdez a frissítésre) nem tölti ki számokkal a táblát, hanem a Mergefield "mezőnév" formátum jelenik meg minden sorban.
Ugyanakkor a Levelezés menüpontban Befejezés/egyesítés (Mind) parancsra már mutatja a számokat.
Mit kell még beállítani, hogy doc megnyitása után közvetlenül már mutassa a forrásadatokat a levélben?
Elegáns! (És a lap alján még a hexeditoros is ott van! Éreztem, hogy megint csak a langyosvízet találtam fel. De nem árt az agytornázás, kevésbé hülyül el az ember...)
Mutatja az Openoffice is, csak meg kellett találnom:
De ez nagyon aprólékos, sok munka lenne, darabokból újra összerakni. Gondolkodtam, mi lehet a megoldás. Arra jutottam, hogy a jelszó csak "porhintés", mivel az Openoffice figyelmen kívül hagyja, és ott van minden. Csak egy jelző az Excel számára. Próbálkoztam, volt is némi eredmény (2007-es Excel). De ez az a rész, amit ha közzéteszek, esetleg BTK-s, így azzal aludtam el, hogy "csönd".
Ez a képlet húzható lefelé és jobbra is. A jobbra húzásnál most "Nincs több" értéket ír a cellába, amikor már nem talál az azonosítóhoz újabb értéket. Ha egyszerre húzod le, akkor nyilván több oszlopban is meg fog jelenni. Ezt csak szemléltetésül írtam be, helyette tehetsz üres szöveget ("") és akkor nem fog látszani semmi.
A "TRANSZPONÁLÁS" függvényben szeretném a segítségeteket kérni.
Adott egy táblázat mely két oszlopból áll. Első egy egyedi terméknév. Ez ismétlődik többször, és mellette a hozzá tartozó adatok vannak, de minden ismétlődésnél más az adat. Ezeket az adatokat kellene úgy áthelyezni oszlopokból sorokba, hogy az egyedi terméknév mellett megtalálható legyen az összes adat. Az érthetőség kedvéért készítettem két egyszerű mintatáblát. Egy előtte, és utána nézet. Csak a valóságban több ezer sorról van szó, így kézzel másol, beilleszt transzponálva nem jön szóba. :-(
Ugye létezik függvény, de nem jöttem rá, hogyan tudnám neki megadni az a tartományokat...
Tud magyarul. Tapasztalatom nulla, csak kaptam 5 éve, "Ha adnak fogadd el, ha ütnek szaladj el", és az MS offiszom 2007-es, ez újabb. Aztán úgy alakult, hogy (már akkor is) ritkán Excelezek, nem tanultam meg.
Egy Excel 2010-es meglehetősen összetett munkafüzetemet (természetesen xlsm) védtem le hozzá jelszóval. A gépem 64 bites, az Excel 32. A legelső válaszoló kódját másoltam ki egy másik munkafüzetbe, és tökéletes munkát végzett.
Ilyesmi érdekel engem is. Kipróbáltam, levédtem jelszóval kódomat. Gondoltam valamire, amivel ki tudom cselezni az xlsx védelem makró tiltását. Bevált. Némi korlátozással, de tudom olvasni a kódot.
Nincs valami mintafájlod, amit nem féltesz, és amivel ellenőrizhetném az elképzelésem alkalmazhatóságát?
Sok évi munkám van benne, rengeteg makrót tartalmaz és nem szeretném majd, hogy a tudtomon kívül minden fizetség nélkül tovább használják.
Végül is a segítségeddel sikerült a fájl törlése.
Lehet még jobb megoldás is, hogy minden feltűnés nélkül végig fut az éppen futtatott makró és mikor bezárják akkor törlődik, ... és ekkor fogják majd a segítségemet kérni:) mert ugye ma már mit adnak ingyen?
Ahogy nyitott munkafüzetet sem tudsz törölni - nem tud öngyilkosságot elkövetni, mert aktív. Máshonnan kell futtatni és a törlendő munkafüzet nem lehet aktív.
Én legalábbi nem tudok ilyet, akkor sem, hogy ha itt azt írják, hogy működik: (Persze lehet hogy rosszul értelmezek valamit)
Szia, előre is köszi a segítségedet. Valami miatt nem akarja törölni.
Ez a sub:
Option Explicit Public munkafuzet As String
Private Sub UserForm_Activate() Dim evszam As Integer
munkafuzet = Workbooks(ActiveWorkbook.Name).Name 'eltároljuk a munkafuzet nevét Sheets("Alap").Cells(1, 150) = munkafuzet evszam = 2019 If Year(Date) <> evszam Then MsgBox ("Nem futtatható a makró!")
On Error GoTo ErrorHandler With ActiveWorkbook If .Path <> "" Then .Saved = True .ChangeFileAccess xlReadOnly Kill ActiveWorkbook.FullName End If End With Exit Sub
ErrorHandler: MsgBox "Fail to delete file: " & ActiveWorkbook.FullName Exit Sub
'Set fso = CreateObject("Scripting.FileSystemObject") 'set file = fso.GetFile(munkafuzet) 'file.Delete.Force = True' End If
Abban szeretném a segítségetek kérni, hogy a makró futtatása során a makrót tartalmazó excelt lehet úgy törölni, hogy még a lomtárból se lehessen visszaállítani?
Ezt nem tudtam. Lehet, hogy ez volt az én esetemben is. Annál is inkább, mert nem szoktam használni az előnézetet, de akkor megtettem, hogy biztos legyek a dolgomban. Nahát ennyire sikerült:-)))
Akkor történik ilyen, ha az "Előnézet"-re nyomsz, akkor lenyeli az egyiket, visszakerülsz a "Válasz"-ba, akkor már csak egy van, amit a küldéskor tüntet el.
Mert szöveget kellene összehasonlítani és azok nem egyforma hosszúak. Arra emlékeztem, hogy Feltételes formázás - Ismétlődő értékek, de pl. 5 karakterig nézze a sorokat . pl.: Szilágyi az legyen egyenlő Szilágyszegivel. Két utcanévlistát kellene összehasonlítni de egyenként hosszú lenne
Nemrég jártam úgy, hogy a duplát is elnyelte. Valahonnan benne volt a stringben egy, én hozzátettem egy másikat, és mindkettőt elnyelte. Szerintem itt is valami ilyesmi történhetett. Hiszen Eredő Vektor próbálta újra, és mégsem sikerült.
Egyébként ezzel a módszerrel remekül lehet splittelni, bármilyen szeparátort meg lehet adni cellából neki. Így ezzel meg lehet spórolni a vba split függvényét ha makrómentes megoldás kell.
4.0-tól létezik. Mivel vba csak 5.0-tól volt ezért excel 4.0 makrófüggvényeket használtak helyette. A kompatibilitás miatt (is) máig meg is tartották - nagyon helyesen. Ne keresd a függvénylistában. Ha macrosheet-et nyitsz, ott megtalálod angolul.
Sima munkalapon is használható, de csak névadással.
tömbképlet, tehát ctrl+shift+enterrel kell bevinni!
persze a {12345678910111213141516171819202122232425262728293031} helyett lett megadni egy olyan tartományt is, ahol ugyanez a sorozat szerepel. (ez jelenleg egy tömbkonstans)
Tételezzük fel, hogy az A oszlopban vannak a számok.
1. lépés
Kijelölöd az A oszlopot. Adatok - szövegből oszlopok - tagolt - tovább - határoló jelnek bejelölöd a szóközt - tovább - Rendeltetési hely: C1 cella
2. lépés
Soronként kijelölöd
Először a C1-től az adatok végéig - Adatok - rendezés - folytatja az aktuális kijelöléssel - beállítások - balról jobbra - szint 1.sor Ok.
A további soroknál csak az aktuális kijelölést kell választanod és utána automatikusan jön a többi, csak ok. kell rá.
Ezzel megtörténik a sorba rendezés. Már "csak" össze kell fűzni.
3. lépés
A leghosszabb sor után 1 oszlopot kihagysz. Nálam az N oszlop következett így. Az N1 cellába a következő képlet került:
=C1 & " " & O1 (ha nem az N oszlopban kezded, akkor O1 helyett a következő oszlop legyen). Ezt végighúzod az első soron, addig, amíg a végén üres cellát kapsz.
A képlet lehúzható az N - X oszlopon - a leghosszabb sornak megfelelően. Ezzel az N oszlopban megkapod a rendezett számokat, szóközzel összefűzve.
4. lépés
B1 cella képlete: =N1 Ha nem itt kezdődött az előző lépésed, akkor annak a cellának a címét írd, ahol kezdődött.
5. lépés:
B oszlop kijelölése - másolás - irányított beillesztés értéket.
6. lépés:
C oszloptól minden adat törölhető a végéig.
Külön figyelmet érdemel a rendezés, mert azt csak soronkénti kijelöléssel szabad megcsinálni.
Eredmény (ahol látod még a segédek elhelyezkedését is):
Adott egy probléma, van egy cella amiben szóközzel elválasztva 1 illetve 2 jegyű számok vannak (persze valójában ez egy szöveg ami csak számokat tartalmaz) pl: A1 cella tartalma: 27 28 1 15 29 2 16 30 3 17 Azt szeretném elérni, hogy B1 cellába ez sorba rendezve kerüljön át tehát B1 cella tartalma: 1 2 3 15 16 17 27 28 29 30 ez legyen. Nem tudom valakinek van e ötlete akár egymásba ágyazott függvényekkel akár scriptel erre valami megvalósítást.
sok ilyen cella van egymás alatt és mindegyiket ilyen módon szeretném rendezni. ráadásul ami bonyolítja a dolgot, hogy a számok amikből a cella tartalma áll még darabszámra sem egyenlő, van olyan cella amiben csak 2 szám van van amiben 16 a benne felsorolt számok amúgy 1 és 31 között változnak.
Tudom sokkal egyszerűbb lenne, ha a számok cellánként lennének de itt pont ez a nehézség, hogy egy cellán belüli szövegbe rejtett számokat kellene sorba rendezni és újra egy cellába összefűzni.
Az Excel számtárolási módja miatt lehetséges. Mutasd meg a kétféle szorzás eredményét képen, meg azt is, hogy mit szorzol össze, mi van a két másik cellában.
Kérem szépen segítségetek! Van két cellám és ezt szeretném összeszorozni, de nem pontos összeg jön ki, más munkafüzetből érkezik a két szám cellája (pl. =fo!c5 és =fo!c6, igy szeretném összeszorozni a c5 és c6 cellákat, nem pontos érték van)?!Mi lehet a gond? Ha viszont egy cellában, összeszorzom a két számot, akkor jó! Köszönettel, Laci
A Select akkor szokott hibára futni, amikor olyasmit szelektálsz, ami nem az aktív munkafüzetben és/vagy munkalapon van.
Egyébként a cellatartalmak másoláshoz nem kell Select utasítással kijelölni sem a munkalapot, sem a másolandó tartományt. Ez csak a makrórögzítő szokása.
Átírtam a makródat, ha nem néztem be valamit nagyon, akkor ennek működnie kell.
Sub Helyett() Dim GN As Workbook, GNN As Workbook Dim NS As Long
Set GN = ActiveWorkbook NS = GN.Worksheets.Count
Workbooks.Add Set GNN = ActiveWorkbook
For i = 1 To NS - 9 GN.Worksheets(i + 1).Range("A1:ZZ100").Copy If GNN.Worksheets.Count < i Then GNN.Worksheets.Add after:=GNN.Worksheets(GNN.Worksheets.Count) GNN.Worksheets(i).Range("A1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Next Application.CutCopyMode = False End Sub
Próbáld ki, és ha OK, akkor válaszolok az esetleges további kérdéseidre a kóddal kapcsolatban.
nem vagyok egy rutinos makró készítő. A következő hibába futok bele, és nem igazán jövök rá, mit csesztem el...
A feladat célja lenne, hogy egy nagyobb méretű excel file néhány munkalapjának a tartalmát értékként ki kellene másolni munkalaponként egy másik munkafüzetbe. Erre csináltam egy ciklust, ami elvileg végigmenne az eredeti munkafüzet munkalapjain a 2. munkalaptól, illetve az utolsó 8 már nem kell. A 2. munkalapot még szépen ki is másolja, de amikor a 3. munkalap jön, akkor jön a hibaüzenet, hogy worksheet osztály select metódusa hibás. Mit cseszhettem el? Nem túl hosszú a kód, ezért megosztom:
Sub Adatmásolás()
Dim GN As String Dim GNN As String Dim i As Long Dim j As Long Dim OK As Boolean Dim NS As Long
GN = ActiveWorkbook.Name NS = Sheets.Count i = 2 j = 1 OK = False
Workbooks.Add GNN = ActiveWorkbook.Name
Do
Windows(GN).Activate Sheets(i).Select <===Ennél a sornál akad, de először lefut a ciklus Range("A1:ZZ100").Select Selection.Copy Windows(GNN).Activate Sheets(j).Select Cells(1, 1).Select Sheets(j).Paste Range("A1:ZZ100").Select Application.CutCopyMode = False Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False If i > NS - 8 Then OK = True Else Sheets.Add After:=ActiveSheet i = i + 1 j = j + 1 End If
Tehát a HKEY_CURRENT_USERSoftwareMicrosoftVBA7.0Common Dock sorában kell a registry értéket törölni. Majd az Excel az elindítása után újra beállítja az alapértékeket. Ha jól értelmeztem az egyéb kereséseimet, ez a registry elérés verziófüggetlen lehet. Nekem mindenesetre Excel 2010 alatt működött.
És megnéztem, a 4 nem teljes ablakban a Dockable be van kapcsolva, tehát ez olyasmit jelenthet, hogy ezzel rögzíti a helyét a rendszer.
Kösz, de éppen ezek nem működnek úgy, ahogy - szerintem - kellene. Nehezen állíthatók be, és ha látszólag sikerül, kilépés és újranyitás után elvész az egész. A Dockable meg a legrosszabb. Erre emlékeztem régebbről. Egész képtelen dolgokat művel. Nem is tudom, mit jelent. Tudom, hogy "dokkolható", de nem értem, hogy ez mit takar. Nálam széjjelhúzza az adott elemet, aztán alig sikerül visszaállítani.
Valami olyasmi kellene, hogy visszaállíthassam az Excel bizonyos háttérbeli alapbeállításait. Mert telepítés után még jó a VBA képernyő, de ha egyszer elromlott, utólag képtelenségnek tűnik ennek a visszaállítása.
Már másfél órája ezzel szórakozok, ahelyett, hogy az érdemi munkámat csinálnám.
Előre is bocsánat a lámer kérdésért, Excelben szeretnék legfeljebb 3 tizedesjegyre formázni számokat úgy, hogy az utolsó nullák ne jelenjenek meg, tehát pl. 1/2 = 0,5 (és nem 0,500), 1/3 = 0,333, 1/4 = 0,25, 1/5 = 0,2, 1/6 = 0,167, stb... Köszönöm előre is!
szerintem helyénvaló, hogy az indirektben használt külső hivatkozás csak "rányitott" álapotban működik.
Az ok pedig az, hogy az inderikt egy stringet értelmez, aminek nincs (nem is lehet) kapcsolata a fájlrendszerrel. Amíg egy más fgvbe direktbe ágyazott külcső csatolás látja a fájlrendszert, látja az excel is, hogy az egy külső csatolás.
Éppen egy interaktív programot írok sok Userformmal. Egy rossz mozdulattal elrontottam a megszokott VBA képernyőmet, és ezt a képet látom:
Megszoktam egy elrendezését a képernyőnek, ami úgy nézett ki, hogy minden Form és minden munkalap éppen kitölti a Project és Properties ablakoktól jobbra, és az Immediate és Locals ablakok felett lévő területet.
Ezért nem akarom teljes méretre állítani őket.
Próbáltam kézzel egyenként beállítani őket, de nem jegyzi meg a rendszer.
Ráadásul a módosulás applikáció szintű, tehát kihat az összes egyéb makróra is az adott gépen.
Van megoldás a következőkre:
1. Ha észreveszem, hogy egy rossz gombnyomással elállítódott, akkor visszaállítsam a korábbi állapotot. (AZ a baj, hogy ilyenkor hiába nem mentem a fájlt, az elrontott beállítás megmarad)
2. Ha igazítok a képernyő elrendezésen, hogyan tudom rögzíteni az állapotot?
Ami azt illeti, én a Symphonie-vel kezdtem, aztán jött a Quattro (vagy fordítva? ma már nem emlékszem pontosan :) . Azután jött az Excel, sok sok év használattal. De amit kerültem benne, az elsősorban az Indirekt függvény volt. Ennek bizony számolás lassító hatása van, azért, amit Delila is leírt. Van még pár ilyen Volatilis függvény. Ha lehet mindig kerülöm az ilyenek használatát. Ráadásul az Indirekt csak megnyitott fájlokat képes külső hivatkozások során kezelni (ahogyan írtad is).
Majdnem mindig lehet más - gyorsabb - függvényt használni.
Az INDIREKT volatilis függvény, ami azt jelenti, hogy a füzetben bármilyen változást követően frissül, újraszámol. Ehelyett sokkal gyorsabb az INDEX - HOL.VAN páros alkalmazása.
A nagy ugrás a 2003-as és a 2007-es Excel között volt, és a kezelés lényegesen bonyolultabbá vált.
A 2019-es szerintem az internetes megosztás területén nyújt több és komplikáltabb szolgáltatást 2016-nál, persze az adatforrással való szinkronizálás minimális szintjén, ami az ilyen munkát nagyon lelassítja (ld. outsourcing, home office stb.). Persze lehet, hogy az én ismereteim hiányosak, mindössze 35 éve fejlesztek Excel (Quattro, Lotus 1-2-3, dBase) bázison. (Emlékszik-e még valaki az Office 97-re...?)
Szinte kizárólag indirekt függvényeket használok, mert a működése sokkal gyorsabb - kimértem! - a többi kereső függvényénél. (Vajon miért ad hivatkozási hibát frissítéskor, ha nem megnyitott forrásra hivatkozik ellentétben pl. az fkeres - vlookup függvénnyel?)
A magam részéről a témát lezártam, a megmaradt időrabló Copy-Paste problémát majd valamilyen kerülő úton megoldom.
Szia! Köszönöm a segítséget! Ennyire nem értek hozzá megmondom őszintén, de utána nézek és megpróbálom megcsinálni. Ha nagyon nem megy akkor még jelentkezem ha nem baj :D
2. Ugyanez futott korábbi Excel verziókon XLS formátumban; a mostaninál sokkal nagyobb méretben - az XLSX formátum csökkentette le a mostani méretre.
3. Mindkét gépen ugyanazokat nyitom meg.
Kínomban (már az arcomat lekapartam:) ) behívtam egy üres munkafüzetet (Munkafüzet 1), beállítottam rajta a manuális számítást és elmentettem az XLStart-ba. Így - csodák csodája a kérdéses fájl is manuális számítással indult.
Most már csak azt kellene kitalálni, hogy egy Copy-Paste vagy Cut-Paste művelet miért tart kb. 2-3 percig, mikor a beállításokban minden háttér műveletet letiltottam?
Azért ahogy korábbiaknak, a 2019-es verziónak is vannak komoly hiányosságai...
Nem hiszem, hogy a méret lenne az oka. Hogyan van beállítva az adatkapcsolatok frissítése? Automatikus a megnyitáskor?
Másrészt a 11,6 Gb azért elég nagy, érdemes lenne megnézni, mitől lett ekkora. Ctrl + End billentyű kombináció a munkalap utolsó használt cellájára ugrik. Ha ez túl van az általad szükségesnek ítélt tartományon, akkor a felesleges oszlopot, sort töröld.
Rögtön kisebb lesz a munkafüzet mérete.
(Apropó, még egy kérdés: fizikailag ugyanazokat a munkafüzeteket nyitod meg mindkét gépen?)
Ugyanarról a telepítőről lett telepítve, verzió u.a.
Amit írtál a több munkafüzetben beállított számítási metódusról, valóban úgy van. Az applikáció szintű beállítással kapcsolatban kétségeim vannak, mert az Excel indítása után a kérdéses beállítás nem módosítható, csak ha a munkafüzetet behívtam.
Több munkafüzet esetén ezeket egységesen állítottam be manuálisra. A jelenség viszont akkor is fennáll, ha a kérdéses munkafüzetet mentem, majd újra nyitom. Úgy sejtem, hogy a fájl mérete (11,6 GB) okozhat gondot, mert kisebbeknél ilyet nem tapasztaltam. Bár marad a kérdés, hogy a sokkal gyengébb laptopon miért működik a beállítás hibátlanul?
A manuális számítási beállítás nem marad meg az asztali gépen?
A számítási beállítás Excel (applikáció) szintű, nem pedig munkafüzet szintű. Így amennyiben másik munkafüzetekben automatikus számítás van beállítva, az utána megnyitott munkafüzetben is automatikus lesz szerintem.
A számítások időigényét befolyásolja, hogy milyen tartományok vannak beállítva. Egész sorok/oszlopok (pl. A:A)
szerepeltetése a képletekben lényegesen lassítja a számolásokat. Ezeket érdemes kiküszöbölni konkrét tartományok használatával (A1:A20000)
A körbe csatoláson azt értettem, hogy mindhárom fájl adatai forrásai a másiknak, körkörösség nélkül.
A fájlok méret 2 - 9 GB
És még egy érdekesség: Az asztali gépen (64 bites 8 magos proci, ddr4 16GB RAM) mutatkozik a probléma. A gyengébb laptopon ugyanebben a környezetben megmarad a beállítás.
A csatolt képen látható az A, B, C oszlopban nevek, hozzá tartozó módozat és az ár. Ez egy jutalék lista ezért folyamatosan fog bővülni függőlegesen lefelé ahogy telik az év, ezért a nevek ebben a listában többször is benne lesznek.
Szeretném kigyűjteni ebből a listából nevenként és módozatonként az értékeket. Az E, F ,G oszlopba szeretném ezt kimutatni, de úgy hogy egy névhez tartozó módozat összes értékét a G cellákba adja össze vagy nekem az is jó ha adott sorban egymás után kiírja amit talál.
Cél: szeretném tudni, hogy egy adott névhez tartozó biztosítás (módozat) -ra mennyi pénzt kapok összesen.
Excel 2019-en futtatok többek között három fájlt, amelyek körbe csatolódnak. Az egyik 7500 sorból áll, amely frissítése kb. 35-40 sec. Hiába állítom be az átszámolást manuálisra, akkor is számol, és a következő megnyitáskor vissza áll automatikus átszámolásra, így egy egyszerű néhány adatos bevitel 5-10 perc.
Office XP, 2003, 2007 verzióknál ilyen probléma nem volt - bár a mentés előőti újra számolás perces nagyságrendű volt.
Ha tucc angolul, akkor van itt egy tipp, miszerint ha átállítod a munkafüzetet az 1904-es dátumrendszerre, az tudja kezelni a negatív intervallumokat, sőt még össze is adja őket.
Az Excel nem tudja a negatív időt/dátumot kezelni. Ezért az alábbi lehetőségeid vannak:
1. Amit Delila javasolt. Hátránya, hogy nem szám lesz a végeredmény
2. Használd az ABS (abszolut érték) függvényt az eredmény megjelenítésére. A negatív jelleget feltételes formázással emelheted ki (képlet A1>B1). Vagy segédoszlopban az A-B viszony alapján 1 és -1 értéket írsz, Ezzel számolni is fogsz tudni:
3. A C oszlopnál a cellaformátumot állítsd számra - ekkor megjelenik a negatív érték is. Mellette egy segédoszlopba váltsd át időre D képlete =ABS(C), formátum idő. Az összesítést pedig csinálhatod a C oszlop alapján. Vagy fordított sorrendben.
Köszönöm, jól jeleníti meg a keresett értéket, de nem tudom összeadni az oszlopban az értékeket, gondolom a szöveggé átalakítás miatt.....van erre is megoldás? Ez egy havi tábla napi bontásban.
Húzd be értéknek és sornak is azt a mezőt, amiben a rendelések vannak (PO, vagy akármi tartalmú mezők)
Így megkapod, hogy melyikből hány darab van az értékmezőben. A sormezőben pedig megkapod azt, hogy hány darab "egyedi" rendelésed van. (Persze meg kell számolni valamivel utóbbiaknak a darabszámát: pl DARAB() fgv.)
Mondjuk a kérdést úgy tetted fel, mintha ott ülnénk melletted a monitorodat nézve.:))
2019-es megrendeléses adatokból kell készítenem kimutatásokat megrendelés darabszám alapon.
Azonban mivel a rendeléseink több tételt is tartalmaznak, így a ha PIVOT-ba rendezem az adatokat, a rendelés darabszámnál gyakorlatilag éves rendelési tétel darabszámot kapok.
Hogyan tudom ezt a problémát kezelni a PIVOT-ban, vagy az az alap adatoknál függvénnyel?
( én azt néztem meg, ha egy külön oszlopban minden többször szereplő PO számnál csak az elsőre írna 1-et, a többi ua PO számnál 0-át, akkor már működne a kimutatás PIVOT-ban. De ehhez nem tudom a függvényt összerakni :) )
Benne van az üzenetben: "Ez a dokumentum makrókat, ActiveX-vezérlőket, XML nyelvi bővítőcsomagokkal kapcsolatos információkat vagy webösszetevőket tartalmaz. Ezekben szerepelhetnek olyan személyi adatok, melyeket a Dokumentumfigyelő nem távolít el."
A makrókban stb. szereplő személyes (érzékeny) adatokat az Excel dokumentum figyelő szolgáltatása nem tudja eltávolítani.
Tehát, ha nem szeretnéd, hogy ilyen adatok mentésre kerüljenek a munkafüzettel, azokat neked kell kézzel kigyomlálni ezekről a helyekről. Ha ilyen adatok nincsenek, akkor bátran hagyd a figyelmeztetést figyelmen kívül.
Meg tudnátok mondani, hogy tudom megtalálni a probléma forrását a következő üzenetnél?
"Biztonsági figyelmeztetés: Ez a dokumentum makrókat, ActiveX-vezérlőket, XML nyelvi bővítőcsomagokkal kapcsolatos információkat vagy webösszetevőket tartalmaz. Ezekben szerepelhetnek olyan személyi adatok, melyeket a Dokumentumfigyelő nem távolít el."
"Nekem alapból nincs olyan cellán, ami tartalmazná a mai dátumot.
Nos, akkor miből fogod tudni megállapítani, hogy megnyitották-e ma már munkafüzetet?
Szerintem "ki kell nevezni" egy cellát, amiben a napi dátumot tárolod - értékkel és nem a ma() függvénnyel! - . Ezután a fájl megnyitásakor ezt kell összehasonlítanod a mai dátummal.
Ha a cella üres (mert első alkalommal amikor az ellenőrzést indítod, lehet akár üres is - minden más esetben már benne lesz egy dátum), vagy a cellában levő érték kisebb mint az adott nap, akkor megy a figyelmeztetés, egyébként kihagyható.
Nekem alapból nincs olyan cellán, ami tartalmazná a mai dátumot. Azt külön nekem létre kell hoznom? Vgay van más módja, hogy érzékelje, hogy mi a dátum és hogy aznap először nyitják ki, vagy már volt nyitva?
Sziasztok Segítségeteket szeretném kérni. Adott egy sok1000 soros lista. Az egyik oszlopában (itt most ez a "B" oszlop) szerepelnek adatok amiben keresnem kell szavakat. A cél az lenne, hogy egy adott cellában valahol szerepel az adott szó, akkor azt írja ki egy másik oszlopba. Tök jó, mert a SZÖVEG.KERES és a HA függvényekkel ez megoldható.... hittem én.
A probléma az, hogy a HA függvény csak az első feltételt értékeli csak ki. Az is érdekes, mert amúgy hibát mutat a B1 -es cella kiértékelésekor (#érték) mert ugye abban a cellában pont nincs ilyen szó, ellenben a következőben (B2) már van és jól ki is írja (SA) A 3. ban is van és arra már nem hozza az eredményt (admin).Itt ugye a feltétel már az első HAMIS ágon van. Arra tudok gondolni, hogy a Ha függvény első feltételének #érték hibája miatt nem ugrik a HAMIS ágra, de akkor az IGAZ-ra miért ad jó eredményt? Biztos én nézek be valamit de nem tudok rájönni :(
Hogy jobban lehessen látni a C oszloptól látható a szöveg.keres függvény eredménye külön-külön, látható, hogy a feladatot elvégzi, kiírja hogy hányadik karinál kezdődik az adott szó. Ezeket szeretném (C,D,E) több HA függvény egymásba ágyazásával kiíratni, úgy, hogy ha az érték nagyobb mint 0 akkor írja ki hogy Service accounts (SA), vagy Admin, stb szavakat az A oszlopba. A special-t már nem csináltam meg de az sem működik az eredeti táblámban.
(nyilván a C,D,E oszlopokra nincs szükség, csak kíváncsi voltam, hogy amúgy működik-e :) )
Nézd meg, hogy az erre szolgáló cellában van-e már mai napi dátum. Ha nincs,
a cellába jegyezd be a nyitás időpontját. Add ki a figyelmeztetést.
Ha van, nem kell figyelmeztetés.
Workbook Open eseményhez így jutsz:
Alt+F11 A bal oldalon fel vannak sorolva az objektumok. Kattints kettőt a Thisworkbook-ra. A bal oldali lenyílóban válaszd ki Workbook. A jobb oldali lenyílóban Open. Ide írhatod az utasításokt.
Segítséget szeretnék kérni. Azt szeretném megoldani, hogy ha valaki kinyit egy konkrét munkafüzetet, akkor az nem számít, hogy egy napon belül hányszor nyitja ki, de a napi első kinyitáskor jöjjön fel egy figyelmeztető üzenet, hogy nehogy elfelejtsen egy konkrét beállítást megcsinálni, mielőtt dolgozni kezd a táblázat adataival
' ~˘O=o> --------!!!! AZ AUTOFILTER TurnOFF !!!!-------
If ActiveSheet.AutoFilterMode Then If ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If ElseIf ActiveSheet.FilterMode Then ActiveSheet.ShowAllData End If
' --------!!!! AZ AUTOFILTER TurnedOFF !!!!------- ~ˇO=o>
Ha VBA debuban Shift+F8 cal végiglépkedek neki, akkor pedig simán elvégzi.
Ez a makró nem fut le automatikusan, minden egyes beírás után el kellene indítanod. Viszont ha egyszer lefuttattad, akkor ajánlom figyelmedbe a 34274 hozzászólásomat, amiben az eseménykezelésre adtam példát:
A munkalap kódlapjára az eseménykezeléshez pedig érdemes bevinni a következőt:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Offset(1, 0).EntireRow.Hidden Then Target.Offset(1, 0).EntireRow.Hidden = False End If End Sub
Ebben az esetben ha az utolsó sorban bármelyik oszlopba írsz valamit, automatikusan hozzáadódik egy új üres sor.
(Figyelem: Ha az üres sor előtti sorban kitörölsz mindent a cellákból, akkor nem fog az utána levő üres sor elrejtődni.)
a makró igy müködik nagyjabol müködik. De valahogy nem teljesen ugy ahogy szerenem:
Sub X() Dim rng As Range, ws As Worksheet Set ws = ActiveSheet Application.ScreenUpdating = False ws.Range("B:B").EntireRow.Hidden = False 'minden sor megjelenítése Set rng = ws.Range("B" & ws.Rows.Count).End(xlUp) 'legalsó értékes cella az A oszlopban On Error Resume Next ws.Range("B15", rng).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True 'legalsó értékes cella fölött az üres sorok (ha vannak) eltüntetése Range(rng.Offset(10), rng.End(xlDown)).EntireRow.Hidden = True 'legalsó értékes cella alatt 2-vel, és onnantól lefelé az üres sorok eltüntetése Application.ScreenUpdating = True End Sub
igy irtam át.
A problemam a makroval hogy a ws.Range("B15", rng) resznel ha beirok mondjuk a B oszlop 15. cellajaba valamit nem ad hozza automatikusan az uj üres a B16 cella szamara egy sort.
Illetve szamomra az is fontos lenne hogy ugyan ezt megcsinalja a többi oszlopnal is.
Köszönöm. Nálam csak a textbox change és a textbox beforeupdate jön számításba, és ezeknél igyekszem nagyon szigorúan használni az enableevents-et helyettesítő változómat. Éppen ezért nem találtam nyomát annak, hogy egyes helyeken miért volt más a tartalma, mint amit vártam. (Erre teszt üzemben figyelő és szükség esetén leállással egybekötött figyelmeztető üzeneteket helyeztem el, így derült ki egyáltalán a hiba)
Megjegyzem, ma regdélelőttel, amióta tudom, hogy a Call Stack ellenőrizné az odavezető utat, egyszer sem jelentkezett a hiba.
- Nincs-e esetleg ez a változó tévedésből több helyen definiálva. Pl. globális változóként valahol egy kódodulon, és még privátként is a userform kódlapján, esetleg szubrutinon belül is? Nálam időnként előfordul, hogy programírás közben paradigmát váltok, újratervezek, egy lokális változót átteszek globálisba, de elfelejtem törölni a lokális deklarációt. Aztán nézek furán, hogy miért csinálja a program azt, amit.
- Előfordulhat-e, hogy egy olyan eseménykezelő is lefut, amire nem gondolsz? Pl. ha programból módosítod egy control értékét a userformon, az a control Change eseményét is kiváltja. Vagy ha a form-on manuálisan módosítasz egy textbox-ot, akkor ezek mind játszhatnak:
textbox enter textbox change textbox beforeupdate textbox afterupdate textbox exit
"Ps.(úgy gondolom, mindezeket te a kisujjadból kirázod egyébként."
Dehogy. Éppen az a másik fő érvem a GoTo 0 használata mellett, hogy számomra sem teljesen tiszta, meddig tart a különféle hibakezelések hatása.
Mondjuk, ebben a konkrét Resume Next esetben meg voltam győződve arról, hogy az elképzelésem helyes, azért előbb utána kellett néznem, hogy nem hülyeséget írok-e le :-)
Köszönöm. Halványan emlékeztem, hogy néhány éve te említettél valakinek a kérdésére egy ilyen lehetőséget. Most, hogy megírtad, már be is ugrott, ez volt az a parancs. Csak akkor nem foglalkoztam vele, de most kipróbálom. Szerintem ez lesz nekem a megoldás.
A másik lehetőség nekem is eszembe jutott, csak bonyolult lenne minden meghívott Sub/Function elejére beírogatni.
A lépésenkénti futtatás nem megoldás itt, mert teljesen váratlanul jön elő a hiba. Látszólag ugyanazon az útvonalon kétszer nem jelentkezik, harmadszorra, vagy negyedszerre igen.
A Watch window meg ugyanezért lenne nehézkes. Hiszen az adott változó True/False beállítását túl sűrűn használom ahhoz, hogy informatív legyen a megállás az egyes váltási pontokon.
Ha egymásba épülő hívások vannak, akkor a Call Stack megmutatja, honnan jutott oda a program, rekurzíve vissza lehet nézni.
Viszont ha különböző rutinok egymás után (egymás mellett) futnak, akkor ez az út nem járható.
Ilyenkor szerintem a Debug.Print "programnév", változó értéke adhat segítséget. (A programnév az amit szövegesen megadsz, hogy honnan íratod ki a változót.
No és persze a lépésenkénti futtatás és a változó figyeltetése (Watch Window) is segíthet.
Sziasztok, tudtok valami olyan eszközt, ami a program egy adott pontján megállítva megmutatja a program útvonalát visszamenőleg 2-5 végigjárt szubrutin/funkcióhívás megadásával?
Van egy változóm, amit az EnableEvents kiváltására használok UserFormokon, és időnként számomra váratlanul más értéket, mint amit - hitem szerint - a lehetséges útvonalon megadtam neki. Ahol téves az érték, ott megállítom, de nem találom az eltérés okát. Ezért lenne jó látni akárcsak 2-3 előzmény helyet, hátha ott kerül téves vágányra a program.
Persze, értem. Már az előző bejegyzésem is arról szólt, hogy tévedésben voltam ezzel kapcsolatban. Egy nagyon régi emlék, ami ezt hitette el velem, egy nagyon nehezen kinyomozott hibajelenség. Már csak halványan rémlik, hogy egy resume next miatt átugrott hibát nem vettem észre. Nyilván ugyanabban a szubrutinban volt a második is, csak én akkor - tévesen - azt a következtetést vontam le a jelenségből, hogy a hatás a kikapcsolásig tart. Így most tanultam valamit.
Ha már ennyire belemerültünk a hibakezelésbe, még egy megjegyzést engedj meg:
A "főprogramban" kiadott hibakezelési utasítás kihatással van az "alprogramra- szubrutinra" is, ha abban nincs újabb hibakezelési utasítás.
Az On Error Resume Next utasítás esetén az alprogram hiba utáni része nem kerül végrehajtásra, a vezérlés visszakerül az alprogram meghívása utáni utasításra.
On Error Goto cimke utasítás esetén visszaugrik a hiba esetén a hibakezelési cimkére és szintén nem megy tovább az alprogramban.
Tehát a hibakezelésre minden esetben figyelmet kell fordítani.
Üdv.
Ps.(úgy gondolom, mindezeket te a kisujjadból kirázod egyébként.)
Sub main() Dim rng As Range subr Set rng = Range("A" & Rows.Count).Offset(1) End Sub
Sub subr() Dim rng As Range On Error Resume Next Set rng = Range("A" & Rows.Count).Offset(1) Debug.Print "túl vagyunk az 1. hibán" Set rng = Range("A" & Rows.Count).Offset(1) Debug.Print "túl vagyunk a 2. hibán" End Sub
Elvben jogos, szoktam is használni a GoTo 0-t, pont azért, amit leírtál.
Ebben a speciális esetben azért nem tettem bele, mert
- az On Error Resume Next élettartama a szubrutin végéig tart,
- a szubrutin végéig egyetlen egy kódsor van, ami hibára futhat,
- ha a hiba bekövetkezik, akkor az azért lesz, mert a felhasználó az A1048575 cellába ír adatot (mekkora ennek a valószínűsége?), és itt az Offset(2) lesz problematikus
- de ez esetben szerintem nem is baj, ha az Excel nem ad a hibaüzenetet.
Igen, lehet automatizálni, csak jól körbe kell járni minden eshetőséget, pl. mi van, ha nem beír, hanem töröl egy adatot, ha egyszerre több cellát módosít, stb.
Én ha automatizálni akarnám, akkor az eseménykezelőből inkább a saját szubrutinomat hívnám meg, mert az már a kész, letisztult helyzet alapján dolgozik.
A munkalap kódlapjára az eseménykezeléshez pedig érdemes bevinni a következőt:
Private Sub Worksheet_Change(ByVal Target As Range) If Target.Offset(1, 0).EntireRow.Hidden Then Target.Offset(1, 0).EntireRow.Hidden = False End If End Sub
Így ha az utolsó (vagy egy elrejtett sor fölötti) sorba ír, az alatt levő felfedődik automatikusan.
Sub X() Dim rng As Range, ws As Worksheet Set ws = ActiveSheet Application.ScreenUpdating = False ws.Range("A:A").EntireRow.Hidden = False 'minden sor megjelenítése Set rng = ws.Range("A" & ws.Rows.Count).End(xlUp) 'legalsó értékes cella az A oszlopban On Error Resume Next ws.Range("A1", rng).SpecialCells(xlCellTypeBlanks).EntireRow.Hidden = True 'legalsó értékes cella fölött az üres sorok (ha vannak) eltüntetése Range(rng.Offset(2), rng.End(xlDown)).EntireRow.Hidden = True 'legalsó értékes cella alatt 2-vel, és onnantól lefelé az üres sorok eltüntetése Application.ScreenUpdating = True End Sub
A kommentekez kiegészítésként: az minősül "üres sornak", amelynek az A oszlop metszere üres cella.
A munkalapodból valószínűleg azért látszik csak 200 sor, mert a többi el van rejtve. Ha a fenti makrót lefuttatod, hasonló eredményt kapsz majd, olyan értelemben, hogy a munkalap alsó (üres) sorai nem fognak látszani.
Sziasztok! A segítségetekre lenne újra szükségem egy feladathoz.
Egy makrót szeretnék írni.
Amit el szeretnék írni hogy egy olyan munkalapom legyen amelynek csak annyi sora van amennyit kitöltök és +1 sor.
+1 sor hogy persze ha valami plussz dolgot szeretnék beleírni akkor azt meg tudjam tenni.
Illetve +1 sor hogyha abba a sorba beleírok magától hozzon létra a makró egy új sort azonnal ahova megint tudok írni.
Igy kezdtem el.: (Ez csak az elrejtésre jó ugye illetve létrehoz +1 üres sort)
Sub Zeilen_elrejtes() Application.ScreenUpdating = False For i = 1 To 200 If Cells(i, 1).Value = "" Then Rows(i + 1).Hidden = True End If Next i Application.ScreenUpdating = True Range("A1").Select End Sub
A munkalapomon eleve valahogy csak 200 sor látszik a többi része lefelé a munkalapnak teljesen szürke.
Ezt is szerettem volna megkérdezni hogy hogyan lehetséges egy excelben ilyen határt szabni úgymond a munkalapnak.
A kérdésem az lenne hogy hogyan tudok sort hozzáadni a már meglévő előző makróhoz azt sajnos nem tudom megoldani.
Még annyi esetleg, hogy ha nem akarom, hogy a kérdés után újra feljöjjön egy leokézó gomb (törlöm / nem törlöm), akkor csak simán kiveszem az alábbi 2 sort?
(Mondjuk, azt nem értem, hogy miért nem kérdezi meg, hogy törölhető-e, lehet, hogy épp védett cellával próbáltad?)
Egy picit módosítva a makró:
Sub nodelete() If ActiveSheet.Name <> "DOSSZIÉ" Then Selection.Value = "": Exit Sub If Not Intersect(Selection, Range("$C$9:$AE$130")) Is Nothing Then If MsgBox("Valóban törölni szeretnéd az adatot", vbExclamation + vbYesNo) = vbYes Then MsgBox "törlöm" Selection.Value = "" Else MsgBox "nem törlöm" End If End If End Sub
A Thisworkbook kódlapjára menj át (a bal oldali listában kattintasz rá kettőt), a bal lenyílóban válaszd ki a Workbook - ot.
A jobb oldali lenyílóban az Open eseménykezelőt. Ide másold át a munkalap Activate eseménykezelőjében levő két sort:
Application.OnKey "{DEL}", "nodelete"
Application.OnKey "{BACKSPACE}", "nodelete"
Ezután válaszd a BeforeClose eseménykezelőt. Ide pedig a munkalap DeActivate kezelőjében levő két sort.
Application.OnKey "{DEL}"
Application.OnKey "{BACKSPACE}"
A munkalap kódlapjáról az Activate és Deaktivate eseménykezelő törölhető.
Ments el, zárd be és nyisd meg újra.
Elvileg működnie kell és csak a Dosszié nevű munkalap adott területén.
Kipróbáltam ahogy mondtad. Megnyitás után először még simán lehet törölni (mintha mi sem történt volna), viszont miután váltogattam a munkalapok közt, utána már nem lehet törölni. Egyáltalán nem, de még csak rá se kérdez, hogy akarom-e törölni vagy sem. Max átírni lehetne a meglévő nevet, de ez úgy annyira nem jó.
Mivel sok ember használná ezt a fájlt kényelmesebb lenne ha nem kéne lapfül váltogatással trükközni, ha úgy meg lehet oldani.
Valamit tuti nem jól csinálok, mert nem akaródzik működni a makró, úgyhogy inkább beteszek egy képernyőképet hátha abból kiderül mit rontottam el:
A lényeg, hogy a DOSSZIÉ munkalap C9:AE130 tartományra szeretném beállítani ezt a funkciót. A fentiek alapján megcsináltam a makrót, meg beállítottam az Activate/deactivate részt is az adott munkalapra (nem vagyok 100% biztos, hogy ezt jól...) és végül makróbarát verzióban elmentettem az excelt. Újranyitás során jött is egyből a biztonsági figyelmeztetés, hogy a program letiltotta a makrókat, amire én engedélyeztem a tartalmat. Ezt követően semmi változást nem tapasztaltam, ugyanúgy ha az adott tartományban (C9:AE130) bárhol lenyomom a delete-t simán törlődik a cella tartalma mindenféle figyelmeztetés nélkül.
Amúgy a táblázat bizonyos részei (pl. az első 7 sor) le vannak védve, egyes részei pedig automatikusan töltődnek különféle képletek alapján. Nem tudom, hogy ez mennyire befolyásolja a makró működését.
Ha a fenti kép alapján van valami sejtés mi lehet a bibi, előre is megköszönöm a válaszod.
Ráállsz a munkalap nevére a lapfüleknél alul. Jobb egérgomb. Kód megjelenítése. A bal oldali lenyílóban kiválasztod a Worksheet-et. Megjelenik a SelectionChange esemény üres makrója, ezzel nem kell foglalkoznod. A jobb oldali lenyílóban kiválasztod az Activate eseményt. Ide beírod az Application.Onkey 2 sorát, ami aktíválja a makrót. Ezután kiválasztod a Deactivate eseményt a lenyílóból, ide írod be a másik két sort.
A makrót egy modulba kell bemásolni. Ha már itt vagy a kódlapon, akkor a felső menüsorban kiválasztod az Insert menüből a Module sort. Ide másolod a makrót.
Viszont: ez után a füzeted makróbarátként kell elmentened (xlsm kiterjesztés)
a függveny jol müködik azonban nekem lenne meg valami amit meg akarok oldani.
=HA(B2="";HA(C2="";"";SOR())+10;SOR()+10)
A problema onnan adodik hogy a cella ahol nincs ertekem B2 es C2 szeretnem hogy semmit ne irjon ki de a szamlalo tovabb szamolja a sort valahogyan -1 el.
Pelda.:
A oszlop ugye a sorszamom B oszlop tetszoleges ertek C oszlop tetszöelges ertek:
A oszlopban a szam ugye halad felfele HA B VAGY!!! C oszlopban ertek van.
DE!!! ha nincs ertek sem B illetve sem C oszlop adott cellajaban akkor az A oszlopban NE irjon kis semmit VISZONT -1 el szamoljon AZAZ szepen haladjon maga a darabszamom külön független a sorszamtol
A oszlop B oszlop C oszlop
46 ertek ertek <-- Kiirja az A oszlop erteket (szamot)
47 ertek <-- Kiirja az A oszlop erteket (szamot)
48 ertek <-- Kiirja az A oszlop erteket (szamot)
"" "" "" <-- Nem ir ki semmit viszon tovabb szamol ugy hogy a következö szam folytatodjon de nem a sor függveny alapjan hanem alul ahogy mutatom a 49 nel
49 ertek ertek <-- A sor függveny miatt itt 50 lenne de nekem csak 49 kell mert az nekem a 49.
Sajnos nagyon zöldfülű vagyok a makrókkal kapcsolatban, legalábbis egyelőre még nem igazán dolgoztam vele, szóval olyan alap dolgokra is rá kell kérdeznem, hogy a munkalap Activate/Deactivate eseményeit konkrétan hol/hogy tudom beállítani?
Sub nodelete() If Not Intersect(Selection, Range("A1:C10")) Is Nothing Then If MsgBox("Valóban törölni szeretnéd az adatot", vbExclamation + vbYesNo) = vbYes Then MsgBox "törlöm" Selection.Value = "" Else MsgBox "nem törlöm" End If End If End Sub
Az aktíválást teheted a munkalap Activate eseményéhez, a megszüntetést a Deactivate eseménybe.
Az is megoldható, hogy a megerősítő makró csak a munkalap meghatározott részében érvényesüljön. A makró most az A1:C10 területen érvényesül, azon kívül nem. Ha változhat a terület, pl. egy táblázat, akkor érdemes elnevezni és a névvel hivatkozni a tartományra.
Ha nem boldogulnál vele, akkor tegyél fel egy kis mintát.
Egy olyan segítséget szeretnék kérni tőletek, hogy hogy tudnám azt beállítani egy táblázatban, hogy bármelyik cellán állva, ha lenyomom a "delete" vagy "backspace" billentyűk valamelyikét feldobjon egy megerősítő ablakot, hogy valóban törölni szeretném az adott cella tartalmát. Ergo, azt szeretném megoldani, hogy ne tudjam véletlen törölni a cella tartalmát, csak megerősítésre.
Ezt a formot vagy 5 éve készítettük, és akkor felkerült rá. Most nincs az eszköztárban ilyen, viszont lecserélni nem tudom, mert osztályhibát ír ki más date képződményre :-(
Ezen a formon van egy-egy DTPicker, amiknek a backcolorját viszont nem állítja egyáltalán.
A tulajdonságai között CalendarBackColor van, viszont, ha ezt írom be, akkor sem színez. Sőt, olyan, mintha nem is lenne ilyen objektumom, mert kisbetűvel beírva a tulajdonságot, nem írja át nagyra.
Szia! Kettő db R vagy 2 db B kell legyen az adott szövegrésznél, vagy elég csak annyit megnézni, hogy a 16. karakternél előbb fordul elő? Továbbá az 1 akkor kell ha R vagy akkor ha R vagy B?
Szövegrészt kiemelni bolddal csak makróval lehet.
Az egész cellatartalmat lehet feltételes formázással is félkövérre állítani. Pl. Ha mindegy, hogy B vagy R van-e benne:
Feltételes formázás - új szabály - a formázandó cellák kijelölése képlettel, a képlet:
5:4(1:0 R;0:1 R;1:0 F;1:0 R;0:1 F;0:1 R;1:0 R;0:1 F;1:0 F)cellából a 15..16 /a kiemelt rész/karakterig kellene kiszűrnöm hogy ott "R" betű vagy B betű van e, s azt kellene félkövérre venni, vagy a kovetkező oszlopba egy 1 es számot irna is jó volna. Úgy néztem hogy feltételes formázással s csere vel ezt nem tudom megoldani. tudnátok támpontot adni merre nézelúdjek inkább?
Van egy pofás formom, ami remekül működik egy ideje.
Gondoltam ráncfelvarrom a kicsikét. Az adatbeviteli mezőket színezni szándékoztam, hogy amikor azt tölti az ember, akkor világos legyen, merre tart.
Private Sub EsTB10_Enter() Me.EsTB10.BackColor = vbGreen End Sub Private Sub EsTB10_Exit(ByVal Cancel As MSForms.ReturnBoolean) Me.EsTB10.BackColor = vbWhite End Sub
Szuper jó, van vagy 30 combo- meg textbox, remekül működik. Azonban van az egész felületen három Frame, amikben külön-külön van 3-4 textbox, és ezek utolsóikban beragad a zöld szín. Hiába lépek tovább (akár tabbal, akár egérrel), mégsem fehéríti ki. Viszont, ha visszafelé lépek ki az utolsó textboxból (tehát az előző textboxba lépek), akkor eltünteti a zöldet.
Azt meg lehet, oldani, hogy egy grafikonhoz szükséges adatok automatikusan jelölődjenek ki az adott naphoz? Jellemzően ez minden nappal plusz egy sor lesz.
Tehát ne kelljen mindig kijelölgetni az adatokat, hanem mondjuk a ma() értéket megtalálva jelölje ki pl az A1:D12 másnap az A1:D13 területet.
A 2. kérdésre Eredő Vektor javaslatát annyiban módosítanám, hogy az A2&B1, vagy a B1&A2 közé valami elválasztójelet azért tennék. Mondjuk B1 & " " & A2, vagy B1 & ";" & A2 stb.
A 2. sorba pedig ez kell: =HA(B2="";HA(C2="";"";SOR());SOR())
Majd ezt húzod végig lefelé.
Ha az egész nem az 1. soron kezdődik, akkor a második sorhoz hozzáadsz egy számot, ami 1-el kevesebb, mint a sor száma. Ha például az első adat a 10. soron van, akkor 1 11. soron lévő "2" sorban a képlet: =HA(B2="";HA(C2="";"";SOR())+10;SOR()+10)
A problemam a következö. Lehet e olyan sorszamot csinalni ami ha megszakad az elözö szam folytatja a szamozast tovabb lathatatlanul es ahol a B es C oszlopban ertek van ujra elkezdi ha nincs megy tovabb a szamozas csak nem jelenik meg.
1 1. ertek 1 1. ertek 1 =HA(B1="";HA(C1="";"";1);1)) 2 1. ertek 2 1. ertek 2 =HA(B2="";HA(C2="";"";A1+1);A1+1) 3 1. ertek 3 1. ertek 3 =HA(B3="";HA(C3="";"";A2+1);A2+1) 4 1. ertek 4 1. ertek 4 nincs itt 5 1. ertek 5 1. ertek 5 mert nincs ertekem se a B oszlopban se a C ben de megy tovabb a szamozas a hatterben es ahol ujra van ertek az oszlopok cellaiban ujra megjeleni szepen kihagyva ezt 6 1. ertek 6 1. ertek 6 7 1. ertek 7 1. ertek 7 8 1. ertek 8 1. ertek 8 9 1. ertek 9 1. ertek 9 10 1. ertek 10 1. ertek 10
Elakadtam egy feladattal és segítséget szeretnék kérni. Excel 2016-ban dolgozom egy kiállítási interaktív kioszk háttér adatbázisán. Ez az excel szabályozza, hogy milyen érintésre milyen adatok szűrődjenek le és jelenjenek meg a képernyőn.
Az első munkalapon vannak a kiállítók adatai. Ami most fontos az az azonosítójuk, illetve hogy hol állítanak ki. Minden helyszínhez tartozik egy térkép ami mutatja a pontos helyet. Több helyen is kiállíthatnak ezért bizonyos esetekben egy azonosítóhoz akár 3 térkép is tartozhat.
A "Floormap locations" csináltam egy lekérdezést az A munkalap 3 oszlopából amik a térképeket tartalmazza. Eltávolítottam az ismétlődéseket és az üres cellákat a lekérdezésből.
Most a "Floormap locations" munkalapra szeretném az egyes térképek mellé összeszedni az összes olyan kiállító azonosítóját, aki kiállít azon a helyen. Az index.hol.van egy találatnál megáll és a keres függvények is tudomásom szerint.
Mellékelek képeket, hátha segít megérteni és remélem valakinek van valami jó kis trükkje. Hálás lennék! Előre is köszönöm!
Nem vagyok híve, annak, hogy beadandó feladatok bárkinek megoldjak, ezért leírom a hibákat.
Az általatok elgondolt Excel majdnem jó, igazából csak E7:P7 cellákban lévő képletnek nincs értelme, ezek lesznek a modelled változó cellái, ez lesz, amiről döntést kell hozni melyik héten hány ládát kell kiszámítani.
Töröljétek ki a képletet, és írjatok ide be valamilyen számot, pl. végig 10-t
A Solverhez meg kell fogalmazni az optimalizálási feladatot.
Mi célfüggvényed? Nyilvánvalóan a költség, ezt kell minimalizálni
Mi a modell változói? Miről kell döntést hozni?
Milyen feltételeid vannak?
1. A szállított ládák számának biztos, hogy nem negatívnak kell lenniük >=0
2. A szállított ládák számának biztos, hogy egésznek kell lenniük
3. A záró készlet sem lehet negatív, mert akkor többet használ fel, amit ami az előző nap raktár készlet+kiszállítás
Olvasátok le az Exceletekben az ennek megfelelő cellákat, és adjátok meg a Solver megfelelő mezőjében.
Mivel a költség függvény nemlineáris (a közvetett KEREK.FEL miatt), ezért nemlineáris Solverrel kell megoldani.
Szeretnék tőletek segítséget kérni excel solver feladattal kapcsolatban!
A kialakult távoktatási rendszerben kaptunk egy beadandó feladatot, ami a jegyünk 1/10-edét teszi ki, viszont mintafeladatokat a solver használatához nem. Így remélem, hátha van valaki, aki tudna nekünk a mellékelt google drive mappában található feladatban segíteni. Sokat jelentene nekünk.
2. D2-be másold be ezt: =HA(HAHIBA(SZÖVEG.TALÁL("/"&A2&"/";"/2/3/6/8/11/15/18/21/25/")>0;HAMIS);"";1)
Megjegyzés: A számokat közrefogó / jelek azért kellettek (lehetett volna más is), hogy az 1-es számot ne fogadja el a 11, 15, 18, vagy 21-ben, a 2-est meg a 21 és 25-ben.
=HA(ÉS(A2>13,A2<26),1,B2) ebben mi lehet a hiba, hogyan orvosolhatnám?
2. másik cellába ( legyen d2) akkor szeretnék egy "1" s számot, ha a2 cellaban a szamok a 2, 3,6,8,11,15,18,21,25 s számok egyike. hogyan tudnám ezt egyszerűen kivitrelezni?
A bemásolás után azt csináltad, amit írtak: "Ez egy tömbképlet, Ezért Ctrl+Shift+Enter-rel kell lezárni!". Tehát amikor bemásoltad a szerkesztőlére, akkor nem Enter, hanem Ctrl+Shift+Enter. Ekkor szögletes zárójelek közé teszi, amit bemásoltál, és végrehajtja a többnyire bonyolult feladatot, amit másképp nem lehetne megoldani.
Shift-ctrl-enterrel zártad le a tömbképlet bevitelét? Ha jól csinálod, a szerkesztőlécen kapcsos zárójelek közé csukva jelenik meg, ami magától kerül oda.
Adott szövegben kellene az első nagybetű pozíciója, a második karaktertől számolva (mivel az első többnyire eleve nagy betű). Lenne megoldás, de valahogyan nem működik. Mintha a SZÖVEG.TALÁL nem engedne több attribútumot bevinni, vagy csak az elsőt venné figyelembe.
A két képletet tartalmazó cellát másolod (ctrl+c), majd az összegzést tartalmazó cellákat kijelölöd (ctrl + jobb egérgomb), irányított beillesztés - képletet.
Azzal a kérdéssel fordulok hozzátok, hogy hogyan tudnék úgy összeadni sok (kb. 6 ezer sor) számot az alábbiak szerint, a sárga mezőbe kellene a fentiek összege, de ne egyesével kelljen függvényezni. Biztos van rá már válasz, de nem elég ügyesen keresem.
Bármilyen meglepő, nem hogy a gugliban nem találtam jó találatot, konkrétan a kiszámolót meg is néztem, de az utóbbi időkben nem sok bejegyzés volt, nem keresgéltem régieket.
(Nem hitelkalkulátor szóra kerestem, az van sok helyen, hanem próbáltam a maradvány összegre, csak nem tudtam, mi a szakszó. Azóta meglett.)
Magyar Excel képlet (természetesen másik oszlopba)
=Helyette(A1;Karakter(10);"<p>")
Utána a képletes cellákat kijelölöd, másolás, ugyanoda irányított beillesztés értéket. Az alap oszlop törölhető vagy arra másolod rá és a segédoszlopot törlöd.
Ha cellán belül van sortörésem (ALT+ENTER), nagyobb mennyiségű adatnál, és több cellában, akkor azt valahogyan tudom cserélni szövegre?
Adott esetben <P> html kódra cserélném a sortörést, így egy export-import folyamatnál nem veszne el a sortörés.
(Az excel táblázatban amiből a termékleírásokat kellene beemeljem ott cellán belül van sortörés, ha így küldök rá egy import folyamatot, akkor egybefüggő lesz a szöveg, kiesnek a sortörések. Viszont ha minden sor végére beírok egy <P> html kódot akkor új bekezdést tesz, és ezzel sok munkát spórolok magamnak.)
Én a farönkök köbözését szeretném meggyorsítani egy excel táblázattal. A lényeg, hogy ha beírok egy számot (átmérő) mutassa meg, hogy az hány köb. Sajnos képlettel nem oldahtó meg a dolog, mert a fák nem tökéletes henger alakúak, de egy könyvből megvannak az adatok. Szóval ha mondjuk az A1be beírom, hogy 20 a B1ben jelenjen meg, hogy 0,1. A2 27 - B2 0,18 és így tovább. Köszönöm a segítő hozzászólásokat!
Gondolom, tud olyat az Excel, hogy megadom a felvett hitelt, a kamatot a futamidőt (esetleg a törlesztő részletet, bár ezt nyilván ki tudja számolni) és havi bontásban hozza, mennyi tőke és mennyi kamat van hátra. Ha tényleg van ilyen függvény, tudja-e valaki a nevét?
Ha a navigálást úgy érted, hogy majd odaugrik a kurzor, akkor nem. Ha úgy, hogy kiírja valahova a cella koordinátáit, akkor igen. Egy tanács: soha ne adj meg ilyen intervallumokat táblázatkezelőben, hanem az alját meg a tetejét két egymás melletti cellában. Az intervallum nem rendeltetésszerű használat, úgyis szét kell szedni aljára és tetejére, plusz bonyodalom.
De mi a valódi feladat, amit így akarsz megoldani?
A kérdésem a következő volna. Megadok intervallumot egy cellában. Pl.: "1-1655" Szeretném azt elérni, hogy a dokumentumon belül kereshető legyen az intervallum bármely szereplője. Tehát ha rákeresek az 1000-re, akkor is ahhoz a cellához navigáljon találatként, ahol az "1-1655"-öt megadtam. Ez lehetséges?
Szia. Ha adsz egy e-mail címet, elküldöm, meg a hozzá írt kivánság-szöveget is. Nem terhelném egyenlőre a közösség oldalát. Ha tudsz segíteni és megoldódik és érdemesnek tartod feltenni segítségként másoknak, akkor mehet.
Feltételezve, hogy a cikkszámaid a Munka1 munkalap A oszlopában vannak, a második munkalapon pedig a cikkszám az A oszlopban, az érték a B oszlopban van.
Van egy táblázatom, benne 12 munkalap. Egy 13.-ba kellene összegeznem minden egyes, számokat tartalmazó cella értékeit. A cellák elnevezése ugyan az mind a 13-ban.
Hogyan kell ezt csinálni?
Ha ugyan ezeket a munkalapokat (12 db) egy másik (14.) összesítőben kell összegeznem, ahol előfordul néhány, mind a 12 cellában előforduló adat összevonása, azt hogyan kell csinálni?
Pl.: A személyi jellegű kiadásoknál a 12 munkalapon tételesen vannak a kiadások (bér, utazási ktsg, saját gk. használat, természetbeni juttatás, egyéb ktsg, de ugyan ez a 14. -ben már csak úgy kell, hogy szerepeljen, hogy bér és egyéb személyi jellegű kiadások (tehát a forrás cellák és a cél cellák elnevezése és db-száma is más).
Ez tipikusan lineáris algebra - optimumszámítás feladat
Alapfeladat felírása:
B2:D5 a fajlagos felhasználás mátrix (narancs színű terület)
Ha ezt mátrixszorzod a gyártási tervvel (miből, mennyit gyártasz) B6:D6 (sárga), akkor megkapod, hogy az adott gyártási tervhez az egyes alapanyagokból mennyi az felhasználás F2:F5 (zöld). Képen az elrendezés miatt a mátrixszorzásban a sárga részt transzponáltam, hogy a mártixszorzás elvégezhető legyen.
A raktárkészlet adott H2:H5 (rózsaszín), a fennmaradó készlet a raktárkészlet és a felhasználás különbsége.
Ezzel már el lehet kezdeni játszogatni, hogy a gyártási tervek így-úgy változtatod, és akkor hogyan változik felhasználás, fennmaradó raktárkészlet.
Ha valamilyen pontosabb/ képlettel leírható követelményt (pl. a termékeken elérhető profitot maximalizálni)meg tudsz fogalmazni, akkor lép képbe a Solver.
A példa kedvéért, az adott raktárkészlet alapján legyártható össztermékmennyiséget E6:=SZUM(B6:D6) (kék) szerettem volna maximalizálni.
A hozzátartozó Solver beállítása a képről leolvasható.
Ha mindegyikből van 100 db, akkor készítesz 10 vaskarikát és 6 kalapácsot. Marad 70 aluminiumod és 10 fád. Ezzel vársz a következő szállítmányra. Akkor megint csinálhatsz valamit:-)
Egy nagyon amatőr kérdéssel fordulok hozzátok, de mégis kigott ratjam.
Tegyük fel, van 4 alap termékem (legyen most)vas,alumínium,fa,karika. A4 alaptermékem xyz raktrákészelettel van jelen.Ezekből az alapnyagokból 3 fajta terméket tudok előállítani de más más anyagszükségletekkel legyük fel, Ötvözet anyagszükséglete 10vas+10alumínium, Facsavar anyagszükséglete: 5fa+10vas , Vaskarika anyagszükséglete 10vas+10karika, almínium kalapács anyagszükséglete 5aluminium+15fa.
Hogy tudom megoldani, hogy a rendelkezésre álló nyersanyagok függvényében az elkészítendő tárgyak mennyiségét közölje illetve elkészítés után a raktárkészletet a megfelelő anyagokkal csökkentse.
Kevesen ismerik, de excel 2016 - tól a powerquery integrálva lett. Ezt kell használnod a továbbiakban és teljesen automatikussá válik az egyes lépések rögzítése után a teljes folyamat. Erre találták ki - többek között.
Én nem adnék teljes útmutatást, mert sok van a neten és egyszerű...
Természetesen az INDEX függvényben szereplő - vastagon szedett - utolsó sorok számát igazítanod kell a saját tábládhoz.
Ha 3-nál több "valami" van, akkor a 3 helyett a "valamik" számát kell beírnod, továbbá a G2 képletben folytatnod kell az oszlopok első cellájával, a H2 képletben pedig a D oszlop helyett a valódi utolsó oszlopot kell írnod a piros betűk helyére.
Tanácsot szeretnék kérni az alábbi feladat megoldásához.
Adott az 1. tábla és a cél abból a lenti kimutatás elkészítése.
Nem vagyok nagyon otthon a pivot táblákban, ezért csak úgy tudtam megcsinálni, hogy az 1. táblát lemásolom / transponálom, majd mechanikus másolgatással előállítom a 2. táblát. Mivel nagy az eredeti állomány, ezzel a módszerrel sokáig tart és a tévesztés lehetősége is nagy.
Milyen egyszerűbb, biztonságosabb módszer létezik erre a problémára?
Tanácsot szeretnék kérni az alábbi feladat megoldásához.
Adott az 1. tábla és a cél a lenti kimutatás elkészítése.
Nem vagyok nagyon otthon a pivot táblákban, ezért csak úgy tudtam megcsinálni, hogy az 1. táblát lemásolom / transponálom, majd mechanikus másolgatással előállítom a Segédtáblát. Mivel nagy az eredeti állomány, ezzel a módszerrel sokáig tart és a tévesztés lehetősége is nagy.
Milyen egyszerűbb, biztonságosabb módszer létezik erre a problémára?
Én a következő feladatban kérnék segítséget nem boldogulok vele.
B2 cella pálinka név melyben a legördülő lista barack szilva körte, B3-3-4-5 cella legördülő lista ( kész, folyamatban, stb..) Amit szeretnék: Ha a B2 cellában kiválasztom a barackot akkor a B3-4-5 cellában tudjam a nyelveknél kiválasztani hogy milyen állapotban van. Ezt meg tudom csinálni. Amit nem tudok, hogy ha B2 cellában kiválasztom a körte akkor a B3-4-5 cellában szintén tudjam kiválasztani a nyelveknél hogy milyen állapotban de úgy hogy a Barackot ne módosítsa hanem külön kezelje. Ha vissza váltok B2 cellában barackra akkor annak a folyamatát lássam.
Ez ilyen többszintű legördülő lista és láttam már ilyet de sehogy sem tudom összehozni. Ami még fontos, hogy bővíthetők legyenek.
Sajnos ez nem pont azt hozza amire szükségem van, mert csak azokban a sorokban hoz értéket ahol a 2. oszlopban van érték. Nekem meg 1 el kellene jelölni a 3. oszlopban az összes értéket amelyiknek a száma szerepel a 2. oszlopban. mint a becsatolt képen a 3. oszlopban, úgy kellene kinéznie, csak sajnos 80 ezer sor van.
2013 as excel használatával kapcsolatban szeretnék segítséget kérni Tőletek!
A probléma amit nem tudok megoldani: Az első oszlopban szerepelnek értékek, amik néha ismétlődnek. A második oszlopban az első oszlopból származó értékek vannak, és az lenne a cél, h ha a 2. oszlopban található érték megtalálható akárhol az első oszlopban, akkor az első oszlop sorában 1 értéket adjon a 3. oszlopban, ha nincs benne az első oszlopban a 2. oszlop értéke akkor 0 értéket adjon.
Függvénnyel ezt meg lehet oldani? órák óta fkeresezek meg ha függvényezek de nem jöttem rá a megoldásra.
Való igaz. Ha nem én fogom használni a programot, akkor szeretem, ha alaposan tesztelve van, és nem éri meglepetés a felhasználót. Alap, hogy ne jöjjön leállás angol nyelvű hibaüzenettel, de az is, hogy megmagyarázhatatlan jelenség se forduljon elő.
Az ilyen "apróságok" mellett azért nem szeretek vállrándítással elmenni, mert ki tudja, hogy a hiba, ami okozta, máskor nem eredményez-e komolyabb gondokat. (Könyvelők szokták mondani, hogy állítólag előfordult olyan, hogy a bevétel és kiadás végösszege pár filléres eltérést mutatott, majd az egész csapat több napi munkával mindent utánaszámolt, és 10milliós hibát találtak.)
Ezért a tegnapinak is utána fogok nézni, csak most nem nagyon van rá idő.
Eddig nem találtam rá, de most megnéztem: Egy pillanatig megörültem Bryan Shepherd válaszának, mert azt én is tapasztaltam (Word-ben), hogy ha betűméretet módosítok, akkor nem mindig érvényesül elsőre. Csak ha elrontom a jót is, aztán az egészet kijavítom. Sajnos a részletekre most nem ugranak be. Mindenesetre itt kipróbáltam, de nem működöt.
"Bár a cellánként eltérő betűméret (ugyanazon munkalapon és felbontás esetén), akkor is furcsa jelenség – annak (méret)helyessége, mint minimum, elvárható volna"
Szerintem is. Bár nem cellákról van szó, hanem Userformon elhelyezett hajszálra azonos TextBoxokról (ld. az előző pontosításomat), én is azt várnám, hogy a "torzítás" legyen a képernyő minden részén azonos, ne legyen 20-30 képernyőponttal lejjebb más mint a felette lévő, aztán megint olyan mint az első stb.
Bocs, azt nem írtam meg, hogy mindez egy UserFormon van. Tehát a VBA képernyőn a Properties ablakban eleve látszanak ezek. És a Userformon arra is van lehetőség, hogy egy elkészült vezérlő (jelen esetben egy TextBox) fölé állva Copy majd Paste paranccsal egy másodpéldányt hozzak létre új névvel.
Egyébként aztán a lényeges tulajdonságait (helyzet /Top/Left/, szélesség, magasság, betűméret ) programból állítom be egyformán, így nem jöhet szóba különbség.
Meg különben is, ha ugyanazt a programot használom, akkor elvárnám az Exceltől, hogy ha eltér két Boxban a betűméret, akkor az térjen el minden képernyő felbontás mellett.
(Éppen ezen dolgozom már jó ideje, hogy bármilyen képernyőn azonosan nézzen ki a programom által kezelt Form. Ezért a programmal beolvasom az elején a teljesre állított Applikáció méreteit a magasságot és a szélességet, és az egyes vezérlők helyzetét soha sem fix képernyőpontban adom meg, hanem a képernyőről kiolvasott adatokhoz viszonyítva. Tehát az 1200 képpont szélességű laptop közepe 1200/2=600, az 1600 szélességű monitor közepe 1600/2=800. Ha ide akarok írni egy 10 karakteres szöveget, akkor az 5 karakternek megfelel képponttal balra kezdődik. Figyelve arra, hogy az 5 karakter az szám, kisbetű, vagy nagybetű. Így bármelyik gépen fut a program, ami középre kell, az majdnem pontosan középen lesz. Ugyanezt alkalmazom függőlegesen is. Kissé bonyolult számolgatást igényel, de működik)
Szóval ezek miatt gyanakszom arra, hogy a különbségeket valamilyen módon hardver eltérések is okozhatják.
A munkalap (minden cellájának) betűtípusa, (stílusa) formázása egyforma?
Bár a cellánként eltérő betűméret (ugyanazon munkalapon és felbontás esetén), akkor is furcsa jelenség – annak (méret)helyessége, mint minimum, elvárható volna.:-)
Sziasztok. Újabb érthetetlen jelenség Excel programozásakor, bár lehet, hogy nem is az Excel a ludas. Egy bizonyos helyzetben szükségem volt arra, hogy egyes Textboxokat megtöbbszörözzek. A többszörözés az első TextBoxból Copy/Paste technikával történt, majd értelemszerűen külön neveket adva nekik.
A program egy másik pontján arra volt szükségem, hogy a legfelső boxban lévő adatot bemásoljam az alatta lévőkbe (sőt még enablad = False segítségével, csak láthatóvá tegyem. (A munkát egy 1280x800 felbontású laptopon végeztem. Ennek mindjárt lesz jelentősége)
A másolás elvégzése után a következő kép fogadott:
Eltérő méretűnek látszottak az egymás alatti boxokban az azonos adatok. Minden következetesség nélkül. Órákat töltöttem az ok keresésével. Másoltam a tartalmán kívül a .font.size tulajdonságot, aztán a box méretadatait (Width és Height), de semm eredmény. Arra gondoltam, hogy esetleg van valami rejtett - betűméretet meghatározó - tulajdonsága a Boxba írt szövegnek.
De ekkor felszabadult az asztali gépem 1600 x 900 felbontású monitorral, így azon folytattam a munkát. És elindítva a programot, ugyanarra a helyre érve a következő kép fogadott:
Minden rendben. Az átmásolt adatok azonos méretben jelennek meg minden boxban.
Érti ezt valaki? Esetleg kérdezzem meg a hardveres topikban?
Kipróbáltam de sajnos ugyan az a helyzet. Nem tűnik el a dátumozott oszlop de furcsa sárga színnel kijelöli a dátum celláját a google táblázatban! Nem értem! Először még úgy láttam hogy működött. Bár excel programba hibátlanul működik csak a google táblázatban nem sajnos. Van még ötletetek?
Köszönöm szépen! A felső sorokba került a kérdések sorszáma, alatta vannak a válaszok. Tehát a 3.oszlop (=3. Kérdés) érdekel, szeretném kiválasztani azokat akik a 2-es választ adták.
Tehát a szűrés az lenne, hogy 3. Oszlop ahol 2 szerepel.
Este tudok képet is küldeni, de ahhoz a géphez amin dolgozom csak este férek hozzá.
Módosítottam a sorokat, hogy a képlet jó legyen de sajnos ugyan az a bajom! Amikor berakom a táblázatot akkor szépen működik a feltöltés után a dátum eltüntetős képlet de amint eltelik egy nap már nem tűnik el és kijelöli hülye sárga színnel mint az alábbi képen! Van valami ötletetek?
Ennyire nem értek hozzá! Amikor beraktam akkor kezelte először és eltűntette az oszlopokat, de csak akkor amikor beinportáltam, aztán másnap már nem :D A google sheetbe is ugyan ezt a kódot kell beírni? Köszönöm!
Abban kérném a segítségeteket, hogy egy pivot táblának szeretném frissíteni a dátum szűrőjét, sajnos ez nem sikerül. Egy változóból szeretném megadni az értéket, de hibára fut.
Sheets("Pivot Aspen Accrual").Select ActiveSheet.PivotTables("PivotTable3").PivotFields("Report Month").CurrentPage _ = "(All)" With ActiveSheet.PivotTables("PivotTable3").PivotFields("Report Month") .ClearAllFilters .PivotItems(Z).Visible = True End With Range("D8").Select End Sub
Error:
hiba 1004 unable to the set visible property og the pivotitem class
Akkor is hibát jelez, ha felveszem a szűrő frissítését, majd makróval akarom futtatni,
hiba 1004 unable to the set visible property og the pivotitem class
Segítségeteket szeretném kérni. Nemrég ugyan itt segítettetek abban, hogy az excel a bedátumozott sorokat eltüntesse. Akkor ezt kellett tennem, hogy működjön:
A VBA nézetet az Excel munkalapról az Alt + F11 kombóval tudod előhívni. Utána kattints kettőt a Thisworkbook névre. Ezután bemásolhatod:
Private Sub Workbook_Open()
Dim i as Long i = 2 Do While Sheets("munkalap").Cells(2, i).Value < Date Cells(2, i).EntireColumn.Hidden = True i = i + 1 Loop End Sub
Mentés gomb – nem-re kattintani - A fájlt makróbarátként (xlsm) vagy binárisként (xlsb) kell mentened a mentés másként opcióval.
Ez működött is az excelben, de felraktam a google táblázatokba, hogy mindenki tudjon jelölni. MAkróbarátként van elmentve, binárisként fel sem ismeri. De sajnos itt nem működik! Március 7-én töltöttem fel egy ilyen excelt, amin feltöltötte rögtön el is tüntette azokat az oszlopokat amik már elmúltak. De feltöltés után egy nappal ránéztem és fura sárga színnel megjelenik a mai nap és az előző nem tűnik el! Tud ebbe valaki segíteni? Esetleg egy másik oldalt ajánlani ahol sokan hozzáférhetünk és működik is? Így néz ki jelenleg:
Szerintem a közönséges ÁTLAG függvény is megfelel ÁTLAG(D2:D149) formában. Az üres cellákat az sem veszi figyelembe, az ÁTLAGHATÖBB által igényelt egyéb kritériumok meg csak speciális igények esetén jönnének szóba.
"Sajnos most nincs ötletem arra, hogy a $B helyett automatizálni lehessen az oszlop változását."
Közben eszembe jutott az elv. Az indirekt függvényben az S1O1 hivatkozással lehet megoldani, de most nincs időm, hogy ki is próbáljam. Majd talán este, vagy holnap, ha addig valaki nem javítja a képletet.
(Magyarázat: A képlet megkeresi az 1. munkalapon az A2 oszlopban lévő cikkszámot tartalmazó sort a 2. munkalapon, majd annak a B oszlopából kiolvassa a neked szükséges adatot és bemásolja a D oszlopba.)
A következő oszlopba a már átjavított névvel használt képletet másold át, de a $B helyett $C legyen. (Ezzel a képlet az 1. munkalap C oszlopban lévő adatát másolja). És így tovább mindig növelve az oszlop nevét.
Ha minden oszlop 2. sora elkészült, akkor jelöld ki az összeset a D-től végig, és húzd le a táblázat végéig.
Sajnos most nincs ötletem arra, hogy a $B helyett automatizálni lehessen az oszlop változását.
Ha a fórumtársak közt van valaki, aki erre is tud megoldást, és akkor nem kell kézzel átírogatni.
A oszlop: cikkszám (ugyanazok mint az 1. Táblazatban)
B oszlop: keszitő neve
C oszlop: minősegi elvárás (egy szam 1től 30ig)
D oszlop: gyartáskor keszleten levő mennyiseg (db)
(És még 30 másik oszlop ami hasonló)
A probléma: a 2 táblazatból szeretnék 1 táblázatot készíteni. A probléma ott van, hogy a cikkszámok nem megegyező sorrendben vannak. A sorbarendezes majd ctrl c ctrl v nem működik, mert az első táblázat egy programból kiexportált fájl, azt szeretném bővítve visszaimportálni, hiába írom át sorbarendezve az 1.t nem fogadja el. A 2. At pedig nem tudom az elsőnek megfelelően sorba tenni, mert az első random sorrendben van. Es van 5400 ilyen sorom...
Valahogy össze lehet fésülni a 2t?
Az egyedüli közös oszlop a cikkszám. (5400 eltérő, így remelem valahogy csak megoldható)
"Ha igen, hogyan?" Ha cinikus szeretnék lenni, azt írnám: Szűréssel. Mert ilyen funkció van az Excelben.
Az igazság az, hogy ehhez többet kellene írnod, arról, hogy milyen módon vitted fel a táblázatba az adatokat.
Ha például az A oszlopba írtad a válaszadók nevét, és a B oszlopba a válaszokat, akkor a fenti Adatok Csoportban a Rendezés és Szűrés alcsoportban a Szűrés gombra kattintasz, ahol megjelenik egy lefelé nyíl minden oszlopban. Ekkor a válaszok oszlopban (pl.B) a nyílra kattintasz, és kiveszed a pipát azokból, ahol nem a 2-es szerepel.
Persze, ha másként töltötted ki az adatokat, akkor más az eljárás. Akkor küldj egy képet a táblázatról, biztos lesz segítség.
Egy kérdőívre adott válaszokat vittem be excel táblázatba.
Ki szeretném szűrni azokat, akik mondjuk a harmadik kérdésre 2-es választ adtak, és a továbbiakban csak azokkal az adatokkal szeretnék dolgozni. Ezt meg lehet csinálni? Ha igen, hogyan?
Lehetséges-e egy Userformon többsoros magasságú Textboxban függőlegesen középre pozicionálni a szöveget? Csak a vízszintest találom (TextAlign).
A valóságos gondom a felső, az alsó csak tévedésből született, de ha már itt van, akkor még jobban látszik a probléma.
Egyébként azért szeretném ilyen magasra állítani a Boxot, mert az előtte lévő rá vonatkozó Labelt szeretném esetenként kétsorossá tenni, és ahhoz jobban passzol a magasabb TextBox.
Az a bajom a bemásolással, hogy megszűnt az egykori tagolt formátum. Amolyan vasvillával behányt lesz a makró.
Function Darabszam(Mintacella, Terulet As Range) Dim CV As Object, db As Integer For Each CV In Terulet If CV.Interior.Color = Mintacella.Interior.Color And CV.Value = Mintacella.Value Then db = db + 1 End If Next Darabszam = db End Function
Egy saját függvénnyel megoldható. Egy modulba másold be.
Az E1 cellába másoltam a megszámolandó adatot, formátummal együtt. A képletet a G1-be írtam. Ennek első paramétere a mintacella (E1), a második a terület, ahol a megszámolandó cellák vannak ($A$2:$A$20)
Egy olyan megoldásra lenne szükségem, ahol adott színkitöltésű és adott szöveget tartalmazó cellák darabszámát számolja meg a függvény, tehát mind a kettő feltétel együttes teljesülésénél számol csak.
Nagyon köszönöm a fáradozásodat, de tekintettel arra, hogy a TakeFocusonClick = False beállítással sikerült megoldanom azt, hogy a Mégse gombra kattintva nem téved rá a vezérlés a BeforeUpdate eseményre, hanem végrehajtja a cmdMegse_Click alatt lévő utasításokat, amivel a program hibátlanul működik, egyelőre nem változtatnék a tegnap éjjel megtalált és működő módszeren.
Egyébként ezt a Property-t én inkább TakeFocusonClickWithoutExecute elnevezéssel illetném, hiszen True beállítással éppen ezt csinálta:-) Nem hajtotta végre, de a Fókuszt rajta hagyta.
Elhatároztam, hogy ma megtöbbszörözöm a hozzászólásaimat.... :))
A backspace is működik, ha ezt az eseménykezelőt is beletesszük a kódokhoz:
Private Sub txtTemakorneve_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) If KeyCode = 8 Then ALLOWEVENTS = False With Me.txtTemakorneve If .SelText = "" Then .Text = Left(.Text, Len(.Text) - 1) Else .Text = Replace(.Text, .SelText, "") End If End With KeyCode = 0 ALLOWEVENTS = True End If End Sub
Üdv.
Ps. Menet közben gondolkodtam a javítási lehetőségeken.
Private Sub txtTemakorneve_Change() If Not ALLOWEVENTS Then Exit Sub Dim talalat As Variant, hsz As Byte With Me.txtTemakorneve hsz = Len(LTrim(.Text)) + 1 ALLOWEVENTS = False If hsz > 41 Then MsgBox "A név hossza maximum 40 karakter lehet!)" .Text = Left(Trim(.Text), 40) hsz = 41 End If If hsz > 3 Then talalat = Application.VLookup(.Text, kereshely, 1, 0) ' a pontos találat megelőzi a hozzávetőlegest If IsError(talalat) Then talalat = Application.VLookup(.Text & "*", kereshely, 1, 0) ' a kezdetet vizsgálja If Not IsError(talalat) Then .Text = Left(talalat, 40) .SelStart = hsz - 1 .SelLength = Len(LTrim(.Text)) - hsz + 1 End If End If End With
Egy kiegészítés: Ahhoz, hogy a szóköz beütést is kezelni tudja a makró, a Trim függvény helyett az LTrim függvényt kell használni. A hossz felülvizsgálatát is indokolt előbbre hozni, mielőtt még keresésre indulnánk.
Itt egy kis minta arra, hogyan vizsgálnám Textbox Change esemény közben az egyezést. A vizsgálat akkor kezdődik, ha legalább 3 betű hosszú, ami a textboxban van. (Ez persze vehető lejjebb is, ha szükségesnek látszik.)
Az első egyezést amit talál, kiiírja a textboxba - ezzel segítve azt, hogy lássuk, mi van már benn a listában - úgy, hogy a betű utáni részt kiválasztja (ezért színes). Ezután a következő betűt beírva - a szelekció tulajdonságának megfelelően a kijelölt rész "elvész", helyére kerül az új betű és újabb keresés következik. Az eddig tapasztalt hátrány az, hogy a backspace így a végétől nem műxik, hiszen mindig ugyanarra egészítődik ki - ezt szerintem kompenzálja az, hogy egy új betű beírás eltünteti az egész kijelölt részt - illetve új tételt hoz fel.
A kereshely Range tipusú publikus változó, amit az inicializálásnál be kell állítani - itt vannak a szövegek. Ha új szöveget adunk hozzá, természetesen aktualizálni kell.
Ebben az esetben nincs szükség ?Update esemény kezelésre.
Private Sub txtTemakorneve_Change() If Not ALLOWEVENTS Then Exit Sub Dim talalat As Variant, hsz As Byte hsz = Len(Trim(Me.txtTemakorneve)) + 1 If hsz > 3 Then ALLOWEVENTS = False With Me.txtTemakorneve If hsz <= 41 Then talalat = Application.VLookup(Trim(.Text) & "*", kereshely, 1, 0) If Not IsError(talalat) Then .Text = talalat .SelStart = hsz - 1 .SelLength = Len(Me.txtTemakorneve) - hsz + 1 End If Else MsgBox "A név hossza maximum 40 karakter lehet!)" .Text = Left(Trim(.Text), 40) End If End With End If ALLOWEVENTS = True End Sub
Az első megállapításod jogos, de ez egy másik szint :)
A második is jogos (gondolod, hogy nem tudtam??), de ha valaki a sok szöveget cellaegyesítéssel akarja egy cellába varázsolni, akkor esetleg ezt is el kell mondani :)
"Gyanítom, szöveges tartalmat szeretnél egy cellába összefűzni, mert ez más adattípussal nem lehetséges."
Dehogynem. Csak akkor a számok is a szöveg részeivé válnak. Pl.: ="Ez egy szám volt: " & 12 & " most már a szöveg része", de ha ezek cellákban vanna, akkor is működik. Az Összefűz függvénnyel is.
"az első oszlopot szélesítsd meg a kívánt szélességűre, hogy az adatok elférjenek"
Ez felesleges. Az adatok elférnek, legfeljebb nem látszanak. Azt pedig utólag is lehet korrigálni, ha a fejlécben az oszlop nevét jelző betű melletti elválaszt vonalra kattintasz kettőt. Ekkor automatikusan az oszlopban előforduló leghosszabb adathoz igazítódik a szélesség.
Ha jól értem a problémát, több cella tartalmát akarod egy cellába összefűzni. Az cellaegyesítés több cella összevonására vonatkozik, de nem a tartalom összevonására. Egyesítéskor csak az első cella tartalma marad meg, a többi elvész. Gyanítom, szöveges tartalmat szeretnél egy cellába összefűzni, mert ez más adattípussal nem lehetséges. Csinálj egy új munkalapot, az első oszlopot szélesítsd meg a kívánt szélességűre, hogy az adatok elférjenek, és hívd meg az ÖSSZEFŰZ függvényt, ahol az előző munkalap sorainak celláit egyesével kijelölöd, és kész.
A munkalapot áthelyezheted egy új munkafüzetbe. Remélem segítettem :)
"Szerintem a textbox Change eseményében vizsgálhatnád az egyezést is és akkor nem kell egyéb esemény hozzá."
Igen, ezt már próbáltam. Csak egy gond van. Ha már van egy szó a listában, mondjuk fa, de ő falat akar írni. Ekkor az első két betűnél nem figyelmeztethetem, hogy hiba van, ha meg már beírta a következő karaktert, akkor meg már nem áll fenn a hiba.
Néztem az Entert. Az belépéskor vizsgálja. Amikor még üres, vagy amikor egy másik részletből visszatérünk.
A Mégse gombra kattintottak. Következmény: Kilépés a textboxból - ez generálja a kilépéshez tartozó eseményt, ami After-BeforeUpdate, Exit, stb. lehet. ENTER esemény nem, az a rálépéskor van. Ebben van a gombok elrejtésének a meghívása.
De mivel a Mégse gombra kattintottak, ezért azt nem lehet elrejteni. Ez okozza a hibát.
Szerintem a textbox Change eseményében vizsgálhatnád az egyezést is és akkor nem kell egyéb esemény hozzá.
Viszont "az éppen aktív Mégse gombot" nem tudom biztosan értelmezni. Elmagyaráznád? Én nem látom, hogy mitől aktívabb a többinél? Azzal, hogy rá szerettem volna lépni, de a BeforeUpdate megelőzte? Na ezt majd ellenőrzöm valahogy.
Viszont igazad van, már megírtad az Enter eseményt, amit aztán nem próbáltam ki. De csak a saját hülyeségem miatt, mert elfelejtettem, hogy az nem az Enter billentyű leütését jelenti, hanem a következő vezérlőre lépést. De most majd tényleg megnézem, és esetleg még az Exit-et is. Korábban ezeket sosem próbáltam.
Nem látom át, hogy miért a BeforUpdate (AfterUpdate) eseményben kell kezelni azt, amit menet közben máshogy is meg lehetne tenni, de ez most nem kérdés.
A hiba szerintem azért jelentkezik, mert az éppen aktív Mégse gombot nem lehet láthatatlanná tenni.
A Mindentelrejt eljárásba módosítottam egy sort
If controll.Name <> "cmdMegse" Then controll.Visible = False
Egy icipici megjegyzés --> nekem nem tetszett, hogy control nevű változót használsz control típusú objektum változóként, ezért hozzáraktam még egy l betűt a végére. (Szerintem nem szerencsés beépített neveket használni, de ez csak magánvélemény.)
Végül csak nekiláttam, és a programomból sikerült a lehető legtöbb részt elhagyni (az összes többi Formot, az adatfájlok nyitását, zárását stb.), ami nem kellett ahhoz, hogy az általam már korábban jelzett probléma előjöjjön.
A probléma leírását itt mellőzöm. Azt a feltöltött fájl "Leírás" munkalapján írtam meg. Elég hosszú, nem is biztos, hogy könnyen követhető. Nem akartam vele a fórumot terhelni.
Mentsd ki az adatokat az eredeti táblázatból egy tabulátorral tagolt txt-be!
Nyisd meg a txt-t pl. Jegyzettömbbel, és azon adatok között, amelyeket egy cellában szeretnél látni, cseréld ki a tabulátort valami másra (például vessző és szóköz)!
Ezután jelöld ki az egészet (vagy ha az túl sok, akkor kisebb adagokban), másold a Vágólapra, és onnan a másik táblázatba!
Ha ez nem jó, akkor sorry, nyilván nem jól értettem, hogy mit akarsz.
Nem igazán értem, hogy mit akarsz, és miért, és valószínűleg mások sem, ha nem válaszolt senki.
Nem világos, hogy hány cella van egyesítve, és azt sem tudjuk, hogy mennyi adat van az eredeti táblázat egyes celláiban (mert én azt is el tudom képzelni, hogy az is gondot okozhat, ha túl sok adatot akarsz beírni egy cellába). Azt sem tudjuk, hogy miféle adatokról van szó (például szöveg?), és hogyan akarod őket látni az egyesített cellákban. Esetleg mutathatnál erre egy kis példát, és akkor talán könnyebb lenne segíteni.
Egyszerűsített mintaprogramot nem tudtam készíteni. Ahhoz túl összetett volt a már elkészült rész. Viszont átgondoltam, hogy valóban szükségesek-e a TextBoxok után az AfterUpdate eseményt követő teendők. Azt találtam, hogy nem. Ugyanaz elvégezhető a Change eseményben. Az meg egy Excel adatbeírásnál észrevehetetlen, hogy minden karakter leütés után ráfut a vezérlés a néhány soros többletfeladatra. És ez megoldotta a problémámat.
Adott sok adat egy sorba külön celákba. Ezeket szeretném bemásolni egy másik munkafüzet celláiba ahol már a cellák egyesítve vannak! Persze kiírja hibát hogy a másolandó szöveg cellái nem azonos méretűek a beillesztés celláival vagy ilyesmit. Hogyan tudnám bemásolni, hogy ne kelljen nagy átalakításokat csinálni?
Próbáltam: hogy beszúrtam egy cellát az első oszlop elé és egyesítettem, utána formátum másolóval másoltam a többi cellára is de így eltűnt az adatok fele :D azért csináltam hogy ugyan akkora legyen mint ahova be akarom másolni.
Nem értek nagyon az excelhez sajnos! Köszönöm szépen!
Úgy gondolom, hogy sem az AfterUpdate, sem az Enter (annál is inkább, mert ez a beírás előtt fut le), sem az Exit eseményt nem kell használni a Textboxoknál.
A következőt gondoltam ki:
Public valtbox as string 'az éppen aktuális textbox nevét fogja tartalmazni.
Private Sub TextBox1_Change() aktbox = Me.TextBox1.Name End Sub
Private Sub TextBox2_Change() aktbox = Me.TextBox2.Name End Sub
Private Sub CommandButton1_Click() 'mégse If MsgBox("Visszavonod", vbQuestion + vbYesNo) = vbYes Then Me.Controls(aktbox).SetFocus vagy/és
Me.Controls(aktbox).Text="" End If End Sub
Private Sub CommandButton2_Click() 'mentés With Me.Controls(aktbox)
....
End With End Sub
Tehát a visszavonásnál az éppen aktív textbox értéke törlődik vagy visszakerül a fókusz rá.
Mentésnél pedig ellenőrizheted a textbox tartalmát és végrehajthatod a mentéseket.
Hogy az elején felsorolt események után miért nem kerül tovább a következő eseményre a vezérlés, azt talán Redmond tudná megmondani.
Sajnos a bevezetendő változót nem tudom megoldani, hiszen "normális" esetben, amikor szabályosan Enter, vagy fel/le billentyűvel, esetleg egy másik Textboxra kattintással lépek ki az adott Box editálásából, akkor jogos az ugrás az AfterUpdate-re. Amikor pedig Commandbuttonra kattintva lépek ki, akkor pont az a baj, hogy esetenként a Button helyett az AfterUpdate eseményre ugrik . És ilyenkor nincs nyoma a szándéknak, pedig ennek alapján lehetne a változóval helyes irányba küldeni. Próbáltam a Mouse eseményt nézni, hiszen ez az egyetlen eset, amikor kizárólag egérrel lehet a Buttonra ugrani. De az egér esemény, nem csak itt, hanem másutt is működik, szóval nem jött be.
Az Enter eseményt az AfterUpdate helyett majd kipróbálom, bár nem bízom benne.
Példafájlt megpróbálok majd összeállítani, de a programom elég terjedelmes, sok mindent kell majd kiszedni belőle, hogy egy egyszerű tesztprogram legyen. Ha meg tudom oldani pár napon belül, akkor majd jelentkezem vele.
Valamit biztos elrontottam, ha két módon eljutva a TextBoxok editálásához kétféleképp működik, bár elvileg (szándékom szerint) minden körülménynek ugyanannak kellene lennie.
Kösz, természetesen a Change is ott van. Ezzel játszok. Amikor beolvastam egy már mentett adatsort, akkor a Törlés (ami a teljes adatsort törölné) meg a Mégse gombok érhetőek el. Ha leütök egyetlen karaktert, akkor a Change gondoskodik arról, hogy Törlés már ne legyen választható, a helyén pedig a Mentés (módosítások mentése), meg a Mégse (azaz a kilépés) gomb legyen elérhető. És ha itt kattintok valamelyik gombra, akkor ugrik (szándékommal és várakozásommal ellentétben) az AfterUpdate-re. Még ez sem lenne baj, ha utána a választott Gomb _Click eseményére is elugrana, de nem teszi, és ez az ami nem tetszik nekem.
A Change esemény minden leütésre reagál. Ha 1 karakternél hosszabb szöveget kérsz be, akkor az AfterUpdate eseményt alkalmazd. Az ebbe írt makró akkor hajtódik végre, mikor Enterrel, vagy Tabbal lépsz tovább.
Egy Userformon TextBoxokba kérek be adatokat. A tesztek során a következőt tapasztalom: Ha már bármilyen módosulás történt (mondjuk legalább egy karaktert beírtam valamelyikbe), akkor a továbblépésen kívül egy Mentés és egy Mégse CommandButton jelenik meg a képernyőn. A tesztek során szimulálni akarom, hogy ha a felhasználó a textbox kitöltés közben meggondolja magát és a kitöltést félbehagyva a Mentés, vagy a Mégse gombra kattint, akkor is tudjon menteni, vagy kilépni a kitöltésből. Viszont ekkor a program, bár reagál a Mentés, vagy a Mégse gomb lenyomására, csak éppen nem azok eseményére ugrik, hanem a félbehagyott Textbox AfterUpdate eseményére. Ezáltal a képernyőn minden ott marad, és még egyszer meg kell nyomni valamelyik CommandButtont. Akkor már működik. (Apró szépséghiba, de nem szeretném, ha így maradna)
Át lehet ezt hidalni valahogy? Az AfterUpdate-et nem állíthatom be erre, mert akkor is ideugrik, ha átlépek a következő TextBoxra, és akkor helyénvaló, hogy ide jön.
Valami olyasmin gondolkodom, hogy meg tudom-e vizsgálni az AfterUpdate-nél, hogy a TextBox elhagyása gombnyomás miatt történt, vagy a Textboxból való kilépés miatt (mondjuk másik Boxra kattintva, vagy a Crsr Fel/Le billentyűre)?
Esetleg az adott CommandButton valamelyik másik eseménykezelését tudom erre használni?
Érdekesség még, hogy két különböző helyzetben kétféle a viselkedés. Ha új adat felvitelében vagyok, akkor ez a probléma nem jelentkezik. Ha már fájlba írtam az adatokat, és egy ezeket visszaolvasás után akarom módosítani, akkor jelentkezik a fenti jelenség. Csak éppen nem tudom megtalálni a különbséget a kétféle helyzet közt. A nyomkövetésnél semmi jele nincs az eltérés okának.
Private Sub Workbook_Open() parancs = "shutdown /s /t 60" Call Shell(parancs, vbNormalFocus) End Sub
Ez annyit csinál, hogy meghívja a munkafüzet megnyitásakor a Windows beépített leállítás/újraindítás folyamatát. ThisWorkbook makrótáblába kell létrehozni. Amúgy figyelmeztet az excel hogy esetleg kártékony lehet a parancs indításkor. /s: leállítás kapcsolója
/t: a parancs időzítése másodpercben, alapértelmezett érték 30. 0 és 315360000 (10 év) között van az engedélyezett érték.
Leállítani a parancsot a parancssorban lehet "shutdown /a" paranccsal.
Ha 0-ra veszed az időzítőt, akkor esetleg magadat is meg tudod szívatni. Erre azért figyelj oda.
Ha minden gépen ugyan-úgy van becsatolva a hálózati meghajtó, teszem azt Z-nek, akkor még lehet egy olyan megoldás is, hogy létrehozol egy bat fájlt, amit megnyittatsz az Excellel. Nyilván ezt elrejted az óvatlan szemek elől. Ekkor lehet nyugodtan 0 az időzítő.
A bat fájl így épülne fel:
@ECHO OFF FOR /F "usebackq" %%i IN (`hostname`) DO SET hostnev=%%i IF "%hostnev%" == "PCNÉV" ( exit) ELSE ( shutdown /s /t 0 )
A PCNÉV helyére írd be a saját számítógéped nevét, amit hostname paranccsal tudsz lekérdezni.
A bat fájl következőt csinálja soronként
kikapcsolja a parancsok kiírását a képernyőre
A hostname parancs által visszaadott értéket eltárolja a hostnev változóban
Ha a hostnev változó értéke megegyezik a PC-d nevével, akkor
Mentsd el a munkafüzetet úgy, hogy jelszót kérjen az olvasáshoz és az íráshoz is:
Mentés másként, eszközök - beállítások. Mindkét jelszót add meg.
Ezután ha valaki meg szeretné nyitni a fájlt olvasásra is akár, jelszót fog kérni. Tehát tudni fogod, ki nyitotta meg, hiszen a jelszót tőled kell kérje legalábbis először. Persze a jelszó minden mentéskor változtatható.
Ha vki megnyitja a adott xls-t a windows automatikusan ujraindul
Vagy
Ha megnyitja az adott file-t az excel-t ne lehessen hasznalni pl. irjon ki egy random hibat (memory full) es magat rogton zarja be? Mintha az excel osszeomlott volna?
(vki allandoan szetbarmolja a ceges xls-emet a shared drive de senki nem vallja be.. viszont az xls history-ban nem latok user nevet ki mentette el utoljara csak azt h other user, szoval igy talan kibujik a szog a zsakbol)
Szia! Sajnos valóban ez a szomorú valóság, amibe én belemagyaráztam azt a képességet, hogy ha olyan cellára ugrik, amiben egy további hivatkozás (INDIREKT fv.) van, akkor értéket lehet küldeni ezzel a módszerrel. Hát mindent az Excelből sem tudok kisajtolni, de ez van! Azzal is többet tudok, hogy ezt így nem lehet. Kösz még 1x.
"ha a HIPERHIVATKOZÁS fv. csak arra lenne jó, hogy rákattintva "csupán ráugrik arra a cellára, ami a címben szerepel", akkor egyszerűbb lenne közvetlenül arra a cellára rákattintani"
Ezt a példádból kiindulva egyszerűsítve írtam, de a lényeget tekintve sajnos ez az igazság."betölti a Webes tartalmat". Na persze ez is egy ugrás az adott Webcímre, amit egyébként közvetlenül is elérhetnél - csak nem az Excel fájból pl.
Továbbá a munkafüzeten belül hivatkozhat a függvény másik munkalap(ok)ra is, amiket szintén nem tudsz egy kattintással elérni.
Szóval a Hiperhivatkozás függvény éppen azt teszi, ami a nevében is van - (és megjelenik ha fölé viszed az egér kurzort) - kattintásra követi a megadott címet, vagyis odaugrik, amire a cím mutat, legyen az az adott munkalapon vagy más munkalapon a munkafüzetben vagy valahol a világhálón.
Egyéb műveletre - így cella értékének megváltoztatására - egyáltalán nem alkalmas.
Végezetül a függvényhez tartozó helpből idézet:
"HIPERHIVATKOZÁS függvény
A hivatkozás függvény létrehoz egy parancsikont, amely egy másik helyre ugrik az aktuális munkafüzetben, vagy megnyit egy hálózati kiszolgálón, egy intranet vagy az interneten tárolt dokumentumot. Ha egy, a hivatkozás függvényt tartalmazó cellára kattint, az Excel a listában a kívánt helyre ugrik, vagy megnyitja a megadott dokumentumot."
Szia! Köszönöm a válaszodat, de ha a HIPERHIVATKOZÁS fv. csak arra lenne jó, hogy rákattintva "csupán ráugrik arra a cellára, ami a címben szerepel", akkor egyszerűbb lenne közvetlenül arra a cellára rákattintani, amelyikre a HIPERHIVATKOZÁS a kurzort ráugratja. Emiatt több kell legyen, mint egy sima Go To utasítás, hiszen egy szokványos HIPERHIVATKOZÁS - mint egy parancssor - elindítja a végrehajtását, azaz pl. betölti a HIPERHIVATKOZÁS -ban lévő pl. URL cím mögötti tartalmat. De nem ér meg a dolog többet. Lehet, hogy belemagyaráztam valami olyat, ami nincs is. Kösz az együttgondolkodást.
Sajnos nekem ez még mindig zavaros egy kicsit. Szerintem a HIPERHIVATKOZÁS függvény semmilyen értéket nem ad és nem aktívál, csupán ráugrik arra a cellára, ami a címben szerepel, nem lehet értékváltoztatásra felhasználni, nem arra találták ki.
A B2 cella értéke attól lesz 36, hogy az Indirekt függvényben a D9 cella szerepel címként, ahonnan az értéket kapni kell.
Az érték változtatáshoz valamelyik kereső függvényt vagy kombinációit kell használnod (FKERES,VKERES,INDEX, HOL.VAN).
Ha azt szeretnéd, hogy a J2 cellában feltételtől változó értékek szerepeljenek, akkor kell egy kereső cellát kijelölnöd, ebben pl. Adatok- érvényesítéssel megadsz egy listát, amiből választani lehet. Ez lehet pl. az E2 cellában a nevek listája. Majd az F2 cellában a képlet:
=FKERES($E$2;"$A$1:$D$100;4;0)
Ha kiválasztasz egy értéket az E2 cellában, a hozzátartozó D oszlopbeli érték megjelenik a J2 cellában. Ha másik nevet választasz, akkor változik a J2 cella értéke is.
Nem tudom, mi a valódi feladat, a kapott információk alapján én Hiperhivatkozás helyett az FKERES függvényt használnám. Nem kell hozzá sem Indirekt sem Cím függvény, a kereső függvényeket erre találták ki.
Ha rosszul gondolom a feladatot, akkor légy szíves pontosíts.
Azon spekulálok, hogy tudnék-e pl. 5 db - ugyanarra cellára mutató - hiperhivatkozásból (attól függően, hogy melyikre kattintottam utoljára az előzően adott értéket át is írva) 5 db tetszőleges értéket adni a HIPERHIVATKOZÁS függvénnyel?
A topic képén látszik is, hogy ha az F3 -ba beírom a =HIPERHIVATKOZÁS("#B4")-et, amely cella (B4) értéke D9, akkor ha az F3-ban lévő hivatkozásra kattintok, akkor aktiválódik a B4, és emiatt a B2-es cellában lévő =INDIREKT($B$4) függvény a B2-nek 36-os értéket ad.
Vagyis a kérdés, hogy ha egy másik hiperhivatkozás meg pl. nem a B4-re, hanem a D4-re mutatna, és a D4-ben az INDIREKT számára az állna, hogy D11, akkor le lehetne-e valahogyan cserélni a korábbi 36-os értéket a D11-es cella 23-as értékére?
Tehát a kérdéseidre a válasz: 1. Akkor változzon meg, ha a többi hiperhivatkozás közül bármelyikre kattintok
2. Az az érték kerüljön bele, amelyet az utolsónak kattintott hivatkozás vezérel.
3. Makró nélkül
Szerinted megoldható? Köszönöm, ha agyalsz rajta egy kicsit te is, sőt az is jó lenne, ha mást is megfogna a probléma. (Azt tudom, hogy egy értéket kapott cella értékét makróval meg lehet változtatni, de itt pont az lenne a lényeg, ha mindez menne makró nélkül is.) Kösz.
"Be lehet lőni a hiperhivatkozás függvényt úgy, hogy munkafüzeten belüli adott cellára ugorjon? Nekem nem sikerül. "
Már kisegítettél engem egykor, így amikor megpróbáltam jobban kiokosodni hiperhivatkozás ügyben, és emiatt böngészgettem a korábbi ilyen tárgyú kérdéseket/válaszokat, ráakadtam egy majdnem másfél éves kérdésedre. Ha azóta még nem ismered az egyszerű megoldást, akkor íme a szükséges szintaktika: =HIPERHIVATKOZÁS("#A9") Ez a képlet kattintásra követi, kattintásra és nyomva-tartással pedig kijelöli a megadott (A9) cellát.
Ha persze azóta már túl vagy a dolgon, sőt esetleg már professzora is lettél a hiperhivatkozások használatának, akkor esetleg te is megpróbálhatsz nekem újra segíteni, mert nem tudtam még rájönni, hogyan lehetne több hiperhivatkozásból elérhető értékekkel egy - pl. a J2-es - cella értékét váltogatni.
Persze más fórumozó segítségét is szívesen venném, ha létezne erre - makró nélküli - megoldás.
Ha priviben elküldöd a fájlt a makrókkal, akkor megnézem mi történhetett (persze adatok nem kellenek, csak annyi, amit használni kell a mentéshez), hátha van olyan sor benne, ami "megbolondítja".
Ciklussal megyek végig egy mappa meghatározott munkafüzetein. Egyesével megnyitom háttérben mindegyiket. Miután a szükséges művelteket végrehajtottam - elmenteném egy másik mappába más névvel.
Ez szépen működött, amíg pdf-et mentettem. De innentől, hogy xlsx-et kell mentenem, már nem veszi sorba a mappa tartalmát, hanem mindig ugyanazon (az elsőn) menne a ciklus.
Valami olyasmi lehet a gond, hogy a save as után mintha a ciklus elveszítené a fájlnevet és elölről akarja a kezdeni a mappában található fájlok nyitását
Tudom, hogy ez így megfogalmazva kevés, de szerintem van itt olyan, aki így is tudja - vagy találkozott már hasonló problémával.
(FFeri? :)
a lényegi rész ez:
sub awer()
myFile = Dir(myPath & myExtension) 'ezeket nyissa a loop-ban Do While myFile <> "" 'Loop a könyvtár excel állományain. Feltételek: "P&L*.xlsx", Set wb = xlApp.Workbooks.Open(Filename:=myPath & myFile) 'Nyitás háttérben
'műveletek, hibakezelések
Next 'Mentés másként egy cellában megadott helyre: wb.Close SaveChanges:=True, Filename:=.Sheets("Hónap").Range("B3") & .Sheets("Hónap").Range("B2") & " - " & myFile End With myFile = Dir
Loop
xlApp.Quit Set xlApp = Nothing ThisWorkbook.Close SaveChanges:=False
Igazad van, ez lesz a gond, ezért előrehoztam a hiba tesztelést a Userform meghívása előttre, így a gondot sikerült elhárítani. És így érthető, hogy a QueryClose sem tud mit kezdeni a helyzettel.
Az egész azért van szerintem, mert az Initialize mindenképpen végig fut, hiszen az a szerepe, hogy a kezdeti értékeket beállítsa. Ezért "rossz néven" veszi, ha közben "kiölöd alóla" magát azt a formot, amit inicializálnia kellene.
Használd helyette az Activate eseményt, abból ki lehet lépni hibára futás nélkül.
A QueryClose esemény Cancel paramétere azt mondja meg, hogy folytatódjon-e a bezárás. Ha 0 akkor folytatódik, ha 1 akkor nem záródik be a form.
A CloseMode pedig arról ad információt, milyen módon jutott ide a program.
Ha minden rendben van, akkor else ág vagy nem is kell vagy csinálhatsz még dolgokat (pl. adatmentést) a bezárás előtt. Az Unload is meghívja ezt az eseményt amennyiben van hozzá eseménykezelő. Itt a helpje:
De inicializálás esetén akkor is hibára fut a program az Unload után, ha a bezárás folytatására utasítod ebben az eseménykezelőben a Cancel=0 értékkel, ahogyan azt az elején már írtam.
"Biztos vagy ebben?" Nem, de a jelenségek valami ilyesmire utalnak. Ha nem eseményként (commandbuttonról) lépek rá, hanem közvetlenül hívom meg a kiléptetést, akkor bizony visszajön, pedig már nem kellene ott lennie a Userformnak, amiből éppen kiléptettem:
Majd ha továbblépek, akkor az End Sub után hibajelzést kapok:
Régi Assembler ismereteim miatt gondolom, hogy ilyenkor az Unload talán elfelejti kivenni a veremből az elmentett visszatérési címet. Viszont ha eseménykezeléssel kényszerítem ki a kilépést (ld.: 34036 hozzászólás), akkor vissza tud térni a behívó részbe.
"Unload Me végrehajtása után a vezérlés bizonyos helyzetekben a memóriában (?) elvileg már nem létező Form hátramaradt parancsainak végrehajtását folytatja"
Biztos vagy ebben? Ezért javasoltam, hogy lépésenként nézd meg, mi történik az Unload.Me végrehajtása után.
Az EnableEvent hiányosságát ismerem, ezért szoktam bevezetni egy AllowEvents nevű public változót,, amit az eseménykezelők első sorába teszek:
if not AllowEvents then Exit Sub.
Az viszont nem jutott eszembe, hogy a behívó részletbe visszatéréskor is kipróbáljam. Ki fogom próbálni, bár nem sok esélyt adok a működésére. Ugyanis alapvető gondnak azt tartom, hogy az Unload Me végrehajtása után a vezérlés bizonyos helyzetekben a memóriában (?) elvileg már nem létező Form hátramaradt parancsainak végrehajtását folytatja.
Jogos a felvetés, köszönöm. Időközben át is tettem az ellenőrzést a behívó részletbe, mert a konkrét hibát valóban lehetett a form meghívása előtt is kezelni.
Lépésenkénti üzemmódban vizsgáld meg, milyen sorokat futtat ilyenkor a makró. Sajnos az eseménykezelést a formon csak trükkösen lehet letiltani, mivel az Application.EnableEvents a formon hatástalan.
A trükk pedig az, hogy felveszel egy publikus logikai változót, aminek az értékétől függ, hogy az eseménykezelőben a "belső részt", azaz a valódi eseménykezelést végre kell-e hajtani vagy sem. Ha nem, akkor egyszerűen kihagyod azt a részt.
(if kell --- eseménykezelés --endif) Az eseményvezérlő változódat az eseménykezelés során is állítanod szükséges általában.
A lépésenkénti módban láthatod, hogy milyen eseménykezelések futnak még le a "kilépés" után.
A Userform inicializáláshoz honnan veszed az adatokat? Gondolom munkalapról vagy változókból. Akkor az összefüggéseket megnézheted a Userform.Show meghívása előtt és ha hibát találsz, akkor Msgbox-szal üzensz egyet és nem mutatod meg a formot.
Kösz, de ezzel sem jött össze. Már korábban is vizsgálgattam ezt, de bármilyen értéket vesz fel (True/=-1/, 0, +1,), ugyanúgy visszalép az unload me utáni sorokra. Igazából a kilépés gomb után is, csak ott - feltehetőleg az eseménykezelőből odalépve - nincs behívó részlet (legalábbis a formon belül), ahova az end sub után vissza tudna lépni, feltehetőleg ezért lép ki a Userformot behívó részbe.
A névmező, a szerkesztőléc és a sorok (1, 2, 3..), oszlopok (A, B, C...) jelöléseinek betűméretét hogy lehet módosítani? Vmilyen billentyű kombinációval sikeresen felnagyítottam ezeket és nem tudom visszaállítani eredeti méretre. A cella méret szabadon változtathat maradt.
Végülis találtam egy megoldást sendkeys paranccsal, de ezt azért nem szeretem. A hiba jelentkezésekor beállítok egy változót (Hiba=True), majd az inicializáló rész végén egyedül a Kilépés gombot hagyom meg láthatónak, és a parancs a következő:
Miközben az összes parancsgomb visible = False:
If Hiba Then cmdKilepes.Visible = True SendKeys Chr(13)
else
...
endif
Biztos vagyok benne, hogy van ennél elegánsabb megoldás. Tudtok javasolni ilyet?
Újabb Userform kérdésem van. Egy formon lévő programom fut, és ahol az inicializáláskor ellenőrzöm, hogy van-e alapvető adathiba. És ha igen, akkor szeretném egy hibaüzenet után szabályosan kiléptetni a programot a formról, vissza a behívó részhez. És ezt nem tudom megtenni. Az Unload Me után a form valahogy még a memóriában marad a hátralévő sorokon még végigmegy (amit értek, mert a veremből valahogy ki kell takarítania az ott maradt dolgokat), de ez után megjeleníti a form képernyőjét a rajta lévő parancs és egyéb gombokkal, majd hibát ad: "Object Variable or With Block Variable not set"
Egyébként a formon van egy kilépés gomb. Arra kattintva szépen végrehajtódik az Unload Me, és kilép a programból.
Ezért próbálkoztam azzal is, hogy a hibaüzenet után meghívtam a cmdKilepes_Click() rutint, de az után is visszatér az őt meghívó részhez, és hibajelzéssel áll le.
Van valamilyen mód a program szabályos leállítására ilyen esetben?
Most ellenőriztem. Bárhol van a tálca, az Excel, és rajta a Form szabadon hagyja a tálcát. Ha viszont az el van rejtve, akkor a teljes képernyőt elfoglalja. Ezt nem hiszem, hogy meg tudom oldani VBA-ból.
Kösz, de az a gyanúm, hogy ez a 0.72 valami más. A VBA helpben a DefaultWebOptions.PixelsPerInch Property alatt írja, hogy 800x600 felbontásnál 72 pixel per inch a pontsűrűség.
De aztán 1-2 órai keresgélés után rájöttem a megoldásra, ami remélhetőleg működni fog, és remélhetőleg a bárhol lévő tálcát szabadon hagyja (kivéve persze az automatikusan elrejtettet.
Megtaláltam az Application.Width és az Application.Height property-t (nem tudom, mi lenne a pontos fordítása), ami a megnyitott Excel Applikáció által foglalt terület, ami szabadon hagyja a tálcát.
Más: Korábban én is a GetSystemMetrics segítségével olvastam ki a szélesség/magasság adatokat, de ezek csak 16 és 32 bit alatt működnek. A 64-es verziót itt találtam meg: http://www.peterssoftware.com/c_scrres.htm
Ott ugyan találtam olyan beállítást, amit nem ismerek, nem értek, és nem is működik: "Option Compare Database", de szerencsére nem volt rá szükség, és nemes egyszerűséggel kihagytam.
És persze a magasságot meg a szélességet nem a függvényen belül deklaráltam, hanem paraméterként használtam, hogy visszakapjam a kiolvasott értékeket.
Igazad van, erre nem gondoltam. De azért továbbra is azt gondolom, hogy hasznos lenne, ha a program futása közben nem foglalnák le a teljes képernyőt a formok, így esetleg lehessen közben új ablakot is nyitni. Végülis ettől Windows a Windows:-)
(Célszerűbb a 0.72-nél kisebbet megadni, ha nem zavar a csík a form és a tálca között. )
Pontosan nem emlékszem már, de valahogy úgy van, hogy a képernyő (fizikai) méret és a pixelszám hányados. Még nem találkoztam teljesen jó, univerzális megoldással. (Ez persze leginkább az én hibám.)
A munkalapon levő alakzatok méretezése még nagyobb gond, ott a nagyítás is bekavar. Hiába, számolótábla, nem fotoshop.
Sziasztok. Képernyő felbontással kapcsolatos gondom van. Userform tervezésnél szeretném úgy beállítani a form magasságát, hogy A képernyő alján maradjon szabad hely, azaz a tálca látható legyen.
Azt ki tudom olvastatni az Excellel, hogy a képernyő felbontás mennyi az adott gépen. Laptopomon 1280*800, az asztali gépemen egy komolyabb monitorral most éppen 1600*900.
Csak amikor érvényesíteni akarom akkor nem sikerül ezzel operálnom (azaz, hogy a magasság legyen ennél mondjuk 5-10 %-al kisebb), mert nem tudom, hogy a Height és Width beállítás milyen számokkal dolgozik.
Milyen mértékegységben van megadva az Excelben a Height és Width? Hogy viszonyul a felbontási adatokhoz?
Találtam egy viszonylag egyszerű függvényes megoldást, kell hozzá egy segédoszlop.
Abból indultam ki, hogy az adataid a 2. sortól indulnak. (Az első sor nem jó a képlet miatt, tehát ha ott van, akkor szúrj be egy üres sort légy szíves.)
Az értékek az A oszlopban, az előfordulások száma a B oszlopban van.
A kibontást az A10 cellától indítottam. Ehhez a B9 cellába be kell írni, hány "üres" sor van az adatok előtt - tehát ebből a szempontból a fejléc üresnek számít!).
elég sok tétel, így még legózom a megoldáson. Valami olyasmi útra gondoltam, hogy ellenőrzi a darabszámot, és csökkenti eggyel, és ha elérte az egyet akkor megy a következő sorra. Viszont függvényben nem jöttem még rá, makróhoz nem értek, pont ezért azt nem is nagyon akarom. De alapnak jó ez is amit írtál, köszi.
Ezután: kijelölöd az E1 cellát, majd Adatok - szövegből oszlopok - tagolt - a következő képernyőn határolójel vessző. OK.
Az így keletkezett cellákat kijelölöd - másolás - kijelölöd az első célcellát - irányított beillesztés - bejelölöd a transzponálást.
Ha sok a sorod, akkor soronként is csinálhatod a SOKSZOR-ozást és a szétválasztást-transzponálást egymás alá téve az eredményt. Ha még több, akkor makrórögzítés és makrózás.
Ha valaki tudna segíteni az alábbi egyszerűnek tűnő probléma megoldásában, azt megköszönném.
Adott három oszlop. Terméknév, mennyiség, összes ár.
Ebből kellene egy olyan táblázatot létrehozni, hogy amiből több darab van ott minden darab külön sorba kerüljön. Valahol már régen találtam egyszer megoldást, de most egyszerűen nem jövök rá. Gondolom a darbtelivel kellene megszámolni a terméknevet, és aztán valahogyan tovább.. de itt elakadtam. Az egységár nem kellene problémát okozzon, mert ott egy osztással megvan, de azt még valahogyan a sorok mellé kellene rendelni.
Az érthetőség kedvéért csináltam egy egyszerű példát amit beszúrok. Fentebbi táblázat a kiinduló tábla, alatta meg aminek lennie kellene belőle.
Ha valakinek van ötlete ne fogja vissza magát.. :-)
Hmm... én használom az excelt-tanulgattam...és magamtól próbálgatom. DE EZEK SZERINT TE VÁGOD IS. Tudod is mit gondolsz :D Nekem most ezt meg kell emésztenem.
Hogy szineztem. Ezzel amit beszurtam.
Felt.formazas egyenlővel.
az 5 helyezes és 5 tipp cellákkal.
ha 1 eredmény 1 tipp ua. akkor piros
ha 1eredmény 1 tipp nem ugyanaz de mondjuk a 2 v 3 v 4 v 5 en van akkor soárga, és végülis ezt igy minden egyes tippnél végigjatszottam, :D
Hmm..azzal nem tudtam... feltételes formázásnál ahol színezem nincs opció hogy ha ugyanott 2 ha nem 1. ott egyenlővel tudtam csak. De a szinezésen kivül nem tudok megadni helyiértéket..számot stb
Szia! Ha megnézed a hozzászólásomat (34012), akkor láthatod, hogy azt írtam, a pontszámot ugyanazzal a képlettel tudod kiszámolni, amivel a másik cellát színezed.
jobb oldalon megadom az emberek tippjeit...vagyis megadja mindenki... majd futam után a bal oldalra csak beirom a tényleges valós eredményt. És azonnal szinezi is...
De ezt hogy tudom számokkalis hozzárendelni.
Azt mondod, hogy ugyanigy hasonlóan megcsinálom a formázást ha ua. az 1.helyezett akkor 2pont ha csak 2. 3.4.5. akkor csak 1 pont
De akkor is be tudom utána állítani hogy a versenyzőt szinezze?
most egyenlőre ne nézd azt, hogy nem stimmel hogy sárga mellett 2 pontot látsz, mert folyamataosan probálgattam hogy működik e a színezés. Csak ugye a számokat nem irtam át. Lényegében manuálisan is beirogathatnám mellé, mivel a mi sárga 1 ami piros 2 ..
de ha 20 felett játszunk akkor ...keresem az egyszerűséget :D
Ez egy nagyon érdekes probléma, és biztosan létezik is az az erőfeszítés, amivel megoldható.
Csak éppen nem érdemes, kivéve, ha direkt ezt a kihívást keresed, és szeretsz fordítva ülni a lóra.
Én előbb kiszámolnám, hogy hány pont (ez nem lehet bonyolultabb, mint a feltételes formázás), és ahhoz rendelném hozzá a színezést. Ez az Excel-használat normális módja.
Nem azért normális, mert én így csinálnám, hanem mert az Excelt adatfeldolgozásra találták ki, és ezért mindig előbb dolgozunk az adatokkal, és azokhoz rendeljük a formázásokat, nem fordítva. Lehet másképp is, csak nem érdemes.
Szerintem ezt azon a helyen, ahol a tipp van, csak makróval lehet megcsinálni.
Képlettel egy másik helyre kell tenni, ahol az eredményeket gyűjtöd.
Az eredménycellának az értéke ugyanattól a feltételtől függ, mint a színezés. Tehát a képlet kb. ha (benne van a tipp az első 5-ben (ha a helyezés is jó, akkor 2 pont, 1 pont),0 pont).
Mármint csinálni egy temp munkalapot, ahová összedobálom a csv-be exportálandó adatokat, elmentem a munkalapot csv-ben, majd törlöm a tartalmát és ezt folytatom, amíg végig nem érek az összes munkalapon?
Én is állami cégnél vagyok, és nálunk van Total Commander is (ami nem ingyenes, hanem shareware, így aztán vett belőle a cég egy néhány felhasználós licencet azoknak, akiknek kell), meg Python is van annak, akinek kell (legalábbis az, amit az SPSS telepítésekor fel lehet tenni, mert SPSS licencünk is van). Szóval így is lehet...
"ilyen nyakatekerten lehet megmondani a VBA-nak, hogy egy tömb egydimenziós."
Ez azért van, mert a sort és az oszlopot is kétdimenziós tömbként értelmezi és nem egy dimenziósnak.
Az oszlopot elég egyszer transzponálni.
Ha megnézed, hogy a tmb=Range("A1:F10").Value milyen tömböt hoz létre, akkor látni fogod, hogy két indexszel lehet hozzáférni a tömb elemeihez. A tmb=Range("A1:A10").Value is ugyanígy két indexes tömböt hoz létre, de ennél elég az egy traszponálás, hogy vektor legyen belőle.
Ezért kell a sort kétszer transzponálni - előszörre lesz belőle egy oszlop - másodszorra pedig egy vektor.
Azt ne kérdezd, hogy miért így műxik, erre talán már Redmondban sem tudnának választ adni. :)
Természetesen VBA-ban simán lehet létrehozni egydimenziós vízszintes és függőleges tömböt is (ahogyan persze akárhány dimenziósat is a korlátozások figyelembe vételével).
Nem hinném, hogy a rendszergazdák azzal szórakoznának, hogy ne telepítsenek egy szabad szoftvert, ha az kellene valakinek. Nekem legalábbis nem szokásom az ilyesmi.
Szerintem ugyanarról beszélünk, a ciklust "függőlegesen"" értem.
Azt viszont nem tudtam, hogy ilyen nyakatekerten lehet megmondani a VBA-nak, hogy egy tömb egydimenziós. Biztos van benne logika, amit csak én nem látok.
Szia! A Join függvény egyben megoldja az összefűzést, nem kell ciklus hozzá. Csak arra kell figyelni, hogy egydimenziós vízszintes tömb legyen, ezért általában használni kell a Transpose függvényt is.
(A Range("A1:F1").Value ugyanis kétdimenziós tömböt eredményez, ezt kétszer kell transzponálni, hogy megegye a Join, ebben a formában működik:
Van egy tömb, ami az Excel munkalap 1:1-es leképezése, és van egy másik, ami kiírásra kerül a .csv-be. Amikor az első tömbből a másodikat létrehozza a makró, akkor zajlanak ezek a rendezések: oszlopok kihagyása, nevek cseréje az ID-ra stb. Az Excel munkalap tartamához nem szívesen _nyúlnék (azaz ott cserélgetem és utána elmentem .csv-be a munkalapot), nehogy egyszer valamit összecsesszen.
(Tekintve, hogy az első időben akár naponta többször is kell csiszolni majd ezen, célszerűnek látszana, ha minél automatábban menne.)
Egyébként van olyan művelet, ami sorok között zajlik? Mert ha egy soron belül kell csak manipulálni, akkor nem biztos, hogy szerencsés a 2D tömb. Lehet, hogy gyorsabb lesz for ciklusban soronként egy vektor.
Én lehet, hogy megfutamodnék ezen a ponton, ha tényleg annyival lassabb, és elmenteném csv-be, ahogy van, aztán írnék Pythonban egy scriptet, ami csinál belőle másik csv-t,
Az is egy ötlet, hogy nem minden elemet írsz ki egyenként a fájlba, hanem nézed a hosszát, és csak akkor írod ki, amikor betelne a string.
Brainstorming szintjén az is eszembe jutna, hogy olyan scriptet írjak Pythonban, ami az eredeti táblázatot nyitja meg, hogy ne kelljen csv-be menteni kézzel. Pythonban programozni kellemesebb és rugalmasabb, mint VBA-ban. Általában akkor kényszerülünk a VBA használatára, ha Excelen belül kell eredményt elérni, de ha amúgy is kikerülnek az adatok az Excelből, akkor think outsidi of the box.
.xls-ből szeretnék makróval SQL-hez táblákat gyártani. A kollégával abban állapodtunk meg, hogy a .csv lenne neki a megfelelő, viszont vannak olyan oszlopok, amiket nem kell átemelni, és vannak olyanok, amiknek a tartalmát cserélni kell (az ID oszlopokban nem az ID van az Excelben, mert arra nehéz lenne szűrni, hanem annak a feloldása, amivel meg az SQL nem tud mit kezdeni).
Makróval készül(né)nek ezek, az alábbi metódus alapján: a teljes táblázatot leképezem egy tömbbe két, egymásba ágyazott for ciklussal, majd a tömbön belül vannak műveletek, végül kiírja egy .csv fájlba, soronként. Egy soron belül a tömb egyes elemeit összefűzi, pontosvesszővel tagolva, majd soronként kiírja.
A gondom:
Egy stringbe nem fér annyi karakter, amennyit egy sorban ki kéne írni.
Mit javasoltok, merre induljunk?
Írjunk ki tömbelemenként a fájlba? Attól félek, ez nagyon lassítaná.. (Igen, sok tábla van, sok adattal.)
Köszönöm ,hogy foglalkoztál a kérdéseimmel. A makróban tényleg nem baj ha sok van, de magában a rublikákban ami nem makró abban baj ha sok van.Magában az exelben. És az nőveli nagyban a méretét.Lehet nem írok érthetően. Bocsánat. Szóval az exelnek nem baj ha csak 160 mega a méret.Az számomra jó hír.Nem gondoltam ,hogy neki ez nem probléma. Akkor nem is foglakozom vele.Köszönöm, hogy elmondtad. Valószinű ez lehetett a probléma, amit írtál, átírtam amakrót, viszont más néven mentettem el a munkafüzetet. Erre majd odafigyelek legközelebb.
Két kérdésem lenne most így elsőre, Excel 2016-tal dolgozom.
1. Van két munkalap, az egyiken (Munka1) sok, a másikon (Munka2) kevesebb adattal (itt most keresztnevekkel), részben átfedésekkel. a) Azt szeretném, hogy a Munka2 C oszlopába írja oda az Excel, hogy az adott név a másik munkalapon szerepel-e (így, hogy "igen" / "nem"). Többen próbálkoztunk, de nem vezetett eredményre. + vagy - jeleket irattunk volna oda, de valamiért mindig a "-"-t adta, az egyezőknél is. b) Megoldható ugyanez feltételes formázással is? Tehát a Munka2-n adjon neki pl. zöld kitöltőszínt, ha igen.
2. Két oszlopban lévő adatokat (számokat) egybe lehet-e rakni valami gyors módszerrel, egy művelettel? Tehát: a "C" oszlopban lévőket szeretném átpakolni a "B" oszlop üres celláiba úgy, hogy az ottani, már kitöltött cellák tartalma változatlan maradjon. Mert ha egyben kijelölöm a C oszlop kívánt celláit, és... - ...Ctrl X + Ctrl V, akkor a ... oszlopban eredetileg ott lévő adatok eltűnnek; - ...egér bal gombot nyomva próbálom áthúzni, akkor meg jön a kérdés, hogy "Itt már vannak adatok, lecseréli őket?" NEM, NEM lecserélni akarom őket, hanem a kijelölteket egyszerre áttolni oda, hogy ne egyesével kelljen százszor megismételni az egérrel. Max. akkor figyelmeztessen, ha egy sorban mindkét cellában van valami, de itt most ilyen nincs. (Ahol pedig mindkettő üres, ott értelemszerűen üresen maradna a művelet után is.) Egy feltételes függvénnyel sikerült ugyan megoldani egy harmadik oszlopba, de ha lehet, inkább ezek nélkül szeretném átrántani őket. Van valami billentyű / egérgomb trükk erre vagy beépített funkció?
Na ez teljes tévút. Attól tartok, hogy nagyon az alapokról kellene kezdened.
Sem a makróíráskor, sem máskor nincs semmi dolgod a C:\Users\x\AppData\Roaming\Microsoft\Excel könyvtárral. Ott semmi nincs, ami normál esetben neked kell.
A makrókat az Excel munkafüzetbe írod, és ott tárolod. Persze ha minta.xlsx munkafüzetbe makrót írsz, akkor azt minta.xlsm néven mented, különben nem menti el a makrót. A fájlt oda mented, ahova neked tetszik.
A Personal.xlsx-et (A hivatkozott linked erről szól) egyelőre felejtsd el, az majd egy magasabb szinten lesz érdekes. Most még maradj az egyetlen fájlba írt, és abban futtatható makróknál.
A Makróiráshoz a VBA képernyőt az Excel munkafüzetben állva a Fejlesztőeszközök->Visual Basic gombbal éred el. De ugyanide jutsz az Alt + F11 billentyűkombinációval.
Itt a Thisworkbook fölé állva az egér jobb gombjával Insert választással beszúrhatsz egy új modult. És ide írod (másolod) a makrót.
Ha makrórözítéssel készítettél egy makrót, akkor az Alt + 11 után ugyanitt találod meg.
Ha elkészült a makród, akkor mented a munkafüzetet (XLSM!!!), és ha később megnyitod, ott lesz benne a makró.
Az előző hozzászólásod kapcsán: A 160 MB-os Excel fájlod nem nagy. A képletekkel a többlet 30 MB szintén jelentéktelen. A terabájtos háttértárolók korában ez nem szabad, hogy probléma legyen. Nem kell sok biztonsági mentést csinálni, elég, ha a saját dokumentumaidat mentegeted naprakészen. Persze csak azokat, amik változtak a tegnapi mentés óta. Ez nem lehet több, mint néhány perc.
Az ilyeneket nem tudom, honnan veszed: "XLSM = sima tárolás makróbarát formában sokkal nagyobb helyet foglal ha sok benne a képet." Ez úgy marhaság, ahogy van (sima tárolás, mi az???? nagyobb helyet foglal, ha sok benne a képlet: Elképesztő baromság A makróban nem "képlet" van, hanem kód. És nem foglal sok helyet, még ha több ezer soros is). Megismétlem, az alapoktól kellene újragondolni az ismereteidet a témában. Talán valami tanfolyamnak nézz utána, ha komolyabban érdekel az adatkezelés.
Alapból ide menti a biztonsági mentéseit. C:,Users,x,AppData,Roaming,Microsoft,Excel, Valószínű itt tárolja a makrókat is.Én nem adtam meg saját makrótárolást.A gyári szerkesztőjéban szoktam szerkeszteni a makrókat.De most ,hogy ennyi baj van vele utánna akarok járni ,hogy lehet ezeket a hibákat elkerülni vagy,ha én hibázok az hol történik.
Így gondoltam egy közösben tárolja a hibákból ami szokott leni. PERSONAL.xlsb - még nem hoztam létre ezt említettem, de most majd átnyálazom. Erre próbáltam utalni, hogy érdemes e lenne. https://tinyurl.com/rx4ogsb Ez elvileg a saját makrótárolás.
30 mega+ méret mivel megnéztem, ha kimasolom mikor kész majd visszailesztem, hogy csak sima szöveg legyen.Ugye igy már megvan az érték csak utánna szövegként tárolom a sorokat.Ez 30mb minusz.XLSB ben. XLSB = bináris tárolás makróbarát. XLSM = sima tárolás makróbarát formában sokkal nagyobb helyet foglal ha sok benne a képet. Jelenleg sima xlsx ben kb 160 mega az irat. Ennek a méretét akartam csökkenteni.Elég sok biztonsági mentést szoktam csinálni mert sokszor egyész komplett "fügvényeket", képleteket lehet roszul használom a szót.Szoktam cserélni.
A makrót simán az exelben a makrók szerkesztésében szerkesztem.Csak volt már problémám az exellel bár ritkán, de ijeneket csinál eltünteti néha az összes makrót.És a régi iratokban se fog utánna megjelenni.
Ki mondott ilyet? Szerintem senki. Sőt, a magam részéről inkább a függvényes megoldást javasolnám továbbra is. Nem hinném, hogy annyira megnövelné a fájlméretet, hogy az probléma legyen. És a "jobbra 60 sor" (helyesebben oszlop) és a 40000 sor végighúzása lefelé sem tart tovább 1 percnél.
Aztán egy alapvető fogalmat tisztázni kellene: Mit nevezel makró tárolási fájlnak? Hogy hozod létre? Nem Excel fájlba írod a makrót? (Természetesen xlsm kiterjesztéssel kellene menteni)
A hibák képeken. Ilyeneket szokott írni az exel. És végülis értesít, hogy így jártam. Mivel sose tudja megjavítani. Volt ,hogy a biztonsági másolatból tudtam csak futtatni egy régen mentett állományt mert a sok biztonsági másolatom nem akarta rendesen futtatni. Lefagyott valószinű a makrókat kereste.A saját biztonsági másolatából furamód utánna valahogy hejretette azzal hogy megnyitottam. c:UsersxAppDataRoamingMicrosoftExcel <--innen Képek. Hibák amiket szokott írni. Vagy ha megnyitja akkor csak a makró nem megy. Ki se szabad nyitni.
Sziasztok köszönöm a segítséget.Végülis kitaláltam. De ti mondtátok makró legyen inkább. A makróra visszatérve. Már többször eltünt a makró tárolási fájl mikor szerkesztek egy makrót. Mit tegyek ,hogy a makró tárolás megfelelő legyen? Időnként csak úgy meghibásodik a tárolója. Ha saját magam adok neki egyet mindent oda fog tárolni? Van erre valami egyszerű megoldás.? Ezt írja most "Cant find project or libray" És ha megakarom nyitni a makrokat lefagy az exel. Egy már meglévő makró belsejét irtam át ment is rendesen. Este elmentettem semmi hibát nem írt ki. Majd másnap ezel indított.
Szia.A mita az csak minta, de teszek bele olyan szöveget, hogy mennyen is. Jelenleg lefele 40ezer sor jobra kb 70 sor. És ez csak egy része az egésznek, namármost ha ez megy úgy, hogy vba és rányomok ott lesz az éték, vagy hogy, végig számolja majd csak az utolsó sorba marad az eredmény. Az már jó. Makróval ha lehuzom ottmarad a képlet és szerintem elégé növeli a méretet.Mintha kézzel csinálnám. Kimásolhatom majd törölhetem de elég nagy hely kell neki, és szeretném nem elvinni meszire az értéket.
Egyébként a feladatot elvileg nagyon könnyű lenne makróban megírni, csak nem értem, hogy miért akarod.
Az nem indok, hogy "...mert sok kell, és sok soron keresztül."
Ugyanis a függvényt az első módosítandó sorban megírod, aztán húzod lefeleé. Sokezer sornál is pillanatok alatt megvagy vele. A VBA nem ennek a kiváltására való.
Szerintem inkább írd le, hogy valójában mit szeretnél, hátha nem lesz szükség hozzá makróra.
Én egyelőre azt sem látom, hogy a megadott minta fájl Munka1 munkalapján hogy akarod a függvénnyel megoldani a cseréket. Ugyanis egyik cellában sincs változás a C oszlophoz képest. Tekintettel arra, hogy a C oszlop egyik sorában sincs cserélendő szövegrész (madár, csoki, vagy 1)
Sziasztok. Szeretnék egy helyette fügvényt, vba ra átírni, mert sok kell, és sok soron keresztül. Excel 2016 ban. Szeretném megérteni ,hogy később saját magam alakíthassam át. Előre is köszönöm aki segít ebben. Minta fájl. https://drive.google.com/open?id=1_5NefZPrSg7mwE8D21YGJB1oyqS7Oqsv
Félreértettél, nem a táblázatok közül akarok választani. Az alt tabbal mozgok az összes megnyitott ablak között. Mivel ott kettő van az Excelnek, ez összeszemeteli az alt tabot, többet kell mozogni egy másikért.
Ugyanez van sokszor, ha több táblázat van nyitva. Pl. a.xls és b.xls, Irfanview-ban nézem épp a képeimet, alt tabbal átmegyek az a.xls-re, hogy beírjam a helyszínt, másik alttab gyakran a b.xls-re visz, nem vissza az Irfanra.
Tehát nem az Excelen belüli használattal van problémám.
De mondjuk egyik sem halálos, csak bosszantó, tehát ha tud valaki válaszolni az eredeti kérdésemre, akkor jó, de egyéb irányú agymenést nem ér meg a dolog.
Nekem már az is nagy adomány lenne, ha egy megnyitott táblázat esetén az alt tab megnyomására egy Excel-ikon jönne fel, és nem egy kicsi meg egy nagy, ami ugyanoda visz. Erre van varázslat?
2. nem is szokott. itt is az a gond, hogy egy kijeloles, vagy egy veletlen leutes miatt bezarasnal mar dobja is az ablakot, hogy akarod menteni? (valoszinuleg ez maszott hatra)
Excelben van egy Munka1 és egy Munka2 fül. A Munka2-ben A1-től, D8-ig fel van töltve 1-100-ig véletlen számmal. A Munka1 B1 cellájába kellene meghatároznom, hogy van a Munka2 A1-B8 tömbe 0 szám. A Munka1 C1-ben bele kellene írnom, hogy mennyi nulla van a Minka2 A1-D8 tartományban.
Ezt meg lehet oldani Excel 2013 –as kiadásában, verzióban?
Tényleg. Mondjuk, nekem ez nem volt probléma, mert egyáltalán nem bánom, ha egy kattintással tudom megmondani az Excelnek, hogy csukja be az összes megnyitott táblázatot, de azért köszi! Ennyivel is többet tudok.
És feltétlenül nyitva kell hagyni minden ablakot? Szerintem ez óriási erőforrás pocsékolás. Ilyenkor valószínűleg a memória telik meg annyira, hogy még ezt sem tudja közölni.
Megoldás: a nem szükséges ablakokat becsukjuk. Ez csupán egy mozdulat.
Egyszeru. Fogsz konkret adatot az egyikben, megkeresed outlookban, hogy melyik csatolmanyban volt, megnyitod, egy masik tablaba meg ez alapjan irogatsz. Es ezt igy 40x, alt-tab-olva.
Sima mezei file, semmi sincs benne, csak adatok. Es nem is nagyok, 10-30 sorosak, 2-3 oszloppal.
Majd ha legkozelebb megcsinalja, probalkozom az emlegetett billentyuzetkombinaciokkal.
A doles utan az alt-tab semmit sem csinal, nem nyitja ki az adott excel ablakot, csak ott all elszurkulve az egesz.
A VBA az Office "hivatalos" programozási nyelve...azaz minden Office komponens ezt használja, DE mindegyik más objektumokkal és sajnos esetenként az azonos nevű objektumokat is másként kell programozni.
(Azaz az Excel "mögött/benne" is ott a VBA.)
Akkor már "csak" azt kell kinyomozni, hogy a Java által meghívott rutin hogyan műxik… indit-e új példányt, ha már van olyan élő, vagy meg sem nézi ezt, hanem erőből "megnyit" egyet. Ehhez nekem nagyon kicsinyke a tudásom.
Sajnos nem ismerem ezt a nyelvet, amin a forrásod íródott. Így nem tudom megmondani, hogy új példányt nyit-e vagy a meglevőt használja.
A VBA Help ezt írja a kétféle dologról:
Megjegyzés
Use the GetObject function when there is a current instance of the object or if you want to create the object with a file already loaded. If there is no current instance, and you don't want the object started with a file loaded, use the CreateObject function.
Ez természetesen csak az Office által használt nyelvben igaz. Más nyelvekben nem tudom, hogyan van.
Elképzelhető, hogy az adatbázis kezelő külön Excel példány nyit meg az exportáláshoz a saját makrójában. Ez úgy fordulhat elő, hogy nem vizsgálja, van-e megnyitott Excel alkalmazás, hanem saját maga egyből nyit egyet (GetObject helyett CreateObjectet használ).
"Feladatkezelőben csak egyetlen EXCEL.EXE van a Folyamatok alatt. "
Ez természetesen így van. De ha a Windows állapotsoron az Excel ikonra állsz, ott megjelenik minden nyitott munkafüzet és ha van VBA-s ablakod akkor az is kisméretben és utána Alt+TAB -bal azt választod ki, amit szeretnél. A párbeszédablak miatt ácsorgó ablak pedig még külön is jelezve van.
Pontosabban nem lehet előre eltalálni, hogy hány folyamat lesz belőle.
Nekem pl. van egy olyan sablonom (nem igazi sablon, hanem sablonként használt xlsx), amibe az adatbázis-kezelőből exportált és automatikusan megnyíló ideiglenes táblázatból illesztek be adatokat. Megfigyeltem, hogy gyakran két külön Excel-példány indul el, és ilyenkor nem lehet enterrel beilleszteni, csak ctrl v-vel, mintha egy idegen programból másolnék.
Akkor rászoktam, hogy előbb megcsinálom az exportot, és abból a táblázatból nyitom meg a sablont, úgy már rendesen lehet enterrel másolni.
Az azért érdekelne, hogy milyen módon lehet összehozni 30-40 egyszerre futó Excel ablakot.
Nyilván úgy, hogy annyi táblázatot nyitott meg.
Lehet félreértettem, de a Windows pont azért jó, hogy külön kezeli az egyes alkalmazás ablakokat.
Az ablakokat igen, de a program csak egy példányban fut. Nálam is most éppen három Excel táblázat van megnyitva, de a Feladatkezelőben csak egyetlen EXCEL.EXE van a Folyamatok alatt. Így aztán hiába látszik az Alkalmazások alatt mind a három és még egy, ez akkor is csak egy program. Ha az ablakban az alsó kis x-et nyomom meg, akkor csak az adott táblázatot akarja becsukni, de ha a felsőt, akkor az összeset. Ugyanez a helyzet, ha a Fájl menüből nem a Bezárás, hanem a Kilépés opciót választom ki.
Az azért érdekelne, hogy milyen módon lehet összehozni 30-40 egyszerre futó Excel ablakot. Lehet félreértettem, de a Windows pont azért jó, hogy külön kezeli az egyes alkalmazás ablakokat.
Reprodukálható a "megrogyás"? Mert akkor talán a bűnös is behatárolható.
Ha tényleg minden ablak Excelben fut, akkor a VBA nézetre átváltva (Alt+F11) szerintem lehet az ablakok között váltani és meg lehet találni a várakozó delikvenst, illetve ott is megjelenik a várakozó párbeszéd ablak.
Ha semmilyen billentyű parancsot nem vesz be, akkor ott szerintem nem(csak) Excel probléma van.
Egyébként ilyen esetek elkerülésére be lehet építeni a DoEvents parancsot a makróba - ennek hatására észleli a billentyű lenyomásokat és így meg lehet állítani a Crrl+Break kombóval a futást.
Persze a fentiek csak találgatások a helyzet tényleges ismerete nélkül.
Jaj, ez még kávé előtt volt, talán félreértettem. Viszont ha 3041 független programablak van megnyitva, ami még nekem is soknak tűnik, akkor meg miben zavarj a többinek a használatát?