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.
Erre a munkalap eseményei, illetve az ezek kezelésére írt kódok valók. Sima cellára kattintás nem minősül munkalapeseménynek. A SelectionChange esemény közel van hozzá, de nem ugyanaz. Ezért a dupla kattintást javaslom:
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) Select Case Target.Address Case "$B$1" 'ide jön a kód, amivel a kettő többszöröseit megbütykölöd Case "$C$1" 'ide jön a kód, amivel a három többszöröseit megbütykölöd End Select Cancel = True End Sub
Nyilván, a Case kifejezések sorát lehet bővíteni. Vagy lehet univerzális bütykölést lekódolni, ami a duplakattintást fogadó cella értéke alapján módosítja egyéb cellák formátumát.
Atyaég miket tudol, akkor nekem is tudsz valami használható ötletet adni?
Az Eratosztenész-i szitát szeretném szemléltetni, addig még megy, hogy egy 10x10-es mezőbe beírja a számokat 1-től 100 ig.
Most valami olyan jönne, hogy rákattintok a 2-re (B1-es cella) és erre valami csinálnia kéne a 2 többszöröseivel (pl.karakterformázás, esetleg eltüntetés. Fogalmam sincs, hogy hogy lehet ilyesmit csinálni, tehát egy cellára kattintva annak tatalmától függően más cellák tartalmát megváltoztassa. Link is jó, ha van erre valami irodalom.
Többnyire utánajárok a különböző függvényeknek, és igyekszem magam megalkotni őket, de most nagy fába vágtam a fejszémet, és nem találom a megoldást.
Arról van szó, hogy van két cella tetszőleges szövegget. Kicsit konkretizáljuk: az A1-ben van mondjuk az a mondat, hogy:
"Két kuka áll az utcán."
A B1-ben pedig:
"Két fekete kuka és egy autó áll a téren."
Szeretném ezt a kettőt úgy összehasonlítani, hogy a C1 cellában az A1 és a B1 közötti különbség látszik. Azaz egy az egyben kellene a Word-ből a dokumentumok összhasonlítása funkció.
A fentiek alapján a C1-ben az lenne, hogy: - fekete - és egy autó - z utcán (<- ez áthúzva, vagy jelölve, hogy az eredeti szövegből kiesett) - a téren
Lényeg tehát: látsszon mindenféle változtatás az eredeti és az új szöveg között.
Nézegettem a SZÖVEG, HASONLÍT stb. függvényeket, de alapból egyik sem ilyen okos, illetve egyszerű esetben használhatóak lennének könnyen (ha mondjuk tudjuk, hogy mindig csak a szöveg eleje változik), de a fenti, viszonylag egyszerű példában is több helyen változik a szöveg (bejönnek új szavak, ill. van, ami kiesik).
Sub Összevon() Dim WS As Worksheet, WBSrc As Workbook, WBDest As Workbook Dim FN As String, Folder As String
With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Melyik mappában vannak a munkafüzetek?" .AllowMultiSelect = False .Show Folder = .SelectedItems(1) & "" End With
Set WBDest = Workbooks.Add FN = Dir(Folder & "*.xls", vbNormal) While Not FN = "" Set WBSrc = Workbooks.Open(Folder & FN) Set WS = WBSrc.Worksheets(1) WS.Name = Left(Replace(LCase(WBSrc.Name), ".xls", ""), 30) WS.Copy WBDest.Worksheets(1) WBSrc.Close SaveChanges:=False FN = Dir() Wend End Sub
Arról neked kell gondoskodnod, hogy ne legyen közöttük két egyforma nevű fájl (pl. "valami.xls" és "valami.xlsx"), és tényleg mindegyik munkafüzetben csak 1 munkalap legyen.
Sziasztok! Van több mint 100 db Excel fájlom, mindegyik egy munkalapból áll. Hogyan tudnék ebből a legegyszerűbben egy Excel fájlt létrehozni, hogy mondjuk a munkalapok nevei a különböző fájlok nevei legyenek?
Itt a megoldás, ha egy blokkban vette ki a szabadságát: Szabi első napja: =MAX(--(B2:B31="sz")*(A2:A31))
Szabi utolsó napja: =MIN(IF(B2:B31="sz",1,1000000)*(A2:A31))
FONTOS: - mindkét képletet Ctrl+Shift+Enterrel kell lezárni, NEM Enterrel! Ha jól csináltad akkor {} közé kerül a képlet - formázd a cellákat dátum formátumúnak, egyébként csak egy számot látsz - A ledolgozott órák a B2:B31 tartományban vannak - a napok az A2:A31 tartományban.
Sehogy sem jövök rá, hogyan lehet kikapcsolni (makróból) azt, ha kilépek egy munkafüzetből ne kérdezzem rá, hogy szeretném-e menti, hanem mentés nélkül zárja be, lépjen ki. A lényeg, hogy meg szeretném oldani azt, hogy diagramokat tartalmazó munkafüzet megnyitásakor teljes képernyőre kapcsoljon kilépéskor pedig álljon vissza az eredetire. Az alábbi megoldással próbálkozom, de amikor be akarom zárni a munkafüzetet, állandóan menteni akar… Tudna valaki segíteni?
Szóval! Hm!!!! Nagyon szégyellem magam, mert ez nagyon triviális volt! :-) Nem láttam a fától az erdőt! Annyira excel-esen akartam megoldani :-) Persze, hogy 17,8 :-)))) Köszi Sztai és SQLkerdes!!!
A következő porblémámra keresnék megoldást segítségetekkel. "A" oszlopban a napok vannak felsorolva dátum szerint. "B" oszlopban számok (ledolgozott óraszámok) és esetenként "Sz"(szabadság jelölés).
Azt szeretném elérni, hogy képlet keresse meg a szabadság kezdő dátumát (ez még megy is hol.van függvénnyel) és tudjam megkeresni a végző dátumát. Illetve ha az adott hónapban van még több kivett szabadság akkor azt is tudja megkeresni. Természetese negy új sorba megjelenítve.
Sub GS() ' ' GS Macro ' ' Keyboard Shortcut: Ctrl+Shift+G ' Do Until IsEmpty(ActiveCell) ActiveCell.GoalSeek Goal:=ActiveCell.Offset(0, 1), ChangingCell:=ActiveCell.Offset(0, -1) ActiveCell.Offset(1, 0).Select Loop End Sub
(tehát itt az actív cella a képletet tartalmazó SetCell, balra van a változó, jobbra pedig a célérték. Ha az oszlopok sorrendje más, úgy írd át az Offset argumentumát)
Ha jól látom, akkor ez egy egyismeretlenes elsőfokú egyenlet.
Nagyon formabontó megoldás lenne az, ha a C oszlopba szánt célérték adatot valamilyen képlettel kiszámolod (hisz te is utaltál rá, hogy képlettel meg tudnád határozni, csak azt nem eszi meg a célértékkereső), majd az A oszlop értékét számolnád ki szintén képlettel (a jelenleg a B oszlopban lévő képleted A-ra rendezésével)?
Vagy mindkét adatsor mellé odatesz egy oszlopot, ahova annyit rögzít, hogy "Alapadat" v. "másodlagos adat". Ebből aztán lehet pivottáblát csinálni v. rögtön PivotChart-ot.
Az ilyen tipusú problémák egyik lehetséges megoldása: =ADDRESS(SUMPRODUCT(ROW(A1:E5)*--(A1:E5="jakab pista")),SUMPRODUCT(COLUMN(A1:E5)*--(A1:E5="jakab pista")),4)
(itt az A1:E5 tartományt vizsgálja meg a függvény)
A te esetedben problémát jelenthet ha túl nagy a vizsgálandó tartomány.
Esetleg egy Find-ot alkalmazó UDF lehet még jó megoldás...
Megnéztem makró rögzítésével, és kicsit módosítottam:
Range("B1").GoalSeek Goal:=Range("C1"), ChangingCell:=Range("A1") Range("B2").GoalSeek Goal:=Range("C2"), ChangingCell:=Range("A2") ... Ez jó lenne, mert a Goal paraméternek hivatkozást adtam, és megette. Viszont jó lenne makró nélkül vhogy, mert nem én fogom kezelni. nem lehetne vmi függvénybe beépíteni? mint pl az FKERES(), vagy vmi hasonló megoldás? Ekkor a felhasználónak ne kellene a makró futtatásával bajlódnia.
és az a legnagyobb problémám, hogy a célértéknek nem lehet cellahivatkozást megadni, mert akkor a C1-be beírnám a kívánt értéket, és kiszámolná. De az Eszközök->Célértékkeresés menüben csak Célcella és a Módosuló cella lehet hivatkozás, a célérték nem. Na, most ez több száz sornál nagyon lassú, hogy minden soron külön-külön kelljen beállítani a célértéket. Remélem érthető voltam a problémámmal! :-)
Arról lenne szó, hogy van egy csomó sort tartalmazó táblám. Ilyesmi tartalommal:
x + x*12 + x*12*40% = 20 000 000
És az x-et keresem, úgy, hogy a 20 milla a végén minden esetben változó szám. Ezt hogyan tudom megcsinálni anélkül, hogy egyesével kéne minden soron végigmennem?
Sajnos nem jött össze, amit írtál. Félmegoldást közben sikerült alkotnom, ami annyi csupán, hogy FKERES függvénnyel az alapadatok mellé írattam a megfelelő dátumhoz tartozó értékeket, s innen már csak hozzá kellett adnom az új adatsort a diagramhoz.
Egy dátumhoz több adatot így hozzárendelni utólag egy több ezer dátumot tartalmazó adathoz viszont nagyon sok FKERES függvénnyel lehet csak, ami belassítja sajnos a gépet, ezért is keresek alternatív megoldást. :)
Tudtok olyan függvényről, ami megadja a pozicióját egy keresett értéknek, de egy nagyobb területen belül?
pl. mondanám, hogy adja meg hol találja meg a "Jakab Pista" nevet BÁRHOL a munkalapon? A MATCH és FIND csak egy szélességű soron illetve oszlopont tud ilyet csinálni. Én pl tudom, hogy "Jakab Pista" BÁRHOL előfordulhat, de csak egyszer...
Hogy tudnám ezt kikombinálni szerintetek?
Nem találtam eddig ilyen függvényt...azt szeretném, hogy a "koordinátáit" adja meg :-).
a1, elkészíted a grafikont (beállsz a táblába és +nyomod az F11-et)
a2, módosítod a diag tipusát vonalra
a3, kijelölöd a második adatsort és beállítod, hogy ne legyen vonal, csak a markerek
b. ha 2 táblában tárolod az adataid, akkor használhatod SQLkerdes javaslatát, de a dátumok ugyan olyanok legyenek mint az első táblában (ne hagyj ki napokat)
a.) Csináld meg az alap diagramodat b.) jelöld ki a második adatsort dátumostúl, értékestűl c.) Copy d.) Kattints rá az alapdiagramodra e.) Paste Special f.) Vedd fel az adatokat mint új adatsor (new series) g.) Alakítsd át ennek az adatsornak a diagram stílusát ízlés szerint. h.) Jelezz itt vissza, hogy sikerült-e.
Megjegyzés a g.)-hez: - az lehet egy megoldás, ha vonalas diagramot csinálsz, merkerokkal és a vonal színét No color-ra állítod, mer akkor eltűnik a vonal ami a markerokat összeköti és csak a markerok maradnak "lebegve" a diagramon.
Hasznos lehet amikor az ember már az ujjain számolja, hogy hány zárójelet nyitott meg és mennyit zárt le :-)
Személy szerint még nem próbáltam ki, de fogom mert az összetettebb beágyazott függvényeknél sorozatosan rontom el a zárójelezést (illetve ha elsőre elrontom akkor utána már nagyon nehezen találom meg, hogy hol a hiba).
Sziasztok! Segítségeteket kérném, hátha ti tudjátok megoldást:
1. =VÉL() függvénnyel generált véletlen számot tartalmazó cellát szereték másodpercenként frissíteni, de nem manuálisan, hanem automatikusan. Ez megoldható valahogy?
2. Van egy vonaldiagramom, az adatforrás dátumokhoz tartozó értékek, valahogy így:
Erre a diagramra szeretném pontokként megjeleníttettni a dátumokhoz tartozó következő adatokat, pl.
2010.01.02 11 2010.01.05 10 2010.01.07 5
Az a problémám, hogy ezek az értékek nem a számomra megfelelő dátumnál fognak szerepelni, hanem a 2010.01.01, 2010.01.02, 2010.01.03 dátumoknál. A másodlagos vízszintes tengely alkalmazása sem oldja meg a problémát. Hogyan tudnám megoldani, hogy az értékek, valamint az újonnan felvett értékek a megfelelő dátumnál jelenjenek meg?
1. dupla katt egy adatra a piv.táblán belül-->új munkalap, táblaként formázva.
2. álj a táblába és a tábla tervezés stílusoknál új táblastílus létrehozása párbeszéd abl-ban az előképben egy formázatlan táblát látsz. Állíts be, hogy ez legyen az alapértelmezett (bal alsó sarok jelölő négyzet)
Egy formázási kérdés. A pivot táblánál egy cellára való rákattintással megjelenik egy új lapon a cella részletes tartalma. Hol és hogy lehet beállítani azt, hogy ez az új lap ne legyen automatikusan formázva, a rákattintás után (tehán ne utólag legyen kiszedve az automatikus formázás). A táblajellemzőknél, ha kiveszem az automatikus formázást, sajnos akkor is beformázza az új lapot.
1. A hiperhivatkozás +változtatja a formátumot (színt, méretet, aláhúzást). Először hozd létre a hiperhivatkozást, és utána formázd + kisebb betűkre.
2. Ha jól értem az a cél, hogy egy nagy táblázatban (mondjuk 10 000 termék ill. sor, de csak mondjuk 20 féle termék csoport) minél gyorsabban elérd a kívánt termék csoportot.
a. az autoszűrő akkor használható hatékonyan, ha van egy külön termékcsoport meződ (oszlopod). A fenti példánál maradva, a 20 termékcsoport jelenik meg a szűrőben, amiből könnyű kiválasztani a keresettet.
Csoport megnevezés ár
TV szines 19' x
TV plazma 25' y
CD CD-R z
CD Sony CD-RW q
b. Ha a termékcsoportnak nincs külön mező fentartva, tehát a csoportot a megnevezésből lehet kideríteni, akkor az irányított szűrő segíthet.
megnevezés ár
TV szines 19' x
plazma TV 25' y
CD-R z
Sony CD-RW q
A táblázat fölé készíts egy kritérium tartományt (mezőnév, alatta a kritérium)
megnevezés
*TV*
A kritérium legyen egy legördülő lista (adatérvényesítés lista) így könnyű módosítani a kritériumot (*CD*)
Belekattintasz az adattábládba és elindítod az irányított szűrést (a paramétereket csak egyszer kell beállítanod, hiszen azok később nem változnak) és ok a párbeszéd ablakra.
Tanács: szűrés után, ill. új szűrés előtt távolítsd el a szűrőt (mindent mutat(szűrők törlése 2007-ben), mert különben sok adat esetén kicsit lassú lesz.
PS: Ha pontosabban tudnám mit is kell csinálnod igazán, lehet, hogy jobb megoldást is tudnék ajánlani.
Az adatok csoportosítása is jól jöhet a gyorsabb eléréshez, feltéve, hogy nincs túl sok különböző terméked.
Az egyes csoportokat egyenként is kibonthatod, bezárhatod, együttesen a piros körrel jelölt szinteket állíthatod be. A csoportok fejlécébe különféle képleteket vihetsz be, itt SZUM, ÁTLAG, MIN és DARAB függvényeket tettem a B:E tartományba.
Beszrtam egy oszlopot előre, itt lesznek a linkek. Alapból Calibri 11-es betűméret van. Átjavítottam 9-re, majd egy jó hosszú szakaszon cellabeállításban is megadtam, hogy 9-es legyen.
Ennek ellenére ahogy írom be a linkeket, mindig 11-es lesz. GRRR. Mi a büdös francért nem veszi figyelembe, hogy beállítottam azokra a cellákra a betűméretet?
Abban kérek segítséget, hogy egy táblázatban termékek vannak felsorolva. Az első x sorban A fajta termék, a következő y sorban B fajta termék, az ezt követő z sorban C fajta termék stb.... Egy sorban csak egy konkrét termék van annak minden jellemzőjével, ami az oszlopokban van.
Elég sok sor van.
Meg lehet azt csinálni, hogy beszúrnék egy (vagy több) sort a táblázat tetejére, és oda beírnám, hogy milyen fajta termékek vannak. És ez kattintható link lenne, ami a táblázat megfelelő részéhez ugrana, azaz a kívánt fajta termék első sorához. Ha makró nélküli megoldás van erre az lenne a jó.
Így áttekinthetőbb lenne a táblázat, nem kell végig bogarászni fentről lefelé, hogy hol is kezdődnek a "műszálas zoknik" :)
Csak az első problémához tudok hozzászólni, ahhoz sem közvetlenül...
Szerintem a magyar excel, angol win párosítás nem kellene, hogy hibát okozzon, én magyar win, angol excel párosításban dolgozom, sose volt problémám.
Viszont lehet, hogy ez a párosítás a területi beállításokon keresztül (annak mellékhatásaként) okozhat problémát. Próbálj a Control Panelen belül játszani ezzel hátha segít.
A file amit próbálsz betölteni sima excel vagy valami speckó (pld csv - comma separated value). Mert ha csv akkor tuti ez a gond.
Technikai segítséget kérnék két ékezetes hiba megoldásához. Az egyik esetben a tanár által kiküldött feladatokat nem tudjuk megnyitni, azóta kiderült, hogy azért, mert magyar excelt angol win alatt használjuk, ahol magyar win van, ott gond nélkül megy a megnyitás.
A másik az Openoffice.org calc-ja általi konvertálási gondoknál jelentkezik, elvileg minden excel fájlt szépen kezel, viszont, ha otthon a calcban nyitom meg és módosítok a táblán, hiába mentem el excelként, az excel nem mindig nyitja meg, vagy bizonyos cellába írt kepleteknél hibát jelez.
Nálunk is ez a helyzet, a kollégáknál írásvédettek ezek a mappák :-(
Az általad készített kódot átírtam kicsit egy Timer nélküli változatra:
Option Explicit
Public T As Date
Public Function AktiválásiIdő() As Date AktiválásiIdő = DateValue(Format(Date + 1, "yyyy.mm.dd")) + TimeValue("04:00:00") End Function
Private Sub btnExit_Click() T = Now Unload UserForm1 End Sub
Private Sub btnStart_Click() T = AktiválásiIdő If Now > T Then T = T + 1
Do While Now <= T With Me .TextBox2 = Format(Now, "hh:mm:ss") .TextBox3 = Format(T - Now, "hh:mm:ss") .Repaint End With DoEvents Application.Wait (Now() + TimeValue("00:00:01")) Loop
Unload UserForm1 ' Éjszakai futtatás indítása
End Sub
Private Sub btnStop_Click() T = Now End Sub
Private Sub UserForm_Activate() Me.TextBox1 = Format(AktiválásiIdő, "yyyy.mm.dd -> hh:mm:ss") End Sub
Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer) If CloseMode = 0 Then Cancel = True End Sub
Pedig úgy tűnik, hogy működik az, amit mondtál. Ha bemásolom a C:\Windows\System32 mappába, akkor nem kell regisztrálni, és mégis elérhető. Úgy tapasztalom, hogy ugyanez igaz a C:\Program Files\Microsoft Office\OFFICE11 mappára is.
Persze ott, ahol az említett mappák írásvédettek az egyszerű halandók számára, ott ez sem segít... mint például nálunk :((
Sajnos, nem tudom használni a Timert, mert a regiszrációhoz megfelelő jogosultság szükséges, és az nincs a kollégáknak.
A gépeiken próbáltam a megosztott mappában lévő .ocx-et felvenni a referenciák közé, de így sem tudtam futtatni a Timer-t tartalmazó makrót.
Érdekes, hogy először én sem regisztráltam és miután bemásoltam a .ocx-et a C:\WINDOWS\system32 könyvtárba, majd beállítottam referenciák között, utána egyből megjelent a Additional controls listában is.
Mielőtt alkalmazod a fv-t valahol készíts egy listát az angol hónap nevekkel és ezt a tartományt add meg a MATCH függvényben (az én példámban &L&1:&L&12-ként szerepel):
Először is, ellenőrizd, hogy tényleg dátumértékek vannak-e a cellákban. Ehhez egy üres oszlopba írd azt a képletet, hogy =A1+1
feltéve, hogy az A oszlopban vannak a dátumok.
Amennyiben az #ÉRTÉK hibaüzenetet kapod, akkor a dátumaid valójában sztringek (szöveges karaktersorozatok), és ezeket nem tudod egyszerűen formázással átkonvertálni.
Sziasztok! Dátumokat tartalmazó oszlopokat (amelyek ráadásul különböző formátumúak) szeretnék azonos formátumra konvertálni. Sajna a szokott módon a cellaformázással nem megy :-( Példa: A1 1st June 2007 1st July 2009 1st June 2010 1st June 2008
B1 31.12.2010 31.08.2010 31.12.2010 31.01.2010
Ezekből szeretnék azonos, mondjuk magyar formátumot elővarázsolni. Van javaslatotok?
Két hülye kérdés, biztos tök egyszerű a válasz rájuk:
1. Hogyan lehet levédeni a makróimat, azaz hogy ha valaki megnyomja az altF11-et, ne lásson semmit?
2. Az egyik táblában van 28 commandbutton. Ha bizonyos feltételek nem teljesülnek, szeretném, ha mind enabled=false lenne, ha viszont ismét teljesülnek, akkor mindegyik enabled=true. Kérdés, hogy lehet-e esetleg egy for-next ciklussal mind a 28-at változtatni, vagy muszáj egyesével mindegyiket bepötyögni? 28-nál még nem nagy ügy, de tervezünk egy új táblát, ahol kb 187 commandbutton lenne.
Köszönöm! Csak morbid kiváncsiságból kérdem, hogy azt meg lehet csinálni, hogy amikor a folder felugrik, akkor a létrehozott file legyen a kiválasztot (aktív?) file?
Nem tudom. A referenciák közé fel lehet venni az ocx-et akkor is, ha nincs regisztrálva, References ablakon lévő Browse gomb segítségével. Így tehát elég lenne csak a munkafüzet mellé a megosztott mappába betenni az ocx fájlt, és a referenciákban felvenni azzal az útvonallal.
Itt viszont van egy bökkenő. Ugyebár ahhoz, hogy a control-t rá tudjam tenni a userform-ra, előbb a Toolbox-ba fel kellene venni. Csakhogy ha nincs regisztrálva, nem jelenik meg az Additional controls listában, és ezért nem tudom kiválasztani. Erre még nem találtam megoldást, pedig már többször találkoztam a problémával, és ilyenkor mindig kutakodok egy kicsit...
Még azt szeretném megkérdezni, ha több különböző gépről is el szeretnénk indítani a napi feldolgozást (hálózaton van az excel fájl amibe beépíteném az időzítőt), akkor előzőleg minden gépen regisztrálni kellene a Timer controlt? Ez azért probléma, mert nincs mindenkinek erre megfelelő jogosultsága és jó lenne, ha nem csak én, hanem kollégák is el tudnák indítani a napi adatfeldolgozást...
:-) Jó kérdés. Gondoltam, valami azért jelezze, hogy elindult a visszaszámlálás, lehet indulni haza. Sőt, az időzítőt lehet majd máshol is kisebb késleltetésekre is használni, ahol nem árt, ha látjuk meddig várakozik még... Szóval, ilyenekért gondoltam :-)
Meg tudná mondani valaki, hogy a FileName változóban elmentett elérési utvonalú foldert hogy tudnám megnyitni Excel makróból?
A probléma az, hogy grafikonokat exportálok fix helyre (C:...Documents) és szeretném ha mentés után felpattanna a folder, hogy rögtön tudjak dolgozni az exportált grafikonnal.
Csak kérdezem, hogy minek a visszaszámlálás a képernyőre, ha azt írod, hogy hazainduláskor indítod el a makrót, hogy mire reggel beérsz addigra már lefussanak a feladatok?
A takarítónőre akarod a frászt hozni, hogy hívja ki a tűzszerészeket?
Találtam jobb megoldást :) Kell hozzá ez a Timer control. Letöltöd, kicsomagolod, regisztrálod az ocx-et, felveszed a referenciák közé (IE Timer néven találod meg), aztán a Toolbox-ra felrakod mint "Addititonal Control" (itt pedig "Timer Object" néven találod meg). Ezt aztán tudod használni időzítésre. Az intervallum ezredmásodpercekben értendő. Az Enabled property mondja meg, hogy megy, vagy nem megy.
Példaként készítettem egy Formot, amin van egy Timer, két Button meg egy Label. Itt van hozzá a kód:
Option Explicit
Public T As Date
Private Sub btnStartTimer_Click() T = Date + 5 / 24 If Now > T Then T = T + 1 IeTimer1.Interval = 1000 IeTimer1.Enabled = ValTrue End Sub
Private Sub btnStopTimer_Click() IeTimer1.Enabled = ValFalse Label1.Caption = "Felfüggesztve" End Sub
Private Sub IeTimer1_Timer() If Now > T Then Label1.Caption = "Lejárt az idő" Főmakró Else Label1.Caption = Format(T - Now, "hh:mm:ss") End If End Sub
Köszönöm. A cél az, hogy mielőtt elindulok haza a mhelyről, elindítok egy makrót, ami hajnalban (egy beállított időpontban) indítja a már jól letesztelt és bevált napi adatfeldolgozó makrókat. Azért kellene hajnalban indítani, mert egy új feldogozó rész miatt már elég sokáig fut és jó lenne, ha reggelre, már friss, ropogós adatok várnának ;-)
Egy időzítőt szeretnék készíteni, amelyet egy állandóan bekapcsolt gépen délután vagy este indítanék és minden következő nap 05:00-ig kellene, hogy visszafogjon több makró futását. Ami még szép lenne, valahogy kiíratni a hátralévő időt is. Tudna valaki segíteni? Előre is köszönöm.
Lehet: Ctrl+F (Keresés és csere) Egyebek gombra kattints. Formátumnál vegyél mintát cellából vagy állítsd be kézzel. "Listába mind" gombra kattints. Az alsó listában a jelöld ki az első találatot és Shift+End-el jelöld ki az egészet.
Az otthoni gépeden egy word dokumentumba tedd be az alábbi makrókat (persze a megfelelő értékekkel kiegészítve) és a munka befejeztével engedd rá arra a fájra, amiben dolgoztál:
If Documents.Count > 0 Then Set dp = ActiveDocument.BuiltInDocumentProperties dp("Author") = "Gipsz Jakab az új szerző" dp("KeyWords") = "ez az új keresőszó"
Szóval ha az intézőben belemész egy mappába, ahol pl doc és xls fájlok vannak és az egeret ráhúzod, akkor megjelenik a dokumentum bizonyos jellemzője:
Típus:
Szerző:
Cím:
Módosítva:
Méret:
bejegyzésekkel. Én most ezeket látom, lehet hogy más is megjelenik, ha olyan a beállítás..
Na szóval, ha megnyitsz egy word vagy excel dokumentumot a Fájl > Adatlap menüben látszik ez a csatolmány, vagyis az adatlapja a dokumentumnak. A progrma telepítésekor megadott gépnevet, címet írja be automatikusan (ha jól sejtem). És ezzel az egyéni saját bejegyzéssel lesz elmentve a dokumentum minden egyes gépen. És így látszódna, ha nem a céges gépen lett létrehozva (mentve) a fájl.
De rájöttem, hogy ebben a menüpontban ki is lehet törölni. Vagy mást megadni.
Továbbá a Word esetében a Eszközök > Beállítások > Mentés fül-ön belül az "Adatlap kitöltését felajánlja" kipipálásával megadható a mentéskor.
Excelnél az Általános fülön belül van ez a pipálandó.
Köszönöm a segítséget! Igazából akkor jöttem rá, miután írtad...
A "lapvédelem" fülön a minden felhasználó számára engedélyezett "pipáknál" a zárolt és a nem zárolt is ki volt jelölve... Banális... Előtte még bosszankodtam is, hogy amennyiben kiveszem a pipákat nem enged semmihez nyúlni... Ez van.
Problémám adódott az excelben. Valószínűleg rém egyszerű, mégsem jövök rá. Tudna esetleg valaki tanácsot adni?
Egy adott munkafüzetben egy lap van (szimpla táblázat). Egyes celláit szeretném védeni a módosításoktól (beírásoktól), úgy hogy másik, adott cellák még elérhetőek legyenek. Amennyiben zárolom a védendő cellákat, de nem jelölöm be a lapvédelmet, semmi nem történik. Ugyanúgy írhatok a védett cellába is mint a többibe. Amint bekapcsolom a lapvédelmet, egyik sem lesz kijelölhető és elérhető. MIT szúrtam el? Egyszerűnek látszó feladat, de valamiért nem megy. 2007 verzió.
Elhoznék melóhelyről néhány anyagot, hogy itthon dolgozzak rajta. De az itthonni word-nek más a "bélyegzője". Ha beviszem a céghez és ránéznek, akkor láthatják, hogy más gépen készült.
Hogyan lehetne ezt a bélyegzőt eltüntetni? Még az üres is jobb lenne, mintha az itthoni word lenyomata látszódna.
Gondolom, az excel-ben is hasonló lehet a megoldás ha van megoldás. Van megoldás?
Ezt a lehetőséget már el is felejtettem, pedig kb egy éve az Outlook miatt már kellett ezt használnom.
Bár nekem a 2007-es miatt 12-es van és ha ezt bekapcsolnám nem futna a program a régi Office-os gépeken, mert ott nem találja meg ezt a referenciát. De ez már legyen az eredeti programozó gondja. A tűzoltó munkát elvégeztem.
Igen ezt ismerem és használom is más programjaimban, de valamiért úgy emlékeztem, hogy elrejtett munkalapon nem lehet kiadni a copy parancsot. Most kipróbáltam és mégis lehet. Köszi.
Mindenesetre egy kicsit megnyugodtam, hogy valószínűleg nem én követtem el hibát, hanem ilyen az Excel. Másrészt ismét nagy tanulság volt, hogy nem elegendő nagy általánosságban ellenőrizni a végeredményeket, mert egy apró látszólag egyértelmű módosítás is "katasztrofális" eredményekkel szolgálhat.
Ha már írok, akkor leírok egy másik esetet is. Most kellett javítanom másvalakinek a programját (2003-ról 2007-re állás miatt), ami excelből nyit wordot, létrehoz egy makrós dokumentumot és ment. Viszont állandóan docx-ként mentett ami meg már nem tartalmazta a makrót. Hiába adtam meg a saveas-nál a wdFormatXMLDocumentMacroEnabled értéket. Aztán rájöttem, hogy mivel a programozó nem használta az option explicitet a program elején ezért nem reklamált az Excel, hogy nem ismeri ezt a változót és 0 értéket adott neki. Amikor helyette a hozzá tartozó 13-as értéket adtam meg, akkor már jó volt.
Tulajdonképpen a problémát megoldottam de olthatatlan tudásvágyam :o) miatt azért két kérdésem lenne ha esetleg fejből tudja valaki. Valamilyen parancsot, beállítást meg kellett volna adnom az elején, hogy felismerje az Excel VBA a Word változokat illetve állandókat is? Milyen értéket kellene megadnom, hogy 2003-as vagy régebbi formátumban (doc) mentsen. A wdFormatDocument97 és a wdFormatDocument-hez tartozó érték egyaránt 0 és ez viszont docx-ként mentett.
Ha már régebben történt és nem tudod visszavonni valószínűleg elvesztek.
Ha meg akarod akadályozni a véletlen törlést B oszlop celláit védelemmel kell ellátni és le kell védeni a munkalapot.
Ha csak magadnál akarod elkerülni ezeket a hibákat a későbbiekben akkor én mindig csak a látható cellákra szűkítem a kijelölést és utána végzem el a műveletet. 2007-ben a gyorelérési eszköztárra fel lehet venni egy "látható cellák" gombot.
Azért nem copy-zok, mert akkor selectálnom kellene a tartományokat.
Tudom egy párszor már leírtad, hogy lehet select nélkül is copyzni. Próbálgattam, de akkor mindent másolt. Formátumot is, de nekem csak a képlet kell.
A problémát megoldottam, mert minden oszlopba külön teszem be a képletet.
Csak kicsit fura, hogy ami működik egy oszloppal, az nem megy többel. Ráadásul ezt csak akkor vettem észre, amikor reklamáltak a hibás táblázat miatt. Meg nem fordult a fejemben, hogy ez az egyszerű parancs hibás eredményt ad.
Természetesen mielőtt kapnék a fejemre, hogy nem ellenőriztem, az eredeti programot ellenőriztük. A módosítás több oszlopra később került bele. Azt meg már nem ellenőriztük, hiszen csak egy tartomány bővítésről volt szó.
Tulajdonképpen az érdekelne, hogy ez egy újabb excel hiba, vagy én használom hibásan ezt a parancsot. Bár nem tudom miért lenne az.
Van 3 oszlopom: A, B és C, mindháromban adatok, a B oszlop rejtett.
Szerettem volna kitörölni az adatokat, így kijelöltem egybe a két látható oszlop adatait, majd delete. Aztán szembesültem vele, hogy a rejtett B oszlop adatait is kitörölte. De ezt nem szerettem volna.
Üdv Egy nagyobb program részeként ütköztem egy problémába. Nem tudom ez excel hiba, vagy én értelmezek valamit rosszul. Teljesen leegyszerűsítve a problémát képletet másolnék. Monjuk az „E1” és az „F1” cellákban is a „=D1” képlet van. Ha egy képletet másolok egy oszlopba az működik Range(Cells(1, 2), Cells(10, 2)).FormulaR1C1 = Range(Cells(1, 5), Cells(1, 5)).FormulaR1C1 Ha két képletet, vagyis tartományt másolnék két oszlopba akkor már minden sorban elcsúszik a képlet. Range(Cells(1, 2), Cells(10, 3)).FormulaR1C1 = Range(Cells(1, 5), Cells(1, 6)).FormulaR1C1 az első sor az elsőre, a második a harmadikra, a harmadik meg az ötödikre hivatkozik. Ennek így kell lennie? Hiszen ha copy paranccsal teszem át ugyanezt a két cellát a két oszlopba, akkor meg jó.
De ez nem törli a másolás után a H3-H200 oszlopban lévő darabszámokat. Pedig ez (is) lenne a feladata. Leltározok. Beírom a "H" oszlopba a darabszámokat, majd végrehajtás. Ekkor átmásolja a "C" oszlopba az értékeket. De ezután már a tényleges készlet a "C" oszlopban lévő és a "H" oszlopot nulláznia kellene. Várni a következő leltárra.
A következőt szeretném kiszámoltatni az excellel. van két egymás melletti cellám az egyikben a munkakezdésem van a másikban a végzés, a harmadik adná a ledolgozott időt. például: 03:10 óratól 14:00 óráig az eredmény a 10:50 óra lenne de nem tudom rávenni hogy így kiírja. tudtok segíteni?!
Egyébként másodszorra átolvasva a válaszodat, sztem másról beszélünk! Én pont az eladásokat nem akarom rögzíteni! Ez egy kitalált feladat,kitalált napi forgalommal, ahol nem fontos tudnom hogy melyik árucikkből mennyit adok el, hanem kategóriára bontva kell az árakat rögzíteni. Én megadom hogy milyen árakkal dolgozok egy kategórián belül, a gép pedig kitölti nekem bizonyos feltételek szerint a napot. Ezek a feltételek ha lehetnének: egész aznapi eladás összege, és ugyanez kategórián belül!
Nem konkrét árucikk,hanem 6 aru kategória végülis - ezt rosszul írtam-, amiken belül van több fajta ,8-10 ár. És abból variáljon nekem "véletlenszerűen".
Szerintem rosszul fogod meg ezt a dolgot. Egy munkalap kell, olyan oszlopokkal, mint dátum, árucikk, eladási ár, satöbbi, és abban rögzíteni minden eladást, aztán pivot táblával olyan kimutatást varázsolsz belőle, amilyet akarsz.
De persze lehet, hogy félreértem. Az például nem világos, hogy hogy lehet árucikkekhez véletlenszerűen eladási árat rendelni...?
Sziasztok Megköszönném ha tudna valaki segíteni,próbálkoztam neten kereséssel,meg itt is böngésztem a fórumot,de mindig valami hibába ütköztem,ezért inkább leírom mit szeretnék megcsinálni Excelben,remélem segít valaki :-)
Lenne egy 31 - mint napok száma- munkalapból álló napi forgalmi elszámolás. Egy munkalap egy nap, ebben lenne 6 külön féle árucikk, A oszloptól G-ig, ez alatt a sorokban szeretném én a géppel kitöltetni a napi forgalmat, és az eladási árakat árucikkenként egy külön listából szedné ki-külön munkalapból-, véletlenszerűen. Ha pedig ezt úgy is meg lehetne "mondani neki",hogy mennyi legyen az árucikkenkénti végösszeg, ill. a napi végösszeg összesen, hab lenne a tortán! Remélem sikerült érthetően elmagyaráznom. Köszönöm előre is a segítséget!!
A Today helyett lehet használni a Date belső változót, így nincs szükség sem a helyfoglalásra, sem a formátum megadására. A Date formátuma "yyyy.mm.dd." , ponttal a végén, ami a mentési formátumon is módosít, a kiterjesztés hozzáfűzését nem ponttal kell kezdeni.
Sub Masol() Dim Path As String, FileName As String Path = "E:Eadat" 'itt add meg a saját elérési utat
Range("H3:H200").Copy Range("C3:C200") 'itt megváltoztathatod a tartományt FileName = Path & "Leltár_" & Date & "xls" ActiveWorkbook.SaveAs FileName:=FileName, FileFormat _ :=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False End Sub
Természetesen kipróbáltam. Nincs vele semmi gond. Viszont azt vettem észre, hogy az általam megadott Path F:\ ellenére elmenti a C:\Dokumentumok mappába.
Sub Masol() Dim Path As String, FileName As String Dim Today As Date Today = Format(Now, "yyyy.mm.dd") Path = "D:\Leltár" 'itt add meg a saját elérési utat FileName = "Leltár_" & Today & ".xls"
Range("H3:H270").Copy Range("C3:C270") 'itt megváltoztathatod a tartományt ChDir Path ActiveWorkbook.SaveAs FileName:=FileName, FileFormat _ :=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False End Sub
Azt gondolom a gombot neked kell odaraknod kézzel.
A lenti kódban az xlExcel8 használata arra utal, hogy ezt a kódot Excel 2007-re vagy jobbra írták. Ha neked pld 2003-as exceled van, akkor helyette az xlworkbooknormal értéket kell használni.
Lehetnek még más csapdák is, a legjobb az lenne, ha beposztolnád, hogy melyik sorra panaszkodott a kód.
Sub Masol() Dim Path As String, FileName As String Dim Today As Date Today = Format(Now, "yyyy.mm.dd") Path = "D:Leltár" 'itt add meg a saját elérési utat FileName = "Leltár_" & Today & ".xls"
Range("H3:H292").Copy Range("C3:C270") 'itt megváltoztathatod a tartományt ChDir Path ActiveWorkbook.SaveAs FileName:=FileName, FileFormat _ :=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False End Sub
írd át a makróban lévő elérési utat és tartományt abban a fileban korábban amit visszaküldtem. (A szükséges sorokhoz odaírtam, hogy melyiket hol kell.)
Nem tudom. Szerintem legfeljebb valamiféle formázási gond lehetne (hiszen most már minden olyan adat megjelenik, ami csak számokból áll), de akárhogy is kerestem, nem találtam ilyen beállítást.
HA(), ÉS(), VAGY(), stb. függvényekbe nem lehet ilyen hármas relációkat írni. Illetve lehet, de nem azt adja ki, amire számítasz. A többszörös relációk balról jobbra haladva, egyesével értékelődnek ki. Az alábbi feltétel esetében:
időszak_eleje<belépés<jelentés_napja
ez úgy értékelődik ki, hogy: 1. lépés időszak_eleje<belépés -> igaz vagy hamis? legyen pl. igaz 2. lépés IGAZ<jelentés_napja -> igaz vagy hamis? Ennek értéke mindig hamis lesz. Akkor is hamis lesz, ha az előző lépésben HAMIS jön ki.
Igazad van. A H3-H270 oszlopot kéne egy vezérlőgomb segítségével- amilyen felül a "Készletmódosítás" feliratú- a C3-C270 oszlopba másolni. A vezérlőgomb helye pedig a "Készletmódosítás" mellett jobbra "Leltár végrehajtás" felirattal lenne. Ha így érthető? aulac
Válaszoltam. Sok ellentmondást látok a leveled meg a csatolt file között. Szerintem nyugodtan írhatsz ide a fórumba is (egyszerűbb...)
A kérés egyszerű másolás, mentés volt aktuális dátummal a fájlnévben.
Sub Masol() Dim Path As String, FileName As String Dim Today As Date Today = Format(Now, "yyyy.mm.dd") Path = "C:" 'itt add meg a saját elérési utat FileName = "Leltár_" & Today & ".xls"
Range("H3:H292").Copy Range("D3:D292") 'itt megváltoztathatod a tartományt ChDir Path ActiveWorkbook.SaveAs FileName:=FileName, FileFormat _ :=xlExcel8, Password:="", WriteResPassword:="", ReadOnlyRecommended:= _ False, CreateBackup:=False End Sub
Sziasztok! Lenne egy olyan problémám, hogy kedves anyósom elmentette az excel fájljai egy pendrive-ra, de sikerült neki .SHS formátumban összehozni. Nem tudok mit kezdeni vele. Próbáltam parancsikont létrehozni és behúzni egy üres munkalapra, de semmi. Vkinek vmi megoldás?
Hasonló szituációban történt ilyen velem is. Nálam akkor, az volt a megoldás, hogy szövegkonvertáló függvény használtam a körlevél alapjául szolgáló excel táblázatban. Ezt kivettem, és utána megjelent a körlevél mezőben a szükséges adat. Mintha a körlevél az excel egyes függvényeit nem kedvelné...
Bocsi, megint csak beestem ide egy kérdéssel, és nem keresgéltem túl sokáig, hogy volt-e már ilyesmiről szó ebben a topicban! A probléma a következő: adott egy Excel táblázat, amelyben az eszközök adatai vannak. Az egyik oszlop tartalmazza a leltári számokat. Ezek egy része csak számjegyekből áll, mások betűvel kezdődnek, és valamivel több számjeggyel folytatódnak, mint a csak számokból állók. Végül van néhány olyan is, amiben "/" jel is van (pl. 63172/0002). Ezen táblázatban szereplő adatok alapján szeretnénk egy Word dokumentumból az egyes sorokból adatlapokat nyomtatni (körlevél eszköztár, mezőkódok, satöbbi). Be is van állítva szépen, hogy hová tegye a doksiban a leltári számok oszlopában lévő adatokat. A vicces az, hogy ezt némelyik sornál meg is csinálja rendesen, másoknál meg nem. Amikor ezt először észrevettem, akkor még a csak számot tartalmazó adatok közül sem jelenítette meg mindet. Megpróbáltam beállítani az oszlopban a szám formátumot egységesen, de ez sem segített. Később a Szövegből oszlopok funkcióval átraktam az oszlop összes adatát egy másik oszlopba, majd az eredetit kitöröltem, és az újnak adtam az eredeti oszlop nevét. Így most már a jelek szerint minden csak számból álló adat megjelenik, de a többiek nem (pontosabban egy 0 jelenik meg helyettük). Vajon mi lehet ennek az oka, és hogyan lehetne rávenni ezeket a programokat, hogy végül az összes adatot megjelenítse a Word?
Nem baj, ez csak arra van hatással, hogy hogyan határozod meg, hogy valaki tárgyhavi kilépő-e.
Ha nem lett volna adat, akkor IF(B2="",...) működött volna, így IF(B2>C2,...) műxik. Feltéve, hogy jól emlékszem arra, hogy C2-ben van a tárgyhó vége ÉS korábbi hónapokban kilépettek már nincsenek a táblában.
Köszönöm! Még csak most tudok belekezdeni... Majd jelzem az eredményt! Amúgy ami nagyon bonyolítja a megoldást az az, hogy havonta kell jelentést írnom... Persze, hogy nem hónap végi a határidő, hanem az utolsó péntek! Ekkor az elköltött havi, illetve göngyölített bérről kell a kimutatást összeállítani. Így nekem nem D2 cellám van, hanem jelentés! munkalapom januártól decemberig, ahol A2=alapadatok!A2 (itt vannak a nevek) és tölti a sorokat ahogy jönnek-mennek az emberek (belépés napja szerint van ugye növekvőben, mert mindig csak beírom az újat a végére). No, és emiatt van egy apró csavar... A példa okáért jön delikvens 01.12-én és dolgozik 04.30-ig. Január hónapban ő a belépő. Hónap vége [vagy jelentés napja, amit a segédtáblák lapon megoldottam, hogy van egy cellám, ahol legördülőkből tudom a dátumot állítani Dátum(x;y;z;)] Azt számolja, hogy mennyi a törthavi bér, de ha pl. van valaki, aki előző évről csúszott át és kilép, akkor már az eddigi próbák hibájából fakadóan őt vagy nem számolja, vagy a belépésre írt képlet negatív eredményt ad... Aztán ugye dolgozik teljes februárt és márciust. Ezt figyeli a függvény, mert ha a ledolgozott napok száma egyenlő a naptári napokkal (itt kivettem a NETWORKDAYS-t, mert inkább "fizetek" szombatra és vasárnapra is bért (:-)), minthogy bonyolítsam vele a dolgom) akkor az alapbérből osztással szorzással kiszámolja a függvény a havi bért ami (hurrá!) egyenlő az alapbérükkel. Off: kolléganőm is fogja használni a táblát, így olyan produktummal kell előrukkolnom, ahol neki csak a lekérdezés dátumát kell beállítani (ezért van az év, hónap, nap 3 különböző cella legördülőjébe beállítva és ezért a dátum függvény állítja össze a 3 értékből...) No, még egyszer köszönöm a tippet, jelzem az eredményt!
A gondom vele (nyilván logikai hiba): Belépő számítási módja: hó vége mínusz belépés napja. Kilépőé ha ugyanez, akkor az pont azt a részét számolja a hónapnak, amire már nem kap bért. Ezt levonni meg nem tudom a havi alapbérből, mert akkor a belépésnél is levonja. Az bonyolítja a képletelést, hogy folyamatosan vannak a belépők és a lejáró szerződések is havi rendszerességűek, így egy cellán belül mind a kettőnek jelen kell lenni. Próbáltam, a HA(ÉS())-t és a HA(VAGY())-ot is. Mondjuk ezeknél kicsit megbonyolítottam a számolást NETWORKDAYS() függvénnyel és nem adott jó eredményt, ezzel majd még molyolok... Az egymásba ágyazással nincs gondom, viszont ahogy kezdtem is, nyilván a logikámban van a hiba...
Kedves Fórumozók! Munkaügyi nyilvántartás készítésekor picit ott megakadtam, hogy a munkabérek számításakor nem tudom megoldani azt, hogy a tábla kezelje a hóközi kilépéseket is. [A hóközi belépők törthavi bérét "egyszerű" HA() függvénnyel tudom számoltatni.] elképzelhető erre olyan megoldás, amihez nem szükségeltetik VB ismeret? Értem ez alatt, hogy képleteléssel megoldható? Előre is köszönöm a javaslatokat!
Tegyük fel, hogy a.xls és b.xls struktúrája az általad megadottakon kívül a következő:
- munkalap neve munkét táblázatban: Munka1 - releváns oszlopok: A - F - az első sorban oszlopfejlécek vannak
Két lehetséges megközelítést látok itt, melyek logikailag ellentétesek egymással.
1) Végignézni a [b.xls]Munka1 első oszlopában lévő összes azonosítót, hogy azok előfordulnak-e az a.xls első oszlopában, és ha igen, akkor a hozzájuk tartozó adatot a 6. oszlopból átrántani a b.xls-be. Ez a következő ([b.xls]Munka1!F2 cellába kerülő) képlettel oldható meg: =FKERES(A2;'[a.xls]Munka1'!$A:$F;6;HAMIS)
Ezzel a megközelítéssel az a.xls-ben maradhatnak olyan sorok, ahol ugyan van érték a 6. oszlopban, de mégsem kerülnek át a b.xls-be, mert a b.xls első oszlopában nincs meg az az azonosító.
2) A másik, amit te leírtál, tehát végignézni az [a.xls]Munka1 6.oszlopát, és ha ott érték van, akkor a hozzá kapcsolódó azonosítót megkeresni a b.xls első oszlopában. Ez a megközelítés sajnálatos módon makrót igényel, képlettel nem oldható meg. A makró sem gond, viszont akkor rendelkezni kellene arról, hogy mi legyen azokkal a sorokkal, ahol a 6. oszlopban van érték, de az azonosító a b.xls-ben nem található meg.
A másik fórumon már tegnap megadtam a választ. Nem jött össze? A b.xls Munka1 lapján az F2 képlete legyen:
=FKERES(A2;'[a.xls]Munka1'!$A:$F;6;HAMIS)
Ha kiderül, hogy a b.xls Munka1 lapján az azonosítók számként szerepelnek, akkor =FKERES("" & A2;'[a.xls]Munka1'!$A:$F;6;HAMIS) -ra módosul a képlet. Az ""&A2 a számot szöveggé alakítja, így már megtalálja az Fkeres a srtingek között.
Kezd gyanús lenni, hogy valami nagyon félreértek. Tehát adott 2 db xls file: a.xls és b.xls
Mindkettő struktúrája azonos. 1. oszlop azonosító szting 2. oszlop márkanév 3. oszlop adat 4. oszlop adat 5. oszlop adat 6. oszlop keresendő sztring azonban csak a.xls-ben van adattartalma.
A feladat, hogy az a.xls 6. oszlopának tartalmát másoljam b.xls 6. oszlopába de nem ugyanazokba a sorszámú sorokba, ahol a.xls-ben is voltak, hanem az 1. oszlop által azonosított sorba.
Vagyis fut a kereső az a.xls 6. oszlopában. A 9. sorban talál egy sztringet, akkor és csakis akkor meg kell néznie az a.xls első oszlopában a 9. sorhoz tartozó azonosító sztringet, majd átmásolni a 6. oszlop adattartalmát a b.xls 6. oszlopának azon sorában ahol a ugyanaz az első oszlopbeli sztring azonosító található meg.
Ha ezt tudja az FKERES akkor a paramétereket adom meg rosszul. Mi a helyes megadás? Köszönöm szépen a segítséget!!
Az FKERES 2. paramétere egy cellatartomány. Ennek a tartománynak az első oszlopában keresi meg a függvény a keresendő értéket (ami mellesleg az 1. paraméter). A keresendő érték lehet szám vagy sztring egyaránt. Nyilván egy számot nem fog megtalálni egy sztringekből álló halmazban, mint ahogy egy sztringet sem fog megtalálni egy számokból álló halmazban. De ha egy keresett szrting megtalálható a kijelölt oszlopban, akkor azt meg kellene találnia.
Azt szeretném kérdezni, hogy szerintetek ha adott 2 db excel file akkor meg lehet valósítani azt, hogy az egyik oszlopban ha értéket találok azt másoljam át a másik file egyik oszlopába de csak akkor ha a az adott sort azonosító másik oszlopban taláható ID ( sajnos nem numerikus, hanem egy sztring ) megegyezik a két esetben.
Tehát a 6. oszlopban fut a keresés és ha adatot talál azt kell másolja a másik file vagy munkalap 6. oszlopába, DE nem ugyanabba a sorba. Hanem ahonnét másolok ott az első oszlopban kódok találhatók és ez a sztirngsor azonosítja majd a másolandó sztringet, mert a másik munkalapon én majd abba a sorba szeretném másolni amelyik sorban megtalálható ez a 'kulcs' sztring sor.
KERES fügvényekkel ez annyira nem sikerül. A kérdésem, hogy ez már csak makró vagy Access vagy van megoldás egyszerűbben is?
Mit értesz azon, hogy kiszedi? Mindennek csak egy előfordulását akarsz látni?
Data/Filter/Advanced és itt megadod, hogy hol van az a lista amit át akarsz nézetni az excellel, hova rakja az eredményül kapott listát és feltétlenül ikszeld be, hogy Unique values only/egyedi értékek.
Ez egy új listába előállítja az ismétlődő értékek nélküli (egyedi értékeket tartalmazó) listát.
Nem egészen így, de a szövegformátumú szám 1-el szorzást ismertem erre az esetre, de ennél a szitunál eszembe sem jutott :( A "szövegből oszlopok"-at nem értem, ami nekem van az egy másik adatbázisból sql segítségével jön, nem excelből
Talán úgy jársz a legjobban, ha 1) kijelölöd az oszlopot 2) az Adatok menüből kiválasztod a Szövegből oszlopok parancsot 3) Tagolt, vesszővel, befejezés
Nos, akkor teljes egészében félreértettem a problémádat :-)
Egyébként egy apró trükk: ha van egy számod, amit az excel nem ismer fel számnak, hanem szövegnek, akkor bármely matematikai művelet számmá alakítja a szövegnek tűnő számot.
Tehát pld. LEFT(a1,3) egy számot ad, de az excel szövegként kezeli. A LEFT(a1,3)+0 már számot ad és az excel számként is kezeli.
Vagy a te példádban ha nem tudod lefuttatni az SQL query-t ismét, akkor a Text to Column fukció átalakítja.
Helló, Tisztelettel köszönöm a fáradozásodat, az imént rájöttem. a megoldásra, ami nem az excelből ered, hanem a pivottáblába sql-en keresztül érkező adatokból. t-sql-es CONVERT függvényben CHAR(10) konvertálást használtam INT numerikus helyett - és ezt az excel pivottáblája szövegnek is látja (az exceles formátumtól függetlenül) Viszont a pivot táblás csoportosításnak numerikus adatra van szüksége és ehhez kellet az INT konvertálás sql-ben
A mellékelt képen lévő táblázat utolsó oszlopába próbáltam ráhúzni az általad megadott képletet. Az első sor utolsó cellájába ezt írtam, majd lehúztam a 3 sort.
=HA(ÉS(B10=B11;G10>E11);(MIN(G10:G11)-E11)*24;0)
Ezt kaptam :-(
A feladatot pontosítva: - nem lesz olyan, hogy 2-nél több jármű fut együtt - éjfélkor lezárjuk a napot, és ha folytatódik, akkor újra kezdjük (új beírással)
A sorok végén kiad valami időt, de nem találom a logikát, hogy az mi lenne. Azt gondolom, hogy nem is a sorok végén kellene vizsgálni, hanem az egész tömbben nézni az esetleges egyezést.
Lehet, hogy a kérdésnél nem fogalmaztam rendesen. Ha a dátum és az időpontban is van egyezés, akkor kellene a közösen eltöltött időt számolni. Tehát adott napon az egyik jármű 6-10-kor megy, a másik 8-11, akkor a közösen eltöltött idő 2 óra.
Persze, nem azt mondtam, hogy nem fog működni, hanem azt, hogy más valószínűséggel fogja kiadni pl. a 9-es számot, mint a feladatban feltételezett algoritmus.
Legalábbis elvileg. Gyakorlatilag azonban igazad van. :)
Csináltam egy tesztet. 4 különböző módon előállítottam 60.000-60.000 véletlen karaktert, és gyakorlatilag ugyanolyan darabszámokat kaptam minden módszerrel. Még a Te képleteddel is, pedig ott a számjegy típusú végeredménynek lényegesen nagyobb valószínűséggel kellett volna kijönnie.
Ebből az következik, hogy a képleted tökéletesen alkalmas a feladat Exceles megoldására.
Nem jó úgy. Itt a képlet: =HA(RANDBETWEEN(1;3)=1;KARAKTER(RANDBETWEEN(97;122)); HA(RANDBETWEEN(1;3)=2;KARAKTER(RANDBETWEEN(65;90)); KARAKTER(RANDBETWEEN(48;57))))
Gondolj bele: Excel Úr elkezdi a kiértékelést, eljut az első RANDBETWEEN(1;3) -hoz. Generál egy véletlenszámot, ami történetesen 2. Jól van, mondja, a kettő az nem 1, tehát megyünk tovább. Eljut a második RANDBETWEEN(1;3) -hoz. Itt újra generál egy véletlenszámot. Legyen ez a szám mondjuk 1. A második feltétel sem teljesül, tehát a végeredmény a harmadik halmazból kerül kihúzásra, azaz egy számjegy lesz. Pedig a RANDBETWEEN(1;3) egyszer sem adott hármas értéket!
És még vannak más problematikus kombinációk is. A lényeg, hogy ezzel a módszerrel az egyes lehetséges végeredmények előfordulási valószínűsége jelentősen eltér attól, amit a feladat leírása tartalmaz.
Igen. A km-es Közép függvényed sehogy sem fér el rajta.
Nem jó a #11760-as hozzászólásban megadott képlet az általad javasolt módosítással? Mármint azzal, hogy az A1-ek helyére randbetween(1;3) kerüljön. Úgy szépen hozza a kis-, nagybetűket, és számokat újabb enterezésre, csak éppen az egésznek nem látom az értelmét. Miért kell 1 cellában lennie mindennek, hiszen az 1, 2, és 3 véletlen generálásának pillatnatnyi értékét így nem lehet ellenőrizni, így azt sem, hogy a végeredményként kapott érték megfelel-e a kritériumoknak.
Gondoltam valami efféle trükközésre én is, de 2 problémám van vele 1) A használt karakterkód-tartomány nem összefüggő: 48-57, 65-90 és 97-122, ez viszont nem tudod beadni a SOR függvénynek. 2) Ezzel a módszerrel minden szám egyenlő eséllyel jön ki, a feladat szerint pedig nem úgy kell.
Elvileg az A1 helyére be lehetne helyettesíteni a RANDBETWEEN(1;3) képletet, de azzal az a gond, hogy az minden HA vizsgálatnál új véletlenszámot generál, és így félreviszi az eredményt.
Itt tehát arról van szó, hogy három halmaz közül választok 1/3 valószínűséggel, majd az adott halmazon belül 1/26, 1/26 illetve 1/10 eséllyel egy elemet.
Másképp közelíteném meg a dolgot. (Mivel csak a végeredményt látjuk, talán mindegy, hogy jön ki, csak annyi a feltétel, hogy ugyanaz jöjjön ki. Ugye?) Ha a 10 elemű halmaz mindegyik eleméből veszek 26-26 db-ot, valamint a 26 eleműek minden eleméből veszek 10-10 db-ot, és ezeket összeöntöm egy halmazba, akkor ebből a "szuperhalmazból" tetszőleges elemet ugyanolyan valószínűséggel húzok ki, mint az eredeti procedúra szerint. Mivel minden darabszáma páros, le is oszthatom kettővel az egészet (tehát ekkor betűkből 5-5, számokból 13-13 db van).
Ezt így viszonylag egyszerű képletesíteni, de nagyon csúnya lesz szegény:
A KÖZÉP függvény első paramétere 390 karakterből áll, de ez itt nem férne ki, ezért [...] jelekkel rövidítettem. Ezeken a pontokon a képlet értelemszerűen folytatódik.
Az lenne a feladat, hogy egészet egy cellában végezze el. Vagyis ne hivatkozzon pl. az A1-re. Az IF-ek egymásba ágyazásával és a szám->karakter átalakítással nincs gondom. Arra gondolnék, hogy esetleg az alábbihoz hasonló alakban megadható lenne-e?
(a véletlen karakter generálást szöveggel helyettesítem, hogy áttekinthetőbb legyen)
IF (R=1;vmi kisbetű;HA(R=2;vmi nagybetű;vmi szám)) WHERE R=RANDBETWEEN(1;3)
Úgy is meg tudod csinálni, ha nincs A1? (Vagyis cellán belül generálod a véletlen számot, és ott helyben ki is értékeled.) Szerintem elég húzós dolog képlettel...
Az excel a dátumokat és az időt is számként kezeli, de dátumként vagy időként mutatja meg.
A dátumot jelentő szám nem más, mint az, hogy az adott dátum, időpont hány nap "távolságra" van egy fix, hipotetikus dátumtól (asszem 1900 jan 1.-től).
Szóval 1900 január 2-t az Excel igazából 1-nek kezeli, de 1900/01/02-ként jelzi ki.
Innen egyszerű, az idő nem más, mint egy nap elosztva (ha jól emlékszem) tizedmásodpercekig.
Mivel te órákat szerettél volna látni, a maradékot pedig tizedesnek és órából 24 van egy napban, nem kellett mást tenni, mint az időt reprezentáló (napban kifejezett) számot 24-el megszorozni.
KÖSZÖNÖM, MŰKÖDIK! :-) Azonban kérlek, elmondanád röviden, hogy miért is kellett a végén az összeget megszorozni 24-gyel? (Csak hogy értsem is mit csináltam, nem úgy mint valami robot).
Órákat adok össze, hogy a kollégák havi ledolgozott óráit könnyebb legyen kiszámolni és leadni hónap végén a bérszámfejtőknek, u.is nálunk napi heti 5*8 óra a munkaidő, hanem hétfőtől csütörtökig 8 óra 35 perces és pénteken 5 óra 40 perces a munkaidő (vagyis pénteken hamarabb hazamehetünk, de ehhez előtte többet kell dolgozni). Egyszerű, de hasznos táblázat.
Igazából ez alapból így van... Nézd meg a word help-jét, hogy minden lépést végigcsinálsz-e a körlevél folyamatból. Különös tekintettel a mentés-részre.
A kijelezni kívánt időtartam gondolom valami számolás eredménye. Ennek a számolásnak az eredményét szorozd meg 24-el és (ha kell) állítsd át számformátumos kijelzésre (Ctrl+1, számok/number).
Abban kérném a segítségeteket, hogy hogyan lehetne az excel-lel kijeleztetni úgy az összes órák számát, hogy pld. NE így írja ki az összeadások után: 131:30:00, hanem így: 131,5 (vagyis a perceket is órában, tizedestört értékben jelezze ki)! Ezt hogyan lehetséges megoldani? Előre is köszönöm a segítséget!
Csak felig excel kerdes: ha csinalok wordben egy korlevelet, amihez excel-bol szedem az adatokat, akkor hogyan tudom megcsinalni, hogy a word megjegyezze az adatforrast, s ne kelljen minden egyes megnyitaskor betallozni neki az excel fajlt?
A word es az excel fajl mindig egy konyvtarban van (sot meg a nevuk is mindig ugyanaz), viszon hulye ceges "szabalyok" miatt nem a dokumentumok konyvtarban, hanem egy gyokerszerkezetben, ami neha 4-5 szintes. SZoval eleg sokat kell menetelnem tallozas kozben, es ezt szeretnem meguszni.
Ja, a félreértések elkerülése végett: ez a BASIC nem az a BASIC, mint amit az Excel használ. Szóval csak abban tévedtem hogy azt hittem, java, az viszont biztos, hogy az Excel makrók nem futnak OO alatt. (Egyelőre.)
Végül is tévedtem, az OpenOffice is BASIC nyelvet használ makrókra. Sajnos nem értek hozzá, ezért csak egy nagyon kezdetleges makrót tudtam összeütni. Próbáld ki. A "Sheet1" helyére írd be a munkalapod nevét (idézőjelek közé).
Sub nullazas
Dim myDoc As Object Dim mySheet As Object Dim myRange(30) As String Dim i As integer Dim myCell As Object
Ez alapvető információ, ezzel kellett volna kezdened. Openoffice-ban semmilyen Excel makró nem fog működni, mivel ez Visula Basic, az meg (ha jól tudom) java. A kompatibilitás csak munkalap szinten van meg, ott sem 100%-os. De megpróbálhatod, amit a 11746-ben javasoltam, az lehet, hogy OO-ban is működik. Bár a menük hierarchiája biztosan más, szóval lehet, hogy keresni kell a megfelelő parancsokat. A súgó segíthet.
ez a macro lefut szépen de csak akkor ha a kellő helyen állok a curzorral ez baromság! én úgy szeretném hogy működjön, hogy ha bárhol áll a cursor akkor is állítsa 0 értékre a cellák tartalmát
ha a macro gombhoz van rendelve akkor nem fut le, az miért lehet?
továbbá szerintem tele van mindenféle felesleges dologgal a kód, bár nem értek a dologhoz...
meg néznéd?
REM ***** BASIC *****
Sub Main
End Sub
sub zero rem ---------------------------------------------------------------------- rem define variables dim document as object dim dispatcher as object rem ---------------------------------------------------------------------- rem get access to the document document = ThisComponent.CurrentController.Frame dispatcher = createUnoService("com.sun.star.frame.DispatchHelper")
rem ---------------------------------------------------------------------- dim args1(0) as new com.sun.star.beans.PropertyValue args1(0).Name = "StringName" args1(0).Value = "0"
rem ---------------------------------------------------------------------- dim args2(1) as new com.sun.star.beans.PropertyValue args2(0).Name = "By" args2(0).Value = 1 args2(1).Name = "Sel" args2(1).Value = false
rem ---------------------------------------------------------------------- dim args3(0) as new com.sun.star.beans.PropertyValue args3(0).Name = "StringName" args3(0).Value = "0"
rem ---------------------------------------------------------------------- dim args4(1) as new com.sun.star.beans.PropertyValue args4(0).Name = "By" args4(0).Value = 1 args4(1).Name = "Sel" args4(1).Value = false
rem ---------------------------------------------------------------------- dim args5(0) as new com.sun.star.beans.PropertyValue args5(0).Name = "StringName" args5(0).Value = "0"
rem ---------------------------------------------------------------------- dim args6(1) as new com.sun.star.beans.PropertyValue args6(0).Name = "By" args6(0).Value = 1 args6(1).Name = "Sel" args6(1).Value = false
Amennyiben fix cellákkal dolgozol, és kód nélküli megoldást szeretnél, így pl lehetséges:
1) Jelöld ki az összes kérdéses cellát. Nem összefüggő tartományok kijelöléséhez használd a Ctrl gombot. 2) Beszúrás menü -> Név -> Név megadása. Itt adj meg a kijelölt tartománynak egy tetszőleges nevet. Pl "pezsgőtabletta"
Ezután, ha törölni akarod a cellák tartalmát, annyit kell tenned, hogy az A oszlop fölötti lenyíló menüből a "pezsgőtabletta" nevet kiválasztod, és megnyomod a Delete gombot.
Ha törlés helyett nullákat akarsz, akkor a "pezsgőtabletta" tartomány kiválasztása után írj 0-t majd Ctrl+Enter.
Sajnos nem megy, ezt dobja a program: "Aleljárás vagy függvényeljárás nincsen definiálva."
Amit változtattam rajta az a A:A helyett B5:B7. Csak a B oszlopban vannak a cellák az alábbi tagolásban. B5-B7 B11-B13 B16-B18 B21-B23 B26-B28 B31-B32 B34-B36
a lényeg hogy a 15 cellában található értékek egy gomb nyomásra vagy macro futtatás hatására vegye fel a 0 értéket... ha felülírjuk az is jó, ha vhogy nullázuk nekem az is jó...
kipróbálom a macro-dat amit küldtél... hátha működik...
Ja, azt elfelejtettem leírni az előbb, hogy mielőtt a Feltételes Formázás menüpontot kiválasztod, jelöld ki az A oszlopot. Ha a dátumok máshol vannak, a képleteket annak megfelelően kell módosítani.
Ha például az A oszlopban vannak a dátumok, akkor a mellékelt ábra szerint állítsd be. Itt 30 napot vettem egy hónapnak, mert így lényegesen egyszerűbb megoldani, mintha ténylegesen hónapokkal kellene számolni.
Sziasztok! A következő lenne a problémám: Szeretnek egy olyan nyilvántartást, ahol tudom figyelni engedélyek lejárati dátumát. Úgy gondoltam, hogy ha 3 hónap van még hátra az engedélyből zölddel, ha 2 sárgával, ha 1 pirossal legyen megjelölve. Meg lehet ezt valahogy oldani excelben? Ha igen, akkor milyen módon? Vagy a háttér színeződne be, vagy a dátumok. Bármelyik megoldás jó lenne. Előre is köszi a segítséget. Ági
ja meg azt sem értem, hogy mitől lenne egyszerűbb a "B" oszlopba (az "A" mellé) beírogatni nullákat, mint kinullázgatni az "A" oszlop celláit. Vgay minek kell kinullázgatni, miért nem lehet őket felülírni azt kész.
Nyilván meg van az oka, csak ugye nem látok a fejedbe
ha jól értelek: nem lehet "kiementi" cellát megadni egy beépített függvénynek.
az a "15-20" cella egybefüggő, meghatározható a (maximális) cellatartománya? csak számok vannak benne? Gondolom a1:a20 tartományt kell "nullázgatni", hát
próbáld meg ezt a makrót: (tedd rá egy gombra, amit az űrlapok eszköztárból húzol fel a munkalapra)
amúgy ez is egy simán rögzített makró, csak a felesleges select-eket kiszedtem belőle
Sub nullbeir() Columns("A:A").SpecialCells(xlCellTypeConstants, 23).FormulaR1C1 = "0" End Sub
Gyakorlatilag mezők nullázásáról volna szó. Kiszámolok egy munkát a táblázattal, mentem, majd másnap újra számolok egy másikat de lusta vagyok 15-20 mezőt egyesével kitörölni.
Megpróbáltam macro felvétellel megoldani a dolgot de használhatatlan eredményt kaptam, viszont programozni meg nem tudok.
Valaki valami script-et javasolt de ezt szintén nem tudom leprogramozni.
Az biztos hogy a 15-20 cella az beviteli mező, ergo oda csak számokat lehet beírni. Én egy IF függvénnyel próbálkoztam, de nem tudtam megadni a nullázandó cellákat mint kimeneti cellát.
Az A1-es cellába beírok egy számot pl. 100, de ha a B1-es cellába azt írom hogy 0 akkor az A1-es cella felveszi a 0 értéket. Mondhatnám úgy is, hogy egyik cella nullázza a másik cella értékét.
Ne haragudj, szerintem a probléma leírása nem egyértelmű.
A cellarácsok nyomtatását egyszerűen ki lehet kapcsolni. Lásd: Fájl -> Oldalbeállítás A "többi sallang" micsoda? Ha az adatok egy elkülöníthető területen vannak, akkor a kijelölt terület nyomtatása a barátod.
Üdv Mindenkinek! Nekem az alábbi problémám lenne megoldásra várva: - adott sok-sok (3lapból álló indigós) munkalap. - a (a papír alapú, előbb említett) munkalapokon vannak részek, amik fixek, pl.: munkalap címe, vagy épp dátum, vagy 1-2 rublika megnevezése. - hogyan csinálok olyan XLS-t excelben, amely a következőket tudja: >>látom a teljes munkalapot úgy, ahogyan a papíron is szerepel. >>csak az adatokat nyomtassa ki, a többi sallangot ne pl.: cella-szegélyek.. ??Vki tud megoldást rá?
A szóközök eltávolításához egyszerűbb a csere funkció alkalmazása. Kijelölöd a tartományt, Szerkesztés/Csere, vagy ehelyett Ctrl+h-ra bejön a funkció. A "Keresett szöveg"-hez adj egy szóközt, a "Csere erre" rubrika maradjon üres, "Az összes cseréje" kipusztítja a szóközöket.
Makró: Eszközök/Makró/Visual Basic Editor, avagy Alt+F11. Bal oldalon kiválasztod a füzetedet, Insert menü, Module. Jobb oldalon kapsz egy üres lapot, oda másold be a makrót. Indítás: vagy a VBE-ben F5-tel, vagy az Excelben Eszközök/Makró/Makrók (Alt+F8), makró nevén duplaklikk.
Segitsegre van szuksegem. Szeretnenk ha az alabbi tablaztnal a masodik oszopban ugy at tukroznenk az elso oszlopot = gel, hogy a szoveg (TEST) helyett 0 jelenjen meg.
Ez a makró a B oszlopba beírja, hányszor szerepel az A oszlop azonos sorában a @.
Sub Kukac() Dim sor As Integer, b As Integer, k As Integer
sor = 1 Do While Cells(sor, 1) <> "" k = 0 For b = 1 To Len(Cells(sor, 1)) If Mid(Cells(sor, 1), b, 1) = "@" Then k = k + 1 Next Cells(sor, 2) = k sor = sor + 1 Loop End Sub .
.
A TRIM függvény a cellák elején, és végén lévő szóközöket vágja le, a közbülsőket nem. A lenti makró a C oszlopba írja az A oszlopbeli adatokat szóközök nélkül.
Sub Space() Dim sor As Integer, b As Integer, k As String
sor = 1 Do While Cells(sor, 1) <> "" k = "" For b = 1 To Len(Cells(sor, 1)) If Mid(Cells(sor, 1), b, 1) <> " " Then k = k & Mid(Cells(sor, 1), b, 1) Next Cells(sor, 3) = k sor = sor + 1 Loop End Sub
Felvennék egy új oszlopot, a G-t, amiben az =E2-D2 képlet megadná a jármű aznapi futási idejét. A H oszlopban az =HA(A2=A3;"";SZUMHA(A:A;A2;G:G)) képlet beírja az egynél több jármű együttes futási idejét, mégpedig az utoljára beírt sorában. Feltétel: az azonos napon futottak egymást követő sorokban legyenek.
Ha minden jól megy, akkor egy időben csak egy jármű dolgozik. Amennyiben azonos időben 2 (vagy 3) jármű dolgozik, akkor a közösen eltöltött időt valahogyan külön összesíteni kellene. Hogyan tudnám ezt vizsgáltatni?
Sziasztok! Én új vagyok itt. Nem vagyok egy nagy Excel guru, de rendbe kellene tennem egy adatbázist. Kérdéseim (gondolom nagyon egyszerűek): - milyen függvénnyel lehet azt ellenőrizni, hogy egy cellában többször szerepel a @ karakter? - hogy lehet a szóközöket eltüntetni? Próbáltam a Trim függvénnyel, de nem mindent tüntetett el. Ha valaki tud segíteni, előre is köszi.
Talán segítségedre lenne az is, ha bővítményként elmented azt a törzsadatos táblázatot a makrókkal. Várj meg vki okosabbat, nekem így látatlanul elég nehéz annak lennem. Most akkor sikerült, vagy nem a dolog?
Ugyan nem értek az Excelhez, de az nem járható, hogy a "." karaktert lecseréled "/" karakterre? Gondolom, valami substitute(), vagy mit tudom én milyen függvény csak van. Szóval olyasmi, ami a Linux sed parancsának felel meg:
Ez eddig rendben is van. Nekem azonban arra lenne szükségem, hogy egy másik munkalap egy-egy cellájából vegye a dátum adatokat. Tudna valaki segíteni, figyelembe véve azt, hogy az autofilter nem hajlandó működni akkor, ha / helyett . -tal vannak elválasztva a számok: http://www.ozgrid.com/VBA/autofilter-vba-dates.htm
egyébként, ha feltétlenül excelt akarok használni, én készítek MSQuery segítségével a törzs adatbázisból (vmi ilesmi lehet a tied is) egy OLAP kockát, amit az exceles pivottáblákkal tökéletesen lehet használni. A KimutatásAdatot.Vesz fgv megfelelő beparaméterezésével ez csodákra képes.
Sub sdfsdf() Application.Run "xy.xlsm!Macro" End Sub
formával meg tudod hívni egy másik munkafüzet makróját. Ahol "macro" az eljárás neve a másik munkafüzetben. a file kiterjesztése és a többi nyilván a sajátodnak megfelelően változik
Amúgy az sem jó értékben, csak az eloszlás egyenletessége töklétes, de az értékek nem jók, egy arányosan kicsinyített ellipszist kaptam. Be kellett az Y-t szorozni az ry/rx hányadossl (pont úgy, mint az előzőn változatnál). Matematikilag nem tudom levezetni, viszont így az eredmény tökéletes.
Na ezért mentem én vegyésznek, és nem matematikusnak. A vegyészetben az empirikus megoldás tökéletesen elfogadható. Pl. a receptekben sok helyen benne van, hogy az óramutató járásának irányában kell keverni, annak sincs elméleti kémiai magyarázata :-)
Elnézést, hogy a saját vívódásaimmal megtöltöm a topicot. Ha a szögfüggvényes megoldás rögtön eszembe jut, el sem kezdem. Amit az ellipszis egyenletével egy fél nap alatt sok hibás lépés után csináltam meg, a szögfüggvénnyel (hajnali tiszta fejjel :-) 10 perc volt.
Csinálok magamnak problémát a kör (ellipszis) egyenletével, mikor szögfüggvénnyel teljesen egyenletesen lehet elosztani körben a pontokat. x=rx*cos(szög) y=ry*sin(szög) A szög meg 1-2pi között változik ahány lépésben akarom, mert radiánban kell megadni.
Na ezzel az ellipszis egyenlettel megoldottam a feladatot. A piros kör a térképen levő, szakik által rászerkesztett területkijelölés, ami szintén nem a számszerű koordinátamegadásnak megfelelő helyen van, az én általam csinált kék "krumpli" közelebb áll hozzá. Ha kell valakinek, oda tudom adni az excel táblát 68 pont kiszámítására, négy valós szám adatból:két középpont-koordináta, két sugár. Ha a két sugár egyezik, akkor kört rajzol. Egy dolgot nem tudtam megoldani, az exponenciális függvény miatt a pontok nem egyenletesen helyezkednek el, az x maximuma környékén egy azonos lépésre nagy y eltérés van, ezért ott sima kör helyett hegye van a tojásnak :-(
A térképészet ebben annyi lenne, hogy tudjuk, miért több és mennyivel a szélességi fok, mint a hosszúsági. De ez készen van, két konstans, az ellipszis két sugara. A két fókuszpont egybeesik. Tehát tkpp. az ellipszis egyenletét lehetne valamit egyszerűsíteni, de már én sem emlékszem rendesen, ki kivel van.
Ax2 + Bxy + Cy2 + Dx + Ey + F = 0
De pl. a képlet sincs szinkronban a rajzzal, mert az nincs meg, hogy mi az "e", illetve mi az a "e.a"
Azt hiszem, ez nem igazán exceles feladat, vagy probléma. Ez inkább az elemi geometria, a koordináta geometria, térképészet és némi ábrázoló geometria keveréke. Azért egy rajzos vázlat sokat segítene, mert értelmezni is nehéz az alap feladatot.
A bemeneti adat egy földrajzi koordinátapár X és Y egész.tizedes formában.
E köré kell rajzolni a digitális térképre egy r sugarú (km) kör pontjait, mondjuk 64-et. Csakhogy egy térképen (néhány speciális vetülettől eltekintve) 1 km észak-déli irányban 0,0132 fok, kelet-nyugati irányban (47,5 szélességi foknál) 0,0909 fok. Vagyis ami a földön kör, az a térképen ellipszis.
Tehát egy ellipszis pontjait kellene kiszámolni, hogy azokat a térképre rajzolva kört kapjak.
És ezt többször kell megcsinálni változó középponttal és sugárral.
Az ellipszis egyenlete bonyolult, a köré egyszerű, ezért próbáltam egyszerűsíteni. Közelítő megoldás van, korrekt nincs.
Vissza az egész, rossz a kérdés, mert az igazi körben csak egy sugár van, és egy körvonalpont Y kiszámításánál csak az X irányú sugár szerepel. Ezt megcsináltam, frankó ellipszist kaptam a térképre helyezve. Tehát tényleg az ellipszis egyenletével kellene számolni, az meg jó bonyolult, ezért kérdem, hogy nincs-e kész képlete valakinek ellipszisre. Én addig is gondolkodom, hogy a kiszámított Y értéket beszorozva az Ry és Rx hányadosával nem kapnék-e jobbat?
Tehát, hogy pontosítsak, matematikailag ez nem kör, hanem ellipszis. Csak mire a térképre kerül, ahol nem négyzetes a koordinátarendszer, a végén kör lesz belőle. De körrajzoló hamarabb van, mint ellipszisrajzoló, ezért az x és az y képletét fogom módosítani.
Szervusztok. Nincs készen valakinek egy EXCEL képlete arra, hogy a középpont koordinátájából koordinátafokban megadott R sugarú körrel (más az X irányú és az X irányú) hogy lehet 64 körívpont koordinátáját kiszámoltatni. Én is meg csináltam már egyszer, de nem találom. Arra viszont emlékszem, hogy sokáig rossz volt, mielőtt jó lett. Előre is köszönöm!
Valaki tudna nekem segíteni a következő problémámban? Keresgéltem, de nem találtam sehol a megoldást, persze nem is nagyon vagyok jártas a függvényekben. Tehát a probléma:
van nekem egy oszlopom amiben nevek szerepelnek kb. 20 sorba
x c v b n m h d r t
stb...
A legalsó sorban szeretném látni, hogy a felette lévő 20 sorban van e azonos név.
Nem lehet, hogy azért jelez szerver hibát, mert valami olyan fícsör van benne, amit a Google Docs nem tud (pld. feltételes formázás, COUNTA(A:A), etc.)?
A Google Docs jó ötlet, ne add fel.
Mintha a Microsoft-nak is lenne hasonló szolgáltatása, de nem tom a nevét.
Ezt már így önmagában nagyon jól tudom használni, örök hálám! Ráadásul így még kicsit a vbasic-kel is megismerkedem közben, eléggé hasonlít a Delphire így elsőre..tetszik :)
Bocsánat, tegnap már nem voltam gép elött.. Átnézve a kódot úgy látom ha szeretném, hogy az ismétlődés játsszon, akkor elég kivennem belőle a "feltételt". Kipróbálom és jelentkezem.
Van egy 238k méretű pici excel táblázatom, amit megszeretnék osztani online a barátommal, hogy folyamatosan tudjuk frissíteni. Próbáltam a Google Dokumentum létrehozásaként, de folyamatosan server hibát ír ki. Pedig más formátumot(jpg) megtudok osztani. Milyen megoldást javasoltok?
A kód azt csinálja, hogy az aktuális sheet A1:A36 tartományából szedi fel a karaktereket és az B1:B42840 tartományba dobálja a kombinációkat. Ismétlődés nem jáccik, szóval AAA, v. ABB -szerű kombinációk nem lesznek.
Sub karakterlanc()
Dim a, b, c Dim sKarlanc As String Dim lSor As Long
lSor = 1 For a = 1 To 36 For b = 1 To 36 If b <> a Then For c = 1 To 36 If Not (((c = a) + (b = c))) Then sKarlanc = Cells(a, 1) & Cells(b, 1) & Cells(c, 1) Cells(lSor, 2).Value = sKarlanc lSor = lSor + 1 End If Next c End If Next b Next a MsgBox lSor & " kombináció kiírva" End Sub
Nem jelszófeltörés a cél, bár bennem is felmerült, hogy valami kész brute-force megoldás segíthet, mivel a generálás része nagyon hasonló.
A stringek 3 karakteresek kell legyenek, 36 különböző elem variációjából szülhető összes.
Példaként
Elemek: A; B; C;....stb
Kombináció lista, amire szükségem van:
3 karakteres stringek:
ABC
BCA
CAB
ACB
CBA
BAC
Azért gondoltam Excelre, mert ha össze tudja számolni és ki tudja írni, hogy összesen hány eleme lesz a listámnak, akkor miért nem tudná kiírni magukat az elemeket is, nem igaz? Egyrészt ezt gond nélkül tudom használni a melóhelyemen, másrészt minden más megoldás bonyolultabbnak tűnik nekem(tömbökkel és egymásba ágyazott ciklusokkal valamelyik nyelven nekilátni), hacsak nincs kifejezetten ilyen célra írt freeware progi. Ha Excelben nem oldható meg és nem találok rá más progit akkor szerintem TurboPascal lesz a vége (VBasichez nem konyítok annyit se).
üdv. Miért van az, hogy office2007 Excel, sima szűréssel egy táblázatból azarok szűrni, az első találatig el is tünteti az összes sort, de az első találat utáni további sorokat már nem szűri ki?
Jól érted, egy kiegészítéssel. Név akár rengeteg is lehet egy rekordban, mert van olyan cég, aminek egy tulajdonosa volt és maradt is egész életében, meg van olyan cég is, aminek 20 tulajdonosa volt, és mind a 20 eladta más 20 embernek.
Szóval az, ha több találat van névre abszolút nem problémás eset.
De egyébként a gondolatmenet jó, és a Find valszeg tényleg jobb mint az instr...
A speciális nevek speciális okból nem jelentenek problémát szóval azokkal hálistennek nem kell foglalkoznom, de ez felhasználási adottság, nem programozási.
Eddig azt hittem, hogy egy konkrét oszlop celláiról kell eldönteni, hogy nevek vannak-e bennük, vagy sem. Most így értem:
Van egy táblázatod, amelyben minden sor egy rekord, és minden rekordban van egy név. Ezt a nevet kell kinyerni a táblázatból. De az a probléma, hogy egy adott soron belül nem tudod, hogy melyik oszlopban van a név. A név oszlopa akár sorról sorra változhat.
Ez eddig jó? Ha igen, akkor én így fognék hozzá:
1) Van egy másik táblázat, amiben a lehetséges keresztnevek vannak felsorolva. (Erre a továbbiakban szótár néven hivatkozom.) 2) A szótárat (amellett, hogy benne van az összes lehetséges keresztnév, nemcsak a leggyakoribb 400) kiegészíteném spéci írásmódú nevekkel (Judith, Cynthia, stb.) és "-né"-kkel (Jakabné, Zoltánné, stb.) 3) Ciklussal végigmennék a sor összes celláján (kivéve, amelyikről biztosan tudom, hogy nem név van benne) 4) Az aktuális cella összes szavára rákeresnék a szótárban .Find metódussal. Ha akármelyik szót megtalálja, akkor az a cella nevet tartalmaz. Ebből a szempontból érdektelen, hogy a keresztnév hányadik szó a sztringben. 5) Kérdéses illetve bizonytalan esetnek az minősülne, ha az adott sor több cellájában is talál nevet, vagy pedig egyikben sem.
Alternatív megoldási lehetőség: kicsit megmogyorózni az extract készítőit, hogy normális, strukturált kivonatot adjanak. Nem hiszem el, hogy nem lehetséges.
Ennél sajnos bonyolultabb az ügy (vagy félreértem amit írsz).
Szóval ez egy cégbírósági adatbázis, amiből néha neveket, néha címeket kell kiemelni. A címekkel nem foglalkozom itt, mert az könnyű.
A probléma, hogy az adatbázisból származó extract-nak nincs hagyományos értelemben vett szerkezete, az egyes adatokat | választja el, ennyi.
Szóval van itt minden, TEÁOR szám, adószám, cgjszám, szöveges nem-név adatok, stb., meg a számomra fontos név adatok is. Mivel pld tevékenység-kódból lehet akármennyi, nem tudom kiszámolni, hogy hol lesznek a nevek a letöltött adatok között. Annyi fajta adat van/lehetséges, hogy az az érzésem, a negatív azonosítás több időt vesz el, mint az INSTR, de azért ránézek majd.
A nevek számos formátumban előfordulhatnak, de a formátumoktól függetlenül egy cellába kerülnek: - Gipsz Jakabné (Kovács Klára) [ahol Kovács Klára az anyja neve] - ez mind 1 cella. - Gipsz Jakab Zsoltné Kiss Márta Ajsa, - Gipsz-Kiss Márta Ajsa (vagy a még rosszabb Gipsz Kiss Márta Ajsa), - stb.
Szóval a .FIND szerintem nem műxik, mert ahhoz meg kell határozni, hogy egy cella tartalmának melyik része a keresztnév és ezt nem tudom algoritmizálni, néha az utolsó "szó" néha az utolsó kettő... Szóval a "-né"-t egyszerűbbnek tűnik keresni, mint "normálformára" hozni a férj nevét. Hatékonyabbnak tűnik az a gondolatmenet, hogy ha egy karakterlánc utolsó két karaktere "né", akkor az név.
"sajnos nincsenek neveknek fenntartott oszlopok, valszeg minden cellát ki kell majd értékeljek, hogy nevet tartalmaz-e"
Én a keresztnevek adatbázisának oszlopára gondoltam. Amikor az INSTR függvényt emlegetted, nekem az ugrott be, hogy ciklussal akarod megoldani a keresést. Pl. van egy sztringed, és fogod a 400-2000 keresztnevet tartalmazó adatbázist, és egyenként végignézed az összes celláját, hogy vajon a sztringed egyezik-e valamelyik névvel.
Ehhez képest javasoltam, hogy inkább használd a keresztnevek adatbázisán a .Find keresést, vagy esetleg valami intelligens SQL lekérdezést. A processzor kevésbé fog így leizzadni.
Még egy-két tipp: - figyelni kell arra, hogy ha valaki pl. "Kovács Endréné", és a végéről a "né"-t leválasztod, akkor "Endré" -t kapsz, ami a keresztnevek szótárában valószínűleg nem lesz benne (mert ott "Endre" lesz). Ezt én úgy oldanám meg, hogy a szótárat kiegészíteném az összes lehetséges "né"-vel. Pl. Andrásné, Antalné, Barnabásné, stb... (A modern szeleket figyelembe véve akár olyanokkal is, hogy Annáné, Anikóné, Borbáláné, stb...) És így nem kellene vesződni azzal, hogy levágni a végét, újra rákeresni, stb.
- Érdemes lenne a szótárat kiegészíteni spéci írásmódú nevekkel, pl. Judith, Edith, stb.
- Azt mondtad, az adatok egy adatbázisból jönnek. Gondolom, ez valami nyilvántartás, ami olyan adatokat tartalmaz, mint lakcím, telefonszám, stb. Adott esetben könnyebb lehet a negatív azonosítás, tehát igazolni, hogy a kérdéses sztring NEM telefonszám, NEM lakcím és NEM forgalmi rendszám.
- A bizonytalan vagy nem azonosítható adatokat érdemes lehet kitenni egy kis táblázatba, felhasználói felülvizsgálatra.
Delila, köszi a fájlt! Óriási előnye, hogy nem tartalmazza mind a kb 2000 anyakönyvezhető nevet, csak kb 400-at, gondolom a leggyakoribbakat.
Jimmy, sajnos nincsenek neveknek fenntartott oszlopok, valszeg minden cellát ki kell majd értékeljek, hogy nevet tartalmaz-e :-( A szétszedés is jó ötlet, most hogy rágódom rajta valszeg azt fogom csinálni, hogy: - cellatartalmat szétszedem szóközök mentén - utolsó szót megnézem, hogy keresztnév-e - ha nem akkor megnézem, hogy jobbról az utolsó két betű "né"-e (inkább ezt előbb, és az előzőt utána) - ha a név legalább három szó, akkor lehet, hogy a fentiek sikertelensége esetén (valakinek két keresztneve van, de az "utolsó" valami egzotikus, pld ézsua) megnézem a jobbról a második szót is, hátha az keresztnév.
Brute force-szal azért gondolom leizzasztja majd a processort...
A brute force módszernél jobbat nem tudok, de szerintem jobb lenne, ha a karakterláncot szavakra bontanád, és e szavakra, vagy a szavak első n-2 karakterére keresnél rá a nevek alkotta oszlopban. Egyrészt gyorsabb így, másrészt arra is kell gondolni, hogy ha valaki "Edelényben kapál", az két keresztnév, de mégse név.
Tud valaki olyan forrást, ahonnan a magyar keresztnevek listáját valamilyen excel által ehető formában megszerezhetném?
Illetve ha valakinek van valamilyen praktikus ötlete a lenti problémára, nagyra értékelném, ha az arcomba vágná! Írnom kéne egy kis kódot, ami meghatározza, hogy egy karakterlánc (amit egy adatbázisból szedek ki) név-e. Speciális okokból a nevek egy nagy részénél a név után ott lesz az anyja neve is zárójelek között, így ezek esetében a zárójel jelenléte ügydöntő (más, nem név tipusú adatok nem fognak zárójelet tartalmazni). Viszont lesznek esetek, amikor bár név az adott karakterlánc, de mégsem lesz ott a zárójeles anyja neve. Egyéb ötlet híján arra gondoltam, hogy brute force módon egy INSTR függvénnyel megnézem, hogy a karakterlánc tartalmazza-e a magyar keresztnevek valamelyikét.
Van valakinek valami jobb ötlete a probléma megoldására?
Nincs mit. Örültem a kérdésednek. Ritka csemege az, amikor a kérdező maga is profi, és egyrészt jól tud kérdezni, másrészt kevés szóból is megérti a választ.
Eddig nem vettem észre ezt a védelmi lehetőséget (nem is volt rá szükségem), de miután Jimmy megadta, hol állítható be, egyszerű makrórögzítésekkel ezeket kaptam:
Sub Rögzítés1() 'Védelem ActiveSheet.Protection.AllowEditRanges.Add Title:="Tartomány1", Range:= _ Columns("A:A"), Password:="MegyoG" ActiveSheet.Protection.AllowEditRanges.Add Title:="Tartomány2", Range:= _ Columns("C:C"), Password:="Józsi" End Sub
.
Sub Rögzítés2() 'Védelem feloldása ActiveSheet.Protection.AllowEditRanges(1).Delete ActiveSheet.Protection.AllowEditRanges(2).Delete End Sub
Köszi a segítséget!!! Makróval tényleg egyszerűbb lenn, de sok esetben le van tiltva. Nem egyszer fordult elő, hogy panaszkodnak, mert "nem csinál semmit".
Harmadik segédtábla: - az Z6:AC15 tartományba kerül (4 oszlop, mert az adatzona-nak 4 sora van, 10 sor, mert 10 szám előfordulását keresed) - VIGYÁZZ, az első oszlop képlete más mint a többié!
Szóval, az első oszlop első cellájába (Z6) a következő képlet kerül: =IF(S6="","",S6) SIMA ENTERREL kell a függvényt lezárni.
Ezt sima copy-paste-tel másold be a Z oszlop többi üres releváns cellájába (Z7:Z15)
A többi oszlop cellája: Az AA6 cella tartalma a következő legyen: =IF(T6="","",T6-S6) Sima ENTER-rel kell lezárni.
Azt a képletet ebből a cellából sima copy-paste-tel másold át az AA:AC releváns celláiba.
Második segédtábla: - az S6:V15 tartományt foglalja el (4 oszlop, mert 4 sora van az adatzona-nak, 10 sor, mert 10 számot keresel. Azért az S-ben kezdődik, mert csak :-)
Az első cellába (S6) a következő képlet kerül: =IFERROR(SMALL(IF($H$6:$Q$6<0,"",$H$6:$Q$6),COLUMN(A1)),"")
Szintén Control-Shift-Enterrel lezárni, {} közé kerül a képlet ha jól csináltad.
Ezt a cellát most másold át sima copy-paste-tel az S6:V15 tartomány üres celláiba.
Most azt látod, hogy a negatív számok eltűntek és az első segédtábla számai egymás mellé kerültek.
A lenti képletet, sima Copy-Paste-tel másold át a segédtábla minden cellájába. Most a H6:K15 tartományban számokat látsz, a te példád alapján: H6:K6: 0 1 -1 -1 H7:K7: 0 1 2 -1 H8:k8: -1 1 -1 3 ... H15:K15: -1 -1 -1 -1 (10-es szám egyik sorban sincs)
Tudnivalók: - a te lenti példádat használtam úgy hogy egy sheet bal felső sarkában vannak a számok: A1:F4 - ezt a tartományt elneveztem 'adatzona'-nak. így csak a Name Manager-ben kell majd az adatzona hivatkozasi tartományát megváltoztatnod, ha a saját adataidra akarod használni a cuccot - a segédtábla úgy épül fel, hogy az eredmények a H6 cellától kezdődnek, - a segédtábla fejléce (5-ös sor) tartalmazza számként az egyes sorok számát, tehát H5=1, I5=2, J5=3, K5=4 (a példádban négy sora volt a forrás adatmátrixnak) - a segédtábla oldalsó fejléce (G oszlop) tartalmazza a számokat, amiket keresünk, vagyis G6=1, g7=2, g8=3, ... g15=10 (azt mondtad 10 számjegyed van).
Miután mind a forrás-, mind a segédtáblázatodat így felállítottad, a H6 cellába (1-es számjegy előfordulása az első sorban) a következő kerül: =IFERROR(MATCH($G6,OFFSET(adatzona,H$5-1,0,1),0)/MATCH($G6,OFFSET(adatzona,H$5-1,0,1),0),0) *ROW(OFFSET(adatzona,H$5-1,0,1))-1
Ezt a képletet Control-Shift-Enterrel zárd le! Ha jól csináltad akkor a képlet a szerkesztőlécben ilyen zárójelek közé kerül: {}
A problémát az jelenti, hogy az eredmény-mátrixod egyes oszlopai más pozíciót jelölnek más más sorban. Érthetően a példád alapján: 1-es számjegy eredményei: 0 1 (ahol az eredmény első számjegye (0) az első sor eredményét, a második számjegye (1) a második szor eredményét jelenti) 3-as számjegy eredményei: 1 2 (ahol az eredmény első számjegye (1) a második sort jelenti, a második számjegye a negyediket.
Szóval egy lehetséges megoldás (több fázisos megoldás): 1.) Első segédtábla, valahol elrejtve a táblázatodban: Annak kiszámolása, hogy van-e egy adott sorban találat az adott számra, ha van, akkor az eredmény a sor száma mínusz egy, ha nincs akkor egy azt nyilvánvalóan jelölő eredmény (én a mínusz 1-et választottam. 2.) Második segédtábla, a fenti segédtáblából csak a releváns (pozitív v. nulla) eredmények, egymás után felsorolva (vagyis ha két releváns szám között van egy mínusz 1, akkor azt ki kell hagyni 3.) Harmadik segédtábla, a második segédtábla adatainak különbsége.
bocs, mégvalami. azt ki tudom valahogyan küszöbölni, hogy ne figyeljen a véletlenül beütött szóközökre? tehát vegye ugyanannak az " x"-et és az "x"-et.
Sziasztok! Leegyszerűsítve a problémám: Van 10 számjegyem. Legyen 1..10. Ezeknek a számoknak soronként különböző előfordulásai vannak: 2 4 5 6 9 1 4 8 2 1 3 7 5 2 8 9 6 4 3 4 5 9 7 6 egy sorban egy szám csak egyszer szerepel. A feladat, hogy megszámoljam a számjegyek előfordulásának távolságát. Eredmény: az első oszlopban a számjegy, a következőkben pedig a a távolságok (az előző előforduláshoz képest) 1. 0 1 2. 0 1 3. 1 2 4. 0 1 1 1 5. 0 2 1 6. 0 2 1 7. 1 2 8. 1 1 9. 0 2 1 Tehát az 1-es szám szerepel az első sorban, és az első sorhoz képest még a következőben Az 5-ös szám például szerepel az első, harmadik, negyedik sorban. Így az 5-ős távolságai egymástól: 0-2-1. Van ötletetek? Bejglee
Hát, van itt egy elképzelés. Nem a legszebb, eddig nincs jobb ötletem.
Standard kódmodulra:
Public WS As Worksheet
Sub main() Ciklus MostKezdjük:=True End Sub
Public Sub Ciklus(MostKezdjük As Boolean) Static wsi As Long
If MostKezdjük Then wsi = 0 wsi = wsi + 1 If wsi > ThisWorkbook.Worksheets.Count Then Exit Sub Set WS = ThisWorkbook.Worksheets(wsi)
MsgBox WS.Name & " - üzenet 1" MsgBox "üzenet 2" UserForm1.Show End Sub
UserForm moduljára:
Private Sub CommandButton1_Click() MsgBox WS.Name & " - üzenet 3" MsgBox "üzenet 4" Unload Me Ciklus False End Sub
Ha a ciklusod után még van valami futtatandó, akkor azt külön Sub-ba kellene tenni, és a If wsi > ThisWorkbook.Worksheets.Count Then Exit Sub helyett If wsi > ThisWorkbook.Worksheets.Count Then Még_valami mintájára indítani. De lehet még cizellálni ezen, az alapötlet a statikus változó használata volt.
Ha jól értem a feladatot, két oszlopban (mondjuk A és B) adatok vannak. Ha A oszlopban és B oszlopban egymás mellett ugyan az van akkor legyen formázva.
üdv! a feltételes formázással kapcsolatban szeretném a nagyérdemű segítségét kérni. azt szeretném, ha két oszlopban csak akkor emelné ki az azonos tartalmú a cellákat, ha azok ugyanabban a sorban vannak, vagyis szűkíteni kellene valahogy az ismétlődő értékek beállítást egy adott tartományról soronkénti figyelembevételre. remélem érthető... előre is köszi a segítséget!
Köszönöm, erre én is gondoltam, de sajnos nem jó, mert mint azt a kiegészítésben írtam, az egész egy loop-ban fut. Tehát, ha a javaslatodnak megfelelően járok el, akkor az utasitas3-t és utasitas4 nem fut le, de a loop következő iterációjában lévő utasitas1-t és utasitas2 igen, majd a program megint meg akarja mutatni a formomat, ami még a user lassúsága miatt nem is unload-olódott.
Egy hosszabb program közepén meghívnék egy userformot. Meg szeretném engedni, hogy a userform megjelenése után a felhasználó kijelölhessen cellákat vagy range-et az activesheet-en, majd a userformra OK gombjára kattintva folytatódjon a végrehajtás, de a UserForm.Show utasítás utáni parancsok (utasitas3, utasitas4,...) csak akkor hajtódjanak végre, amikor az OKButton_Click trigger lefutott.
Ha modálisként nyitom meg a userformot, akkor a felhasználó nem tud kijelölni. Ha nem modálisnak nyitom meg, akkor viszont folytatódik a végrehajtás a userform "mögött" az utasitas3, utasitas4 végrehajtásával.
A "bibi" üzenet akkor jön, ha nem talál meg egy olyan számot a bemenő adatok listájában, amelyet előzőleg kiválasztott, mint a keresett összeg egyik komponensét. Tehát pl. a program megállapítja, hogy a felsorolt értékek közül a 7 + 8 + 1 kombinációjával lehet a 16-ot előállítani, utána sorban megkeresi a korábban már egyszer megtalált értékeket, kiszínezés céljából, de most az egyiket nem találja... Ennek nem volna szabad bekövetkeznie, szóval gőzöm sincs, mi lehet a baj.
Ha esetleg el tudnád küldeni a tesztadataidat, meg tudnám nézni, miért akad el.
A színezésnél mindent össze kell adni, amit kiszínez. Itt az lehet a gond, hogy ha túl sok találat van, és mindegyik más színű, akkor akadhat köztük olyan, amit az automatikus háttérrel azonos színre "fest". Így aztán ez a szám nem tűnik ki a többi közül.
Módosítsd a makrót úgy, hogy hit.Interior.ColorIndex = ix + 2
helyett
hit.Interior.ColorIndex = 2
legyen. Így minden találat azonos (azt hiszem, piros) színű lesz, nem bújik el egy sem.
Amelyik cellában kezdeni akarod a vektort, beírod: =A1. Ezt lemásolod 4 cellán át (összesen 5 cellában lesz a képlet). Alá beírod: =B1, szintén lemásolod, végül alá =C1, másolod.
Vagy: Nézd meg a transzponálás függvényt. Ahhoz ki kell jelölnöd annyi cellát egymás alatt, amilyen széles a mátrixod, jelen esetben ez 3. Beírod: =transzponálás(A1:C1), majd Ctrl+enterrel viszed be a kijelölt 3 cellába. Az alatta lévő 3 cellát újra kijelölöd, =transzponálás(A2:C2), Ctrl+enter. És így tovább A5:C5-ig.
Mindkét esetben érdemes az újonnan létrehozott vektort kijelölni, másolni, majd értékként ugyanoda beilleszteni, de csak abban az esetben, ha az eredeti mátrix változásait nem kell követnie a vektor értékeinek.
De az vettem észre, hogy sorbarendezés nélkül olyan 41e-nél áll meg alul a számkombináció variációk számlálója, sorrendezés nélkül 122e környékére futott fel.
Sajnos sehogy nem tudom szürni a 170 sort. Van amikor a hülye partner 4 hónapnyinál régebbbi számlát utal, van mikor már kifizeti az augusztus 31-ével lejárókat!
A futtatásom most 12:45-töl fut, és csak fehér képernyöm van!Nem tudom majd talán szakaszosan veszem majd - hátha pl. az elsö 50 sorban meglenne - ha nem majd bövítem.
A makrót természetesen módosítottam , ahoyg javasoltad/kérted, tehát remélem már csak pár pillanat és könyvelhetem a tételt... :-))
"Kérdésem volna: az normális, hogy ha növekvö sorrendbe tettem a tételeket (170 db) akkor lényegesen nagyobb kombináció eshetöséget adott meg (kb 120 ezer), mintha nem lett volna sorrendbe (41 e)?"
Ezt nem teljesen értem. Ha növekvő sorba rendezed a tételeket, akkor nagyobb lépésszám alatt jut el ugyanahhoz az eredményhez? Ha így van, az nem normális. A makró automatikusan nagyság (pontosabban kicsiség) szerinti sorrendben veszi elő az adatokat, erre való a KICSI() munkalapfüggvény (Application.WorksheetFunction.Small). Tehát elvileg az adatok rendezettsége nem kellene, hogy befolyásolja a futást. Ha mégis ez történik, akkor talán elfelejtetted a makróban módosítani a bemeneti tartományt A3:A29-ről A3:A172-re. (?)
"de az normális, hogy az excel nem reagál semmire? és olyan mintha összeomlott volna?"
Ez normális, nekem is így csinálta. De ellenőrzésképpen a program futását bármikor meg lehet szakítani. Ehhez aktiváld az Excel ablakot (kattints rá a tálcán, aztán várj, amíg felülre kerül), aztán nyomj egy Ctrl+Break-et. Ekkor feljön az ablak, hogy kód megszakítva, és akarod-e folytatni, vagy kilépni, stb. Ha folytatod, akkor egy ideig megint megy a lépésszámok kiíratása alul az állapotsorba. Ha a Debug funkciót választod, akkor F8-cal tudod léptetni a kódvégrehajtást, és közben a Locals ablakban tudod ellenőrizni a változók aktuális értékét. F5-tel lehet továbbküldeni a futást.
"èn türelmes vagyok és várok akár 3 órát is..."
Nem akarlak elkeseríteni, de 170 adat az nagyon sok. Nekem a korábban megadott 27 adatoddal ment a futás 75 percig. A futási idő az adatok számával exponenciálisan nő. 170 adattal a Naprendszer pusztulásáig sem végezne a gépem.
Nagyon érdemes lenne fontolóra venned a korábbi javaslatomat, hogy amennyire csak lehet, csökkentsd le az adatok számát. Akárhogyan. Ha pl. emlékszel rá, hogy a május 6. környékén nem volt 5000 Ft-nál nagyobb értékű kiszállítás, akkor dobd ki az összes 5000 fölötti tételt, amíg a május 6-i utalást próbálod visszafejteni.
Egy másik ötlet: ha több utalásod van, kezdd mindig a legkisebb végösszegűvel. Annak kerestesd meg az összetevőit, és ha megvan, azokat a tételeket rögtön töröld ki a listából, mielőtt a következő utalással próbálkozol.
Később megpróbálom felgyorsítani a programot, de most nincs rá időm. Az alapötlet az, hogy beolvasni a cellaadatokat tömbbe. Tömbökkel, azt hiszem, sokkal gyorsabbak a műveletek, mint munkalapcellákkal. Ha valaki profi ráér megcsinálni ezt a módosítást, tegye meg kérem.
Ha nem világos, amiket leírtam, esetleg küldd el emilben az adataidat, persze előbb minden privát információt törölj belőle.
Nos, megcsináltam - félig,meddig- az elsö tesztet.
Kérdésem volna: az normális, hogy ha növekvö sorrendbe tettem a tételeket (170 db) akkor lényegesen nagyobb kombináció eshetöséget adott meg (kb 120 ezer), mintha nem lett volna sorrendbe (41 e)?
A bajom az, hogy tényleg sokat fut, de az normális, hogy az excel nem reagál semmire? és olyan mintha összeomlott volna?
èn türelmes vagyok és várok akár 3 órát is, de így rendben vannak a dolgok?
Én az utóbbira tippelek. Nyáron a programok is lassabban futnak. Főleg ilyen kánikulás időszakban, amikor nem lehet életben maradni légkondi nélkül. Elég, ha bekapcsolsz két légkondit, azok már annyira leszívják az elektromos hálózatot, hogy a számítógépnek alig marad táp, és tökre lecsökken az órajele. :o) Egyszer olyat is láttam, hogy a hálózatból olyan kevés áram csordogált, hogy a konnektor csak egy autóakkumulátorral sorba kötve tudta fedezni a PC energiaigényét. ;o)
Function DownloadFile(ByVal URL As String, ByVal FN As String) As String Dim i As Inet, Adatok() As Byte Dim j As Long, s As String
Set i = New Inet With i .protocol = icHTTP .URL = URL Adatok() = .OpenURL(.URL, icByteArray) End With Set i = Nothing If UBound(Adatok) = -1 Then DownloadFile = "nincs meg a szerver" Else For j = LBound(Adatok) To Application.WorksheetFunction.Min(UBound(Adatok), 1000) s = s & Chr(Adatok(j)) Next If InStr(s, "404 Not Found") > 0 Then DownloadFile = "nincs meg a fájl" Else Open FN For Binary Access Write As #1 Put #1, , Adatok() Close #1 DownloadFile = "OK." End If End If
End Function
Sub DownThemAll() Dim Rng As Range, c As Range Set Rng = ActiveSheet.Range("A1:A3") For Each c In Rng Application.Cursor = xlWait c.Offset(, 2) = DownloadFile(c.Value, c.Offset(, 1).Value) Application.Cursor = xlDefault Next End Sub
Function CF_Color(Target As Range) As Long Dim Bln(1 To 3) As Boolean, i As Long
On Error Resume Next For i = 1 To 3 Bln(i) = Evaluate(Target.FormatConditions(i).Formula1) Next On Error GoTo 0 If Bln(1) Then CF_Color = Target.FormatConditions(1).Interior.Color ElseIf Bln(2) Then CF_Color = Target.FormatConditions(2).Interior.Color ElseIf Bln(3) Then CF_Color = Target.FormatConditions(3).Interior.Color Else CF_Color = Target.Interior.Color End If End Function
Na most, ez egy olyan kód, ami kiértékeli a feltételes formázás képletét. Eleve tehát csak akkor működhet, ha a feltételes formázás képlet típusú. A másik problémám, hogy a FormatConditions(i).Formula1 kifejezés a magyar Excelben magyar nyelvű képleteket ad vissza, amivel az Evaluate nem tud mit kezdeni, tehát hibára fut. Gyanítom, hogy angol Excelben működni fog, de momentán nincs ilyen a közelemben, és ezért nem tudom letesztelni.
Az excel-ben egy táblán le van kérdezve az oldal. / Adatok / Külső adatok importálása / Web lekérdezés /
A linkből külön munkalapon kiszedve a cím, stb. Az elérés html.
Ha a linkre kattintok (pl. RTF, vagy PDF, vagy valami más állomány) akkor azt beszeretné tölteni az adott programba. A kiterjesztés nem egyértelmű. Tehát 1. próbálkozás: "http://xxxxx/xxxx/xxxxx/yyyyy."+"rtf" ha nem létezik, akkor 2. próbálkozás: "http://xxxxx/xxxx/xxxxx/yyyyy."+"pdf" ha nem létezik, akkor 3. próbálkozás: ... A lehetőségek végesek.
Hibás cím esetén feldob egy hibaüzenetet, de az egér kattintáson kívül nem találtam megoldást.
Nekem a "mentés másként" funkciót kéne elővarázsolnom lehetőleg az adott program nélkül és ne manuálisan, mert kicsit sokat kéne ismételni.
Az állományok nyilvánosan elérhetőek. A weboldal másoló progik nem oldják meg a problémát, mert át kéne nevezni az állományokat és adatbázisba bejegyezni ha letöltésre került.
Az oldal linkjei tartalmazzák a szükséges neveket, csak az állományok fizikai nevei semmitmondóak.
Azt meg tudja valaki mondani, hogy hogy tudom VBA-ban kiolvasni, hogy egy cella Conditional Formatting-ban igazra értékelődött-e?
Van egy listám, ott Conditional Formattinggal bizonyos ismérvek szerint kiértékeltem az elemeket és amikre a feltételem igaz azoknak a hátterét sárgára változtattam.
Gondoltam ravasz leszek és VBA-ból kiolvasom a háttérszín kódját (Range.Interior.Color), de - kellemetlen meglepetés - a Conditional Formatting nem változtatja meg a hátérszínt (már úgy értem, hogy kód szinten, mert a képernyőn persze).
Tudom, a kiértékelést amit a CF csinál, meg tudnám csinálni a VBA-ban is, de az időtrabló dolog, meg az xl már egyszer megcsinálta, mér dolgozzon kétszer. És valamit kétszer csinálni dupla hibalehetőség (és itt nem az excelben nem bízom, hanem magamban, van néhány kacifántos CF-em).
Ha tudod (akarod, stb.) azzal is kiegészíthetnéd, hogy hogyan képzeled el ezt: "Ha nem létezik, akkor a hibát lekezelni, s egy másik állományt kéne keresnie."
Hol keressen? A HTTP szerveren? Egyáltalán, HTTP vagy FTP a forrás?
Ha tudsz (akarsz, stb.) rakj már be lécci egy működő linket, hogy legyen elképzelésünk arról, milyen állományt akarsz megnyitni.
Mert nem mindegy, hogy egy weben keresztül elérhető excel tábláról van szó, vagy egy weblapról kéne webquery-vel adatokat leszedni (volt itt korábban valaki aki pld. a www.valasztas.hu oldalról akart leszedni választóköri adatokat, de azok nem excel formátumban voltak, hanem html-ben).
Egy excel táblában több ezer hiperhivatkozás van internetes oldalon lévő állományokra.
A linkre rákattintva az állományt betölti, vagy hibaüzenetet ad, hogy nemlétezik.
Olyan megoldást keresek, amit makróból lehetne futtatni, és betöltés helyett a mentés másként funkciót hajtaná végre, természetesen az adott táblázatba előre megadva, hogy hova, milyen néven mentse az állományt.
Ha nem létezik, akkor a hibát lekezelni, s egy másik állományt kéne keresnie.
Ha végzett egy sorral, akkor lépni a következő sorra.
Tuti nem 2007-es újdonság, mármint a választható elemek kipippantása... Nem teljesen értem, hogy 2003-ason mér nem sikerül, bár nyilván nem ez a vindózos programok legnagyobb misztériuma.
Ha már az object model-nél tartunk, van valakinek valamilyen javaslata arra, hogy mit érdemes használni az object modell tanulmányozására? Mert az ami pld. az excel helpjében van - az én véleményem szerint - nem túl jól értelmezhető.
Ha valakinek van könyv v. web javaslata, ne tartsa magában!
Aztat meg hogyan csinálod, hogy "az autofilter legördülőmenüjében - az oszlop tetején - beklikkelem azt, hogy 1, meg azt hogy 2 meg azt hogy 3"? Nekem sehogy sem sikerül egynél több elemet kiválasztani a listából. Ez valami xl2007-es trükk?
Értem én. Nálam nem oszlop szinten, hanem feltétel-szinten jelentkezett a jelenség. Mondjuk egy oszlopban vannak hónapok és nekem az első negyedév kell.
Ezt ugye meg lehet csinálni Advanced filterrel, ahol a feltétel: <=3 és akkor a kód gyönyörű szépen kiírja, hogy "<=3".
Ha azonban azt csinálom, hogy az autofilter legördülőmenüjében - az oszlop tetején - beklikkelem azt, hogy 1, meg azt hogy 2 meg azt hogy 3, akkor a kód azt adja vissza Condition-nek, hogy: "1".
Jó kis kód ez is! Gyorsan ki is próbáltam és azt láttam, hogy ha egy feltételt úgy állítunk be, hogy az autofilter legordülő menüjében több mint 1 tételt kipipálunk (pld, hónap legyen az első három = 1,2,3 bepipálva) akkor csak az 1-est (a feltételek első elemét) írja ki.
Csak tippelni tudok. Régebben még rendszeresen használtam a Set Akármi = Nothing utasításokat. Aztán egy másik fórumon egy nagytudású tag felvilágosított, hogy VBA-ban, amikor egy függvény/szubrutin véget ér, az összes ott deklarált objektumváltozó (kivéve a statikusakat) megy a szemétbe. Más szóval, az End Function/End Sub implicite tartalmazza a Set Akármi = Nothing utasítást. Ennélfogva felesleges külön használni.
Megpróbáltam előkeresni azt a posztot, amiben erről írt, hogy pontosan tudjam visszaadni. De kilátástalannak tűnt a dolog, ezért inkább a neten kerestem rá, hogy mit mondanak.
Nos, a fent leírt dolog elvileg igaz, tehát felesleges lenne "kisemmizni" az objektumokat, csakhogy a VB (és VBA) azon része, amely a memória felszabadítását végzi, akár hibás is lehet. Azt mondják, különösen Access és DAO esetében lehet tapasztalni furcsaságokat, ha az ember nem használja a semmizést. Sajnos, az én tudásom nem terjed odáig, hogy ezeket a dolgokat megértsem, mert ez már nem VB(A), hanem annak is a belső működése. Plusz, lehet, hogy azóta javítottak rajta.
Az biztos, hogy baj nem származhat belőle, ha használod. (Sőt, sokan sorolják a Best Practices közé.) Legfeljebb egy nagyon kicsit hosszabb és lassabb lesz a kódod. Én most már évek óta nem használom, de még eddig nem tapasztaltam negatív mellékhatást. (Vagy lehet, hogy igen, csak nem vontam párhuzamot?) Ezután sem tervezem használni, legfeljebb akkor, ha valami konkrét gyanú merül fel, hogy szükséges lenne.
Azt olvastam valahol, hogy érdemes a Set utasításokat is párban használni, vagyis minden Set értékadást egy Set .. = Nothing-al kellene lezárni és így a memőriát felszabadítani. Idáig, ezt én sem használtam. Mi a véleményed erről?
Ez most [b] Internet Explorer[b] böngésző. Itt még a szögletes zárójeleket is a számbillentyűzetről kellett megadni. A szöletes nyitó a keresét nyitja meg. :(
Sub teszt() Dim AF As AutoFilter, F As Filter, i As Long
Set AF = ActiveSheet.AutoFilter For i = 1 To AF.Filters.Count Set F = AF.Filters(i) If F.On Then MsgBox "Az AutoFilter " & i & ". oszlopában bekapcsolt szűrő, feltétel: '" & F.Criteria1 & "'" Next End Sub
Na igen. Ráment vagy fél napom az agyalásra, mert, mint SQL kolléga megjegyezte, ciklusok egymásba ágyazása ismeretlen mélységben nem olyan magától értetődő dolog. Aztán a gondolat átültetése kódba az absztrakciós képességeimet tette erősen próbára. És végül a tesztelés: végigvárni több tízperces futásokat, mire kiderül, hogy valami nem jó... Mondjuk ez az én hülyeségem, mert választhattam volna egyszerűbb kiindulási adatokat, amivel hamarabb kijön az eredmény.
De azért megérte, mert szerintem jó kis makró ez, bár nem valami csinos. Talán egyszer majd beleteszek olyan csicsákat, hogy adattartományok run-time bekérése, hibakezelés, összes lehetséges variáció megkeresése, eredmények felhasználóbarát tálalása, bővebb kommunikáció a user felé, stb. De ezek már az uncsi kategóriába tartoznak, és jelenleg nem prioritás.
Tanítani csak itt a fórumon szoktam néha, példákon keresztül.
Nálam nem jól működik ez a kiemelés. Csakis madbazsi nevét akartam félkövérrel írni, ezt az egy szót tettem b-k közé. Már egy előző hozzászólásnál is az első b-től végig kiemelt. Valamivel fel kell oldani a hatását?
Nem szükséges. Eleinte arra gondoltam, hogy az egyforma értékeket azonos színnel jelölöm. Ha például a keresett összeg úgy jön ki, hogy 11 + 15 + 31, és 11-esből van 7 db, 15-ösből meg 3 db, akkor erre fel kellene hívnom a felhasználó figyelmét. De ha mindent pirosra festek, akkor azt fogja hinni, hogy 7 + 3 + 1 = 11 db számot kell összeadni a végösszeghez. Tehát az volt az elképzelés, hogy a 11-esek legyenek kékre festve, a 15-ösök meg zöldre. Aztán a végén már nem volt türelmem beletenni azt a plusz ciklust, amíg az összes 11-est meg az összes 15-öst megkeresi.
Köszi :) De nem nagy ügy, csak a vezérfonalat kellett megtalálni.
"Villámgyorsan végzett a számításokkal, 86 lépésben."
Hát ez attól függ. A makró számokat nagyság szerint emelkedő sorba állítva adja össze. Ha az összeged elemei a sor elején vannak, akkor viszonylag hamar megtalálhatja őket. Ha a végén, akkor tovább tarthat.
További problémák, ami a tesztelés során derültek ki: - ha több megoldás van, csak az elsőt jelzi ki - ha a megoldás sok értéket tartalmaz, előfordulhat, hogy a végén valamelyiket fehér színnel jelzi ki, tehát nem lesz megkülönböztethető a hulladéktól.
2 tizedes értékeket vittem be, saját randomokkal. A C3-ba 12 db A oszlopbeli érték összegét adtam meg. Villámgyorsan végzett a számításokkal, 86 lépésben.
A C3-hoz hozzáadtam még 3 számot az A oszlopból. Itt már mértem az időt, 0:00:08!, a lépések száma 10.235 lett.
For sor = 2 To usor If Cells(sor, 5) >= kezd And Cells(sor, 5) <= zar Then For oszlop = 1 To 5 Sheets(2).Cells(sor_1, oszlop) = Cells(sor, oszlop) Next sor_1 = sor_1 + 1 End If Next End Sub
Lefuttattam a 791-es hsz-ben látható adatokon, kb. 75 perc alatt 130874875 lépésből az jött ki, hogy nincs egyezés. Ha ez a teljes adatsorod volt, akkor vagy tényleg nincs egyezés, vagy nem jó a program...
Feltöltöttem két képet. Igyekszem elmondani, mit szeretnék. Az 1-es munkalapon van egy táblázat, benne számlák. A második munkalapon pedig ki lehet íratni, hogy adott időszakban mennyi lett kifizetve. Amit szeretnék az az, hogy legyen egy gomb, aminek a klikk eseménye (remélem jól írom) az, hogy átmásolja és beilleszti azokat a sorokat, amelyek tartalmazzák az adott időszak számláit (és így lehetne látni, hogy miből is áll össze a szumma összeg). A mellékelt képen a gomb még semmit nem csinál és a számlákat tartalmazó sorokat is én másoltam oda, hogy lehessen látni mit is szeretnék. Előre is köszönöm, ha tudsz/tudtok adni egy olyan kódot, amit hozzá tudnék rendelni a gombhoz.
Sub kombi() Dim Rng As Range, hit As Range Dim ix As Long, Lvl As Long, Cnt As Long, iter As Long Dim LvlAct, LvlSel Dim BaseSum As Double, TestSum As Double Dim Dest As Double, small_ix As Double
Dest = Range("c3") Set Rng = Range("A3:A29") Cnt = Rng.Cells.Count ReDim LvlAct(1 To Cnt) ReDim LvlSel(1 To Cnt)
For ix = 1 To Cnt LvlAct(ix) = ix LvlSel(ix) = 0 Next
Lvl = 1 Do iter = iter + 1 Application.StatusBar = iter small_ix = Application.WorksheetFunction.Small(Rng, LvlAct(Lvl)) TestSum = BaseSum + small_ix If (Round(TestSum, 5) < Round(Dest, 5)) Then If LvlAct(Lvl) < Cnt Then LvlSel(Lvl) = small_ix BaseSum = BaseSum + LvlSel(Lvl) Lvl = Lvl + 1 LvlAct(Lvl) = LvlAct(Lvl - 1) + 1 ElseIf LvlAct(Lvl) = Cnt Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 End If ElseIf (Round(TestSum, 5) > Round(Dest, 5)) Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 ElseIf (Round(TestSum, 5) = Round(Dest, 5)) Then MsgBox "heuréka" For ix = 1 To Cnt If LvlSel(ix) = 0 Then Exit For Set hit = Rng.Find(what:=LvlSel(ix), lookat:=xlWhole, LookIn:=xlValues) If hit Is Nothing Then MsgBox "bibi van" Stop Else hit.Interior.ColorIndex = ix + 2 End If Next Set hit = Rng.Find(what:=small_ix, lookat:=xlWhole, LookIn:=xlValues) If hit Is Nothing Then MsgBox "bibi van" Stop Else hit.Interior.ColorIndex = ix + 2 End If Application.StatusBar = False Exit Sub End If Loop End Sub
Fordíts különös figyelmet a vastag betűkkel kiemelt részekre:
1) a C3 cellahivatkozás a keresett összeg, az A3:A29 a lehetséges értékek tartománya. Ezeket módosítsd, ahogy neked kell.
2) a Round() függvény alkalmazását azért építettem be, mert a makró tesztelése során, tizedes tört értékek esetén rendszeresen előfordult, hogy amikor a program futása arra a pontra ér, hogy éppen a megfelelő számokat vizsgálja, és azok összegének meg kellene egyezni a keresett végösszeggel, mégsem egyeznek meg, hanem valahol a 10. tizedesjegy környékén eltérés van, és így a keresés eredménytelen lesz. Ha tudod, hogy az értékeid legfeljebb hány tizedesjegyet tartalmaznak, azt írd be a makróban az összes Round 2. paraméterének.
A makró a korábban említett Brute Force módszer kicsit intelligensebb változatát használja, tehát lényegében elkezdi sorra venni a lehetséges kombinációkat. Ez azt jelenti, hogy ha a bemeneti adatok száma néhánnyal megnő, akkor a futási idő akár nagyságrendet is emelkedhet. Érdemes tehát minden lehetséges módon lecsökkenteni a bemeneti adatok számát. (pl. számlák dátum szerinti szűrésével)
Ha a program nem talál egyezést, akkor hibaüzenettel fog leállni. Ha talál, akkor a megtalált értékek celláit különböző színekkel kifesti. Menet közben a Statusbar jelzi, hogy hányadik kombinációnál járunk. (Erre igazából nincs szükség, csak azért tettem bele, hogy lássuk, valamit csinál a program, és nem csak lefagyott az Excel.)
Természetesen, ha egy adott összeg több helyen is szerepel, akkor a program nem fogja tudni, hogy melyik utalás az igazi.
Egyéb apró hibák is lehetnek benne. Alkalmazása csak saját felelősségedre.
A kimutatásodban kattints az dátumot tartalmazó címre. Adatok/Tagolás és részletek/Csoportba foglalás. Add meg a kezdő, és záró dátumot, a felkínált listában jelöld be a napokat. A két szélső érték közötti napokat részletesen mutatja majd, a többit összefoglalva, pl. >2010.06.30.
Nos, az igazság az, hogy az exceles ismereteim nem túl szerteágazóak, így fogalmam sincs mi az a pivot. Azonban úgy érzem, érdemes utánaolvasnom a témának :) Ha nem boldogulok vele, akkor jövök és kérdezek. Köszönöm!
Felétételezem, hogy az általad írt "kimutatás" tényleg kimutatástábla (pivot)
Azért támadtak ezzel kapcsolatban kétségeim, mert ha az tényleg kimutatástábla, akkor miéárt nem húzkodod össze úgy, hogy a részleteket látni lehessen?
Forró délutánt kívánok a tisztelt Fórumozóknak! A következő probléma megoldásában kérném a segítségeteket. Adott két munkalap. Az egyiken táblázat, a másikon egy kimutatás. A táblázatban számlák szerepelnek a hozzájuk tartozó kifizetési időpontokkal. Azt már sikerült megoldani, hogy ha a kimutatás oldalon megadok egy idő intervallumot, akkor kiírja, hogy adott időszakban összesen mennyi lett kifizetve. Viszont szeretném ha nem csak egy szumma összeget lehetne látni, hanem azt is, milyen tételekből áll össze a végeredmény. Hogyan lehetne megoldani, hogy amikor megadom a –tól –ig dátumokat, akkor automatikusan felsorolja azokat a tételeket, amelyek az adott időszakban lettek fizetve? Előre is hálásan köszönöm a javaslatokat, ötleteket.
Madbazsi itt vagy még? Most jött egy ötletem, hogy hogy lehet esetleg egyszerűbben megoldani a problémát, lehet a jövőhét elején rá tudok szánni egy v. két órát a kisérletezgetésre.
Nem, mert a 11527-ben pont azt írod, hogy a feltételeket össze kell szorozni. Az én - nagy sokaságon futtatott - tesztjeim viszont azt mutatják, hogy jobb ha nem szorozgatunk a SUMPRODUCT-on belül, hanem odaadjuk neki a számolás minden elemét önálló vektorként.
Persze azt se felejtsük el, hogy 1 millió rekord esetén is csak tizedmásodpercekről beszélünk ;-)