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.
Tényleg nem tölti ki. Igazad van. Azért írtam azt, mert vannak terjedelmes táblázataim, és úgy emlékszem párszor bosszankodtam amiatt, hogy szűrt oszlopokban duplán kattintottam a cell ajobb alsó sarkára, és az egészet beképletezte, tehát azt is ami nem látszott a szűrés miatt.
Ha egérrel végighúzod, akkor a szűrt sorokat ki kell hagynia. Ha duplán kattintassz a cella jobb alsó sarkára, akkor nem hagyja ki a szűrt sorokat és tölti fel az oszlopot.
most próbálgattam egy test file-on...és előszörre rosszul csinálta, mindenhova bemásolta oda is ahova nem kértem...
Másodszorra viszont már jól...
Több dolog is úgy működik, hogy elsőre nem csinálja jól...pl a filterezett adatok átmásolását és másik lapra....viszi az egészet a filterezett helyett.
De ezt is csak elsőre csinálja rosszul, aztán már jól..
tényleg mondja meg valaki, hogy én csinálok valamit rosszul, vagy mi van...
kéne tudnom, mielőtt valami nagy bonyodalmat okozok...
Normális dolog, hogy ha szűrő van bekapcsolva és úgy copyzom (lehúzom) a beírt dolgot, hogy az aktuálisan meg nem jelenő cellákban is átírja az adatot?
Remélem lehet érteni mire gondolok...
Pl.
Az oszlopban beállítom, hogy csak a borok legyen láthatok...mellé szeretném írni az egység árat...copyzom az árat lehúzással (vagy kattintással a jobb alsó sarokban) és nem csak a bor mellé írja be ezt az árat, de pl. a tejhez is...ennek nem szabadna történnie.
Vagy pl. törlök megszűrt sorokat és azt is törli, ami közte volt és épp nem szerepelt a filterben.
Pl. nem akarom, hogy a borok is benn elegyenek a listában...filter be, kijelölöm a sorokat és törlöm őket...erre azt is törli ami közöttük volt, pl tej...
MIÉRT?????????
Lécci, világosítsatok fel, ha valami nagyon butát csinálok...mert egyszer ebből nagy probláma lehet...
tényleg mondja meg valaki, hogy én csinálok valamit rosszul, vagy mi van...
kéne tudnom, mielőtt valami nagy bonyodalmat okozok...
Normális dolog, hogy ha szűrő van bekapcsolva és úgy copyzom (lehúzom) a beírt dolgot, hogy az aktuálisan meg nem jelenő cellákban is átírja az adatot?
Remélem lehet érteni mire gondolok...
Pl.
Az oszlopban beállítom, hogy csak a borok legyen láthatok...mellé szeretném írni az egység árat...copyzom az árat lehúzással (vagy kattintással a jobb alsó sarokban) és nem csak a bor mellé írja be ezt az árat, de pl. a tejhez is...ennek nem szabadna történnie.
Vagy pl. törlök megszűrt sorokat és azt is törli, ami közte volt és épp nem szerepelt a filterben.
Pl. nem akarom, hogy a borok is benn elegyenek a listában...filter be, kijelölöm a sorokat és törlöm őket...erre azt is törli ami közöttük volt, pl tej...
MIÉRT?????????
Lécci, világosítsatok fel, ha valami nagyon butát csinálok...mert egyszer ebből nagy probláma lehet...
Const FullName As String = "C:tempproba.txt" Open FullName For Append Access Read Write As #1 Write #1, ActiveCell.Value Close #1
a proba.txt-be az aktuális cellában szereplő szöveg kerül, de a szöveg előtt és után van "-jel, amit nem szeretnék a file-ba írni.
De más bajom is van. Szeretném az aktuális dátumot lekérdezni makróból, de nem találtam hozzá függvényt, sem az Application.WorksheetFunction-ban, sem máshol. Ha makróban rögzítem a Today függvényt, akkor ActiveCell.FormulaR1C1 = "=TODAY()" lesz a makróban, de én nem cellába szeretném írni a képletet, egyszerűen csak String-be szeretném visszakapni a makró futtatásakor érvényes dátumot.
Ha már az utolsó sort sikerült megtalálnod, onnan felfelé indítanék egy for-next ciklust (step -1). A cella adatának hosszát (len) vizsgáltatnám, és azt, hogy nem nulla-e az értéke. Amikor egyik feltétel sem igaz, az akkori aktuális sorszámig jelöltetném ki a nyomtatási területet.
Sziasztok! Megint a segítségeteket szeretném kérni!
Egy könyvtárban szövegfile-ok vannak, egy Excel táblázatban pedig az adatok vannak, amiket a file-okba szeretnék írni szöveges formátumban. A táblázat minden sora más-más file-ba kerül. Ha adott nevű file nincs a megadott könyvtárban, akkor létrehozom és beírom az adatsort, ha van ilyen file, akkor a végére szúrom a sort. Több problémám is van. Hogyan nyitom meg úgy a file-t, hogy olvasni és írni is tudjak bele, de a tartalma ne vesszen el, illetve hogyan lehet szöveget beírni file-ba, hogy az idézőjelek (") ne jelenjenek meg a szöveg előtt és után?
Kozben sikerult megoldani a gondot, viszont mivel vannak sorok amelyek kepleteket tartalmaznak es ezek sorok soha nem uresek, mivel alapertelmezetten is 0-at tartalmaznak. Ugy kellene, h ures soroknak szamitsanak azok amelyek csak 0-kat tartalmaznak.
Egy excel sablont keszitek, amihez szuksegem lenne egy funkciora, ami nyomtataskor automatikusan a legutolso adatot tartalmazo sorig nyomtatja a dokumentumot.
Talaltam ra egy makrot egy angol nyelvu oldalon, de nem sikerul futtatni, illetve nem latom, h segite. A 80ig nyomtatna, annak ellenere, hogy adat csak az elso nehany sorban van.
A makro a kovetkezo:
Sub Set_Print_Area() Dim x As Long, lastCell As Range x = ActiveSheet.UsedRange.Columns.Count Set lastCell = Cells.SpecialCells(xlCellTypeLastCell) ActiveSheet.PageSetup.PrintArea = Range(Cells(1, 1), lastCell).Address End Sub
Ha 80. sor utan irok adatot es ujra futtatom a makrot, akkor tuvabbugrik a kijeloles, amennyiben ujra futtatom a makrot. Megoldhato, h automatikusan erzekelje az uj adatok bevitelet es ne kelljen ujrafuttatni a makrot?
Lenne 2 kérdésem, hátha tud valaki segíteni. Please!
Az új excelről van szó.
1. Ha szűröm az adataimat és úgy copy-zok valamit az oszlopban (jobb alsó csücsök lehúz, vagy kattint), akkor oda is bemásolja a dologat, ami nincs is szűrve. Ezt nem csinálta a régi verzió. Ti is találkoztatok ezzel?
2. Szintén szűrésnél, ha a szűrött adatokat szeretném átmásolni egy másik lapra, akkor visz mindent, pedig nekem csak a szűrött kell...ezt csinálta először, aztán, ha már szűrést állítok be akkor már működik...nem értem miért csinálja ezt.
Egy régebbi ecxel fájlban egy ábra és a következő beállítás található: "=BEÁGYAZ("OrgPlusWOPX.4";"")". Azt szeretném megkérdezni, hogy tudja-e valaki, hogyan lehet ezt szerkeszteni, ill. mit kell beállítani, esetleg telepíteni ennek érdekében?
A magyar verzióban van egy elég bosszantó hiba (anno úgy emlékszem elmondta egy tanár, hogyan lehet megoldani, de sajnos nem emlékszem már rá) Miután kiválasztottad az INT-et, a korlátozó feltétel mezőbe írj be egy tetszőleges számot pl. 0-t. A számot semmire se használja, legfeljebb nem kapsz hibajelzést.
Ha már itt járok, akkor egy kérdés, méghozzá Excel/Solver témában...
A magyar verzióban van egy elég bosszantó hiba (anno úgy emlékszem elmondta egy tanár, hogyan lehet megoldani, de sajnos nem emlékszem már rá)
A probléma:
Ha solverben hozzáadsz 'korlátozó feltétel'-t, akkor beállítható a :
Cellahivatkozás; =<>intbin ; Korlátozó feltétel
Ez nagyszerűen működik is, kivéve az INT-et. Ha kiválasztod, hogy a 'módosuló celláid' csak egész számok lehetnek, akkor a Solver automatikusan kitölti: módosuló cellák ; int ; egész érték ; Az Ok gombra kattintva azonban közli: "A korlátozó feltétel szám, egyszerű hivatkozás vagy numerikus értéket adó képlet lehet."
Angol verzióban úgy emlékszem nincs ilyen probléma, és úgy rémlik valahogy a magyarban is meg lehet oldani a problémát....
a 2007-et nem ismerem, de az előzőekben ott a közös használat opció. (eszközök menü)
Ebben az esetben egyszerre nyithatják meg többen a fájlt, és szerkeszthetik is. A tábla minden mentésnél "update"-lődik, azaz a user által beírt adatok bekerülnek a fájlba. (az már csak hangulat kérdése, hogy a user milyen gyakorisággal nyomja meg a ctrl+s (mentés), avagy az automatikus mentést alacsony értékre állítod) Abban az esetben, ha véletlenül ugyanabba a cellába 2 user mást-mást írt be, akkor feldobja a kérdést, hogy melyik verziót mentse. Nálam nagyszerűen működik 3 kollegína is dolgozik benne aktívan, egyszerre. (alapvetően megvannak az egyes 'területekért' felelős emberkék - némi átfedéssel) A makrókkal vigyázni kell, nem mindegyik akar futni közös használatban, de azért egy csomó dolgot le lehet makrózni...
Én nagyon szeretem, a kollégáim már kevésbé... :D Ugyanis visszamenőleg akár 30 napra is logolva van: ki, mikor, melyik cellát, milyen értékről, milyen értékre módosította....
és folyamatos szinkronizálásra van lehetőség? A lényeg nem is az, hogy egyszerre írnak a táblázatba, hanem hogy több gépen meg van nyitva az excel, és néha-néha beleírnak dolgokat. Szóval nem folyamatos egyszerre írás lenne...
Olyan kérdésem lenne, hogy van egy excel (excel 2007) táblázat, melyet szeretnénk egy időben több gépről egyszerre szerkeszteni. Hogyan oldható ez meg?
Azt nem tudom, hogyan csökkenthetnéd, viszont a Gyorselérési eszköztárra ki tudod tenni azokat az ikonokat, amiket sűrűn használsz. A gyors...-on jobb klikk, kiválasztod a testreszabást. Ott bejelölheted, hogy ez az eszköztár a menüszalag alatt (kéznél) legyen.
Tettem ki a saját kis makróim közül is párat, de sehol sem találom, hogy lehetne módosítani az ikonok rajzát, így mindegyik egyforma képet mutat. Nem is használom ezt a 2007-et, csak ha muszáj. A rongyos régi verziókban úgy alakítottam az ikonokat, ahogy akartam (bizonyos határokon belül).
A makróimat úgy tettem ki, hogy a "Választható parancsok helye" legördülőből kiválasztottam a makrókat.
Hát, nekem agyamra megy ez a verzió, de lassan kezdem megszokni.
Persze, hogy nagyobb kihívás elé állítsam magam még ráadásul angolul installáltam, mert miért ne...nekem ez nem jelenthet problámát, tök mindegy milyen nyelven van...
Aztán legszívesebben falhoz vágtam volna a gépet, mikor egy szaros rutin dolgot tök hosszú ideig csináltam, mert nem találtam mi hol van...
És esetleg nem jöttél rá arra, hogyan lehetne "személyre szabni" ezt az ikon hegyet, amiből nekem kb csak 10-re lenne szükségem a 100 helyett?
Annyira jó ötlet lett volna tőlük, ha ilyet is kitalálnak.
Kiválasztod az Excel (vagy milyen) gombot, jobbra lent Az Excel beállításai, balra fent Népszerű elemek, jobbra középen az Új munkafüzet létrehozása csoportban a Használandó betűtípus.
Ugyanitt a betű mérete, a lapok száma, és az alapértelmezett nézet is megadható.
Tényleg észbontó ez az új felület.
A helyesírás ellenőrzését a például a NYELVI !!! beállításoknál találod.
Nekem tegnap még annak tűnt... Ez is frappáns megoldás, az igaz!
Egyébként, inkább érdekes, hogy a pontosvesszővel tagolt *.csv fájlokat az excel alapból „felismeri”, simán megnyitja, beimportálja, de ha ezt rögzítem markróba, már nem jól csinálja, egy oszlopba teszi az összes adatot… Mindegy, már van három jó megoldás a problémára.
Belekontárkodom egy kicsit csak annyit hozzászólva, hogy én régebben csináltam ilyet úgy, hogy megnyitottam a csv-t és szövegből oszlopok funkcióval szédaraboltam. Simán makróba is rögzítettem akkor.
Nekem a vesszőknél vágja a sorokat, bármit is állítok be a Workbooks.OpenText függvénynél a DataType:=xlDelimited beállítás mellett. Elvileg (illetve dehogy elvileg, a help szerint) néhány elválasztó karaktert alapból be lehet állítani, illetve az Other és OtherChar mezőkben bármi megadható lenne elválasztó karakternek, pont mint a szövegfile megnyitásnál, mikor tagolt adattípus opciót választunk. Sajnos ez nem működik, talán valamit még be kell állítani, hogy ne íródjon felül az alapból beállítottal amit mi adunk meg elválasztó karakternek, vagy csak hibás az Excel, esetleg a magyarítás során került bele ez a hiba.
A makró berántja a szövegfile-t, majd a vesszők helyén újra összefűzi a sorokat, végül egyesével megkeresi a pontosvesszőket és aszerint darabolja a sorokat cellákba. De nem jól működik, ha több vessző is van egyás mellett. Ha nálad ilyen előfordul, akkor töprengek még kicsit ezen.
Találtam két különböző megoldást a pontosvesszővel tagolt *.CSV fájlok megnyitására, gondoltam, hátha valakinek még hasznos lehet:
1.)
Sub CSVFájlMegnyitás1()
Open "ide jön a fájl neve az eléréssel együtt" For Input As #1 sor = 1 Do Until EOF(1) Line Input #1, adat cellak = Split(adat, ";") For oszlop = 0 To UBound(cellak) Cells(sor, oszlop + 1) = cellak(oszlop) Next sor = sor + 1 Loop Close 1
End Sub
2.)
2.1.) Makró rögzítéssel - Adatok - Külső adatok importálása - Adatok beolvasása - Fájltípus: szövegfájlok - a szövegbeolvasó varázslóval a szükséges beállítások 2.2.) Az eredémény eljárást egy kicsit átalakítva:
Sub CSVFájlMegnyitás2() Dim MRCSVElérés As String ' ez nincs a rögzített eljárásban
MRCSVElérés = "TEXT;" & "ide jön a fájl neve az eléréssel együtt"
'Szövegfile beolvasása On Error Resume Next Workbooks.OpenText Filename:=FullName, DataType:=xlDelimited, Semicolon:=True If Err.Number > 0 Then MsgBox "Nem sikerült megnyitni " & Chr(34) & FullName & Chr(34) & _ " file-t." & Chr(10) & "Hiba (" & Err.Number & "): " & Err.Description, _ vbCritical Exit Sub End If
'Ha az Excel jól működne, akkor idáig tartana a makró :-)) 'de mert bugzik, kézzel kell a sorokat a cellákba tördelni
Dim i As Long, j As Long Dim StartPos As Integer, EndPos As Integer, sor As String Dim LastCell As Range, LastRow As Long With ActiveWorkbook.ActiveSheet Set LastCell = .Cells(1, 1).SpecialCells(xlLastCell) LastRow = LastCell.Row For i = 1 To LastRow sor = .Cells(i, 1) j = 2 While Len(.Cells(i, j)) > 0 sor = sor & "," & .Cells(i, j) j = j + 1 Wend .Cells(i, 1) = sor Next i Range(.Columns(2), .Columns(LastCell.Column)).Delete For i = 1 To LastRow StartPos = 1 EndPos = 0 j = 1 sor = .Cells(i, 1) Do EndPos = Application.WorksheetFunction.Search(";", sor, StartPos) .Cells(i, j) = Mid(sor, StartPos, EndPos - StartPos) j = j + 1 StartPos = EndPos + 1 Loop Until Err.Number > 0 .Cells(i, j - 1) = Right(sor, Len(sor) - StartPos + 1) Err.Clear Next i End With On Error GoTo 0
'Szövegfile beolvasása On Error Resume Next Workbooks.OpenText Filename:=FullName, DataType:=xlDelimited, Semicolon:=True If Err.Number > 0 Then MsgBox "Nem sikerült megnyitni " & Chr(34) & FullName & Chr(34) & _ " file-t." & Chr(10) & "Hiba (" & Err.Number & "): " & Err.Description, _ vbCritical Exit Sub End If
'Ha az Excel jól működne, akkor idáig tartana a makró :-)) 'de mert bugzik, kézzel kell a sorokat a cellákba tördelni
Dim i As Long, j As Long Dim StartPos As Integer, EndPos As Integer, sor As String Dim LastCell As Range, LastRow As Long With ActiveWorkbook.ActiveSheet Set LastCell = .Cells(1, 1).SpecialCells(xlLastCell) LastRow = LastCell.Row For i = 1 To LastRow sor = .Cells(i, 1) j = 2 While Len(.Cells(i, j)) > 0 sor = sor & "," & .Cells(i, j) j = j + 1 Wend StartPos = 1 EndPos = 0 j = 1 Do EndPos = Application.WorksheetFunction.Search(";", sor, StartPos) .Cells(i, j) = Mid(sor, StartPos, EndPos - StartPos) j = j + 1 StartPos = EndPos + 1 Loop Until Err.Number > 0 .Cells(i, j - 1) = Right(sor, Len(sor) - StartPos + 1) Err.Clear Next i End With On Error GoTo 0
Segítséget szeretnék kérni, makróból történő pontosvesszővel (;) tagolt *.csv fálj megnyitásában. A makrórögzítővel hiába rögzítem, nem működik... Hogy lehet ezt frappánsan megoldani?
De itt egy egyszerűbb, ez is így csinál: =HA(B2=1;INDEX(A:A;HOL.VAN(1;B:B;0);1);0) Az első sorban legyen vmi oszlopcím, és a második sortól kell a fenti képlet.
A oszlopban számok, ha B oszlopban 1 előfordul, akkor C oszlopban az a szám kellene, ami A- ban volt akkor, amikor B ben az 1 először előfordult. Ez folyamatosan mindaddig amíg B ben folyamatosan 1 van egymás után.
Egyszerű logika ez, de most valahogy nem akar eszembe jutni. Valószínű hasonlóan lehetne, mint az előzőt.
Asszem találtam egy hibát az Excelben. Ha egy objektum/vezérlő (pl. Gomb) formázásánál bejelöljük "Az objektum helye és mérete nem változik" rádiógombot, nem lehet TELJES sikert elérni. :( Ugyanis amikor a TELJES táblát törlöd, egy picit elmozdul az 1. sor irányába az objektum. Igaz, hogy, ha sokszor törölsz "all"-t, az első sor aljánál megáll, de mi van, ha a képernyő közepénél szeretném tartani a gombot??? :(
Magyarpityu válaszához annyit, hogy a PC World 2008. júl-i számában a 118. oldalon Weisz Tamás cikkében megtalálod, hogyan lehet szűkíteni a hosszú listákat.
Az Excel 2000-ben van egy 1000 soros korlát, de csak a legördülő menüre. Azaz ott van a többi is, ha szűkíted a kijelölést és az illeszkedő elemek száma nem nagyobb 1000-nél, akkor az előbb nem látható sorok is megjelennek. Hátha az újabb változatokban már nincs benne ez a korlát...
Akkor jó, mert pont ezt csinálja amit robbantómester írt :))
Lássuk csak, hogyan is van ez!
B1: ==HA(A1=-5;1;0) tehát az első cellát beállítjuk 1-re vagy 0-ra aszerint, hogy A1-ben -5 volt-e vagy sem
B2: =HA(A2=-5;1;HA(A2=2;0;B1)) vadászunk a -5-re, ha találtunk az A oszlop aktuális cellájában, akkor hurrá, legyen ott B-ben 1, ha nem, akkor nézzük, nem 2 van-e A-ban, mert akkor 0 lesz B-ben. Ha sem -5-öt, sem 2-t nem találtunk, akkor megismétli a felette álló értéket, tehát 0-t ha a legutóbbi 2 óta nem volt -5, vagy 1-et, ha a legutóbbi -5 óta nem volt 2.
ha vannak a következő számok az A oszlopban, akkor csak a pirosaknál legyen 1 a B oszlopban. Akkor is ha teljesen más számokkal kezdődik A oszlop. Ez akkor is működjön, az 1 et akkor is mutassa, ha később újra bekövetkezik az esemény. Tehát akkor legyen B oszlopban 1, ha talál egy -5 öt és utánna folyamatosan mutasson 1 et addig míg 2 -őt nem talál A oszlopban.
utána ne legyen 1 megint míg újra -5 nem jön. De ha jön legyen B oszlopban mindaddig 1, míg újra 2 őt nem talál A oszlopban.
Sziasztok, még egy kis változtatásra lenne szükségem,
Ha A oszlopban a számok következő képpen vannak.
5
6
7
4
3
-5
-6
-7
-8
-4
-3
-4
-3
-2
-1
-0
1
2
szóval olyan függvényt szeretnék megalkotni, ami egyet ad eredményül minden sorban, ha észleli -5 öt, lásd piros számok. Mindaddig egyet ad eredményül, míg 2 vel nem találkozik. Nem baj, ha a számok -5 alá csökkennek még pl -6 -7 -8 esetében, vagy nem folyamatosan nőnek, pl -4 után -3 következik, majd újra -4 és aztán emelkedik 2 ig
Van egy gondom ismét :)) A UserForm_Initialize függvényben beállítgatok dolgokat és, hogy amíg a ListBox-ok nincsenek feltötlve, ne hívódjanak meg a ListBox-ok Change eseménykezelői, tiltom az eseményeket az Application.EnableEvents = False utasítással. Azaz csak tiltanám, mert ennek ellenére ahogy soronként töltöm a ListBox-okat, minden új .Add hívás után meghívódik a _Change metódus is. Vajon mit rontottam el?
A számok legyenek az A oszlopban, akkor B oszlop első cellája legyen B1: =HA(A1=-5;1;0) a további cellák pedig B2: =HA(A2=-5;1;HA(ÉS(A2>A1;B1=1);1;0)) B2-t kell végighúzni A oszlop utolsó eleméig.
Szeretném a segítségeteket kérni. Van egy Excel táblázatom, amiben szerepen több, mint 4000 sor. Azokat a sorokat szeretném elmenteni / kigyűjteni, amiknek egy adott oszlopban az érték kisebb, mint 0. Adjatok tanácsot légyszi, hogy hogy csinálhatnám ezt meg!
Egy HA kritériumot szeretnék elkészíteni, de ez nem olyan egyszerű, egy kicsit furfangos.
=HA(ÉS(A3<-5;A3>A2);1;0)
Ez lenne a képlet, de nekem ez így nem jó. Itt ugye arról van szó, hogy ha A2 és A3 A2 höz képest emelkedik, akkor HA függvény eredménye 1, de ugyanakkor az emelkedés -5 től induljon.
Igen ám ez mind szép és jó, csak én azt szeretném, hogy ha a vizsgált számok között az emelkedés tovább tart, akármeddig, akkor is IGAZ at adjon a képlet, tehát jelen esetben 1 et eredményül.
Tehát a képlet az A oszlopban szereplő számok közül adja azokat, amelyeknek eredménye mondjuk -5 óta folyamatosan emelkedik. De az emelkedést csak -5 től kezdje és kövesse nyomon mindadig, amíg tart.
Tehát ha a számok A oszlopban következők
1
5
6
7
8
4
3
-4
-3
-5
-4
-3
-2
-1
0
1
2
Akkor csak a piros számoknál adjon a HA függvén 1 et eredményül. 5 6 7 8 esetében nem, mert itt az emelkedés nem -5 nél kezdődik, nem számít,hogy ezek is egymás után emelkednek.
A szám kétjegyűvé varázslásának ötletet Delila adta. Mindketten benne voltunk :))
Function Szamsor() As String Const MaxElem As Integer = 20 'Véletlen szám tartománya: 1 .. MaxElem Const ElemDb As Integer = 8 'Ennyi számot írunk egy cellába Dim Lista(MaxElem) As Integer Dim i As Integer, j As Integer i = 0 While i < ElemDb j = Int(MaxElem * Rnd + 1) If Lista(j) = 0 Then Lista(j) = 1 i = i + 1 End If Wend For i = 1 To MaxElem If Lista(i) = 1 Then Szamsor = Szamsor & Right("0" & i, 2) & " " Next i Szamsor = Left(Szamsor, Len(Szamsor) - 5) End Function
Delila1 tényleg Magyarpityu segített, de neked is köszi, azért te is nagyon sok jót írtál hozzá.
Most már eljutottunk odáig, hogy van egy makró arra, hogy véletlenszerűen adjon számokat egy bizonyos választékból, jelen esetben 1-20 ig. Csak meghatározott dababszámú legyen ez a véletlen szám, tehát jelen esetben 8 db. Ráadásul nincs ismétlődés a véletlen számok közöt
Most már csak arra lenne szükség, hogy ezek a véletlen számok emelkedő sorrendben jelenjenek meg.
A kész makrót tartalmazó munkafüzetet elmentettem bővítményként az Office megfelelő mappájába. Az Excelben látszik is, a bővítménykezelő ablakában, de, ha kiválasztom, nem történik semmi. :(
Ha nem akarod kézzel kiválasztani a tartományt, akkor lehet fejleszteni még annyit rajta, hogy a 4. sortól az utolsóig válassza ki magától. (ahogy Delila írta lentebb: ucso = Range("B65536").End(xlUp).Row) És akkor már ciklus nélkül is meg lehet csinálni, ami sokkal gyorsabb.
Sub feleslegessor() ucso = Range("B65536").End(xlUp).Row sor = 4 Do If Cells(sor, 2) = "" Or Cells(sor, 2) = "törlendő" Then Cells(sor, 2).Delete shift:=xlUp sor = sor - 1 ucso = ucso - 1 End If sor = sor + 1 Loop While sor < ucso End Sub
A Szamsor makró nem Sub, hanem Function, ilyenkor nem kell a cellába írással foglalkozni, mert a cellában a makró visszatérési értéke megjelenik. Ezért ad vissza Szamsor String típust. Lérte kell hozni egy modult a VBAProjekt alatt, idemásolni a makrót, ezután a Szamsor függvény neve megjelenik a Függvény beillesztése ablakban és úgy használható, mint bármelyik másik függvény.
Hogy lehet azt elérni, hogy az eredmény 01 vagy 02 vagy 03 és így tovább legyen. Nem formátumon keresztül. Nekem nem a formátum a lényeg, hanem hogy a későbbiekben más képletek 01 vagy 02 stb formátumú szöveggeket tudjanak használni és ezekkel más műveleteket elvégezni.
=SZÖVEG(KEREK(VÉL()*(20-1)+1;0);"00")
ennek az eredménye a számodra szükséges szöveg (nem szám!)
Lehet van egyszerűbb megoldás, de makróval pl. így:
Function Szamsor() As String Const MaxElem As Integer = 20 'Véletlen szám tartománya: 1 .. MaxElem Const ElemDb As Integer = 8 'Ennyi számot írunk egy cellába Dim Lista(MaxElem) As Integer Dim i As Integer, j As Integer i = 0 While i < ElemDb j = Int(MaxElem * Rnd + 1) If Lista(j) = 0 Then Szamsor = Szamsor & Right("0" & j, 2) & " " Lista(j) = 1 i = i + 1 End If Wend Szamsor = Left(Szamsor, Len(Szamsor) - 5) End Function
Azt nem tudom, hogy kellene kiszűrni az egyformákat, csak azt, hogy ha az összefűzendő adatok közé a ; helyett az &-et teszed, a függvényt ki sem kell írni.
1. Ha A oszlopban vannak a véletlen számok (A1 cella tartalma =KEREK(VÉL()*19+1;0) ), akkor B oszlopban kiegészíted nullával, ha kell (B1 cella tartalma =ÖSSZEFŰZ(HA(A1<10;"0";"");A1)
2. Ha egy külön munkalapra kimásolod a számokat, pl Munka1-en A1 = '01 ... A20 = 20, akkor így lesz két számjegyű véletlen szám =INDEX(Munka1!$A$1:$A$20;KEREK(VÉL()*19+1;0))
Ez ugye 0-tól 20 ig ad számokat eredményül véletlenszrűen, sőtt ezeket még kerekíti is 0 számjegyig.
Értelem szerűen 10 alatt az eredmény 1 karakternyi, tehát 1 vagy 2 vagy és így tovább.
Hogy lehet azt elérni, hogy az eredmény 01 vagy 02 vagy 03 és így tovább legyen.
Nem formátumon keresztül.
Nekem nem a formátum a lényeg, hanem hogy a későbbiekben más képletek 01 vagy 02 stb formátumú szöveggeket tudjanak használni és ezekkel más műveleteket elvégezni.
A pontositas miatt meg annyi hogy a 97 es annal oregebbek csak usztak egy jot az eredmenyuk nem szamitott bele a vegeredmenybe. tehat ki kellett gyomlalni a 97, 96... stb szuletetteket de a feladat szempontjabol ez mar nem szamitott, ilyen nem volt sok, azonban a te listadon a 3.dik a 2.dik. es a 7.dik eloreugrik a 6.dik helyre. Ne csodalkozz ha ez lesz kint a honlapjukon ha egyaltalan kijavitjak...
kedves magyarpityu nagyon koszonom a segitseged tokeletes a megoldas sajnos en ott elakadtam hogy egyesitett cellak miatt sirt a rendezesnel.. :) Meg1szer nagyon koszonom
Kapkodok, vigyázat! Fordítva írtam, sorbarendezni először nemek szerint, utána pontszám szerint kell! De Jozsef megoldása szebb, gyorsabb és egyszerűbb kimutatással.
Kicsit reszelni kell a táblázaton: 1. Az oszlopoknak fejlécet kell adni pl. helyzés, Név, idő pontszám stb. Mindegyik oszlopnak legyen neve!!! 2. A versenyszámok sorait töröld ki 50 m. fiú pillangó stb. A nevek tömören egymás után álljanak! 3. Áll bele az adatok közepébe, Adatok/Kimutatás vagy kimutatás diagram menüpont 4. A sorokra húzd rá a nevet, az adatokra a pontszámot, és már kész is vagyunk.
A fenti képletet végigírtam mind az 510 sorba, az összes versenyszám valamennyi versenyzője mellett, így megvan a LEN pontszám. A lányok neve mellé F betűt, a fiúké mellé M betűt írtam az R oszlopba, megvan a nemek szerinti elkülönítés.
Ezután, mivel a versenyszámok elnevezései egyesített cellák és ezek gondot okoznak sorbarendezésnél, megszüntettem itt a cellák közötti egyesítést. Most már nagyságrendbe lehet rendezni a neveket, elsődleges kulcs az összesített pontszám (Q oszlop), másodlagos kulcs a nemek R oszlopa. Most kész a lista, szüntessük meg az ismétlődéseket!
S oszlopba ez kerül: =HA(D4=D3;"";"OK") ,vagyis minden név első előfordulása mellett megjelenik az OK felirat. Most leszűrök OK-ra és az eredményt kimásolom egy új lapra.
Sajnos nem jovok ra mivel egy nev tobbszor szerepel hogy tudom sorbarendezni (jelzem tok laikus vagyok excel ugyben) es mar belefaradtam egy kicsit ...
Annyit haladtam . hogy =SZUMHA($D$4:$D$509;D4;$P$4:$P$509) fuggvennyel mindenki neve melle sikerult kiiratnom az osszesitett eredmenyet de sajnos nem sikerul eredmeny szerint sorbarendezni mert egy nev tobbszor fordul elo a tablazatban . Valoszinuleg most mindenki halalra rohogi magat a benasagomon de en teljesen laikus vagyok ehhez.
Jól indultál, de ezt írd a Q oszlopba: =SZUMHA($D$2:$D$509;D4;$P$2:$P$509) Ezt végighúzni minden versenyző neve mellett, majd lányokat-fiúkat különválasztani, végül Q oszlop szerint rendezés és kész.
Van egy excel tabla amiben egy rakas nev mellettuk az elert pontszamok ezeket kell osszeadni az azonos nevhez tartozo pontszamokat es sorba allitani pontszam szerint . Odaig eljutottam hogy alkalmazom a szumha fuggvenyt =szumha(D2:D509;"Mészáros Richárd";P2:P509) de ezzel minden nevet kezzel kell beirni mindig az adott cellara allva es ugye ez megint sok kezi munka amit el tudna vegezni egy program is. Az excel tabla itt talalhato: http://www.dunaferrse.hu oldalon Solymár István Emlékverseny 2008.07.26 EREDMÉNYEK letöltése azaz http://dunaferrse.hu/eredmenyek/eredm.xls
A lanyom is reszt vett ezen a versenyen es sajnos elszamoltak a vegen a LEN pontok alapjan a helyezeset amit ugye szova tettem amire kijavitottak de meg tobb hibat csempesztek be masok rovasara. Gondoltam kuldeni kellene nekik egy scriptet amelyik kiszamolja a sorrendet. Sajnos nem szoktam programozni es tegnap este eddig jutottam , viszont az ido surget mert ma felkuldik az eredmenyeket az orszagos kozpontba (orszagos uszoverseny).
Ha valaki megsugja a legegyszerubb megoldast a feladatra megkoszonom.
Arra gondoltam hogy le kellene valogatni a nveket egy masik tablaba es azt megadni valtozonak az szumha fuggvenynek es utana persze valahogy ki kell iratni nevvel egyutt az eredmenyt megfelelo sorrenbe rendezve.
A NAP(A1) függvény visszaadja az A1 cellában lévő dátum napját, esetedben 2008. július 5-hez az 5-öt. Ha 29-ét írtál volna, akkor 29-et adott volna vissza. A SZÖVEG függvény "nnnn" formátummal ebből a számból képez napot, veszi az érték modulo 7-et és kiírja az ehhez tartozó nevet. Neked nem ez kell, hanem a HÉT.NAPJA(A1) függvény, ami a dátumhoz nem a napot adja vissza, hanem a nap sorszámát :))
Nagyon fircsa dolog történik! Az ufók megszállták a földet? Az A1 tartalma: 2008. július 5. (dátumfotmátum) Az A2 tartalma: =SZÖVEG(NAP(A1);"nnnn") Erre csütörtököt mond! Pedig ez a nap szombatra esett! Jó, meg tudom oldani, ha kettőt hozzádok a napokhoz, de mégis, érthetetlen.
De ezek összefűz függvény eredményei. Az összefűz függvényben HA függvények vannak összefűzve és ott ezek az eredmények "01"&" " és "01"&" " és így tovább ként szerepelnek.
Tehát, ha a feltétel igaz, a függvény kiadja 01 et 02-őt és így tovább plusz mindegyik után még öt szünet jelet, de egy cellában.
Azt hogy lehet megtudni függvénnyel, hogy a fenti egy cellában lévő végeredményben szöveg tartalmaz-e egy adott dolgot, pl 01, vagy 13
Kimutatás web-es importálásához készítek táblázatot. Ennek egyik cellájába már előre megírt html részt kell bemásolni. Az a gond, hogy másolás után a html tagolása szerint nem egy cellába, hanem a felsorolás száma szerinti cellába kerül a szöveg. Hogyan lehetne megoldani, hogy a html szöveg csak egy cellába kerüljön?
Tüneti kezelés, de én azt csinálnám, hogy a kilométeres képletet több részre vágnám, egy-egy cellába csak annyit, amennyi elfér (ha max. 30 lehet, akkor legfeljebb annyit), majd ezeket a cellákat fűzöm össze és kész. 200 szövegdarab összefűzése megoldható 8 cellában (7-ben a képlet részei és a nyolcadikban az előző 7 összefűzve). Esetleg makróval összefűzni a szövegeket, akkor nincs ez a korlát.
A problémám a következő lenne. Több mint 30 függvényt szeretnék összefűzni az összefűz képlettel. A 2003-as excelben maximum csak 30 at lehetett. De rájöttem, hogy a 2007-el már több mint 200-at.
Vagyis lehetne, de nem működik. A következő történik. 2003-as excelben született filet megnyitottam a 2007-essel.
Erre mikor az összefűzést meg akartam ejteni, ezt a kiírást kaptam, ugyanis a 2007-excelem angol.
More arguments have been specified for the funktion then are allowed in the current file format
Persze itt én elmentettem ezt a filet 2007-es excel fielként, de a probléma ennél a filenál is ugyanúgy fenn áll.
Hisztogramot akarok csinálni. De úgy, hogy én határozom meg a rekeszeket. Teszem is, ahogy a Sugó javasolja. De ez a kurva mindig átírja a saját izlése szerint. Állítólag van rá megoldás, hogy az én rekeszeimet töltse fel. De hogyan kell ezt beállítani?
A SZUMHA fügvvénnyel lehet összeadni az egy számlához tartozó összegeket, és a DARABTELIvel megszámlálni az egyforma számlaszámokat, ami az osztó lesz. Célszerű beágyazni egy HA függvénybe az átlagot, hogy ha egy számlán nem volt aznap forgalom, akkor ne kapjál zéróosztó hibát. Remélem, jól értettem a kérdést.
Van egy excel kérdésem, de sajna nem találok rá szép megoldást. Talán Ti tudtok mondani valami okosságot.
Van egy tábla, mely tartalmaz az egyszerűség kedvéért három oszlopot: Nap Számlaszám Ft 1 1 10 1 2 20 2 3 30 3 4 40 3 5 50
Ebből kellene egy kimutatást gyártani úgy, hogy mennyi volt a napi átlag számlánként. Azaz a következőt várnám: Nap ÁtlagFt db ÖsszFt 1 15 2 30 2 30 1 30 3 45 2 90
A nem szép megoldás: az alaptáblába +1 oszlop csupa 1 értékkel. ennek az összesítése, majd ezzel osztom az összFt-t. Majd a részletek eltüntetése. Itt ugyebár a részleteknél nem lesz értelmezhető az átlagFt, csak a napi összesítő sorban. Ha valakit érdekel leírom részletesen.
A makróim többnyire a ThisWorkbook.Activate utasítással kezdődnek, pont azért, hogy mikor pl. egy Excel alá behúzott szövegfile-t nézegetek, akkor is le tudjam futtatni a makrót, ami ilyenkor nem az aktuális file-ban dolgozik, hanem a háttérben üldögélő Excel táblázatban, és az eredmények sem az aktuális file-ba kerülnek, hanem a helyükre. Erre akkor van szükség, ha a makróhoz olyan adat kell, ami csak egy adott helyen van, azokat más file-ban hiába is keresné, vagy ha kifejezetten abba a file-ba kell az eredményeket beírni, amiben a makró van. Ez addig rendben is volt, amíg a makrókat az Excel menüből indítottam, mert ott eleve filenév.xls!makronév formában érhetők el a nem aktuális munkafüzetek makrói. Így ha több megnyitott munkafüzetben van ugyanolyan nevű makró, akkor azok eleve nem keveredhetnek össze, mert azonos nevű file-ok úgysem lehetnek egyszerre nyitva.
Ha tehát menüből olyan makrót szerenék indítani, ami kötődik az adott file-hoz (azaz nem olyan, hogy pl. beszínezi az aktuális cellát), akkor meg kell mondani, melyik példány fusson. Átírom a menüt létrehozó makrót úgy, hogy vizsgálja meg, van-e már kint ilyen menü, ha igen, akkor ne fejezze be a kódot (ahogy most van megírva), hanem az adott menüpont popup legördülő menü legyen, ahol a futó példányok nevei lesznek felsorolva, és onnan kell kiválasztanom, hogy melyik file-ba szeretnék dolgozni. Mikor elkezdtem beírni a hozzászólást, még más ötletem volt, ezt most találtam ki, remek móka lesz megírni, köszi az együtt gondolkodást! :))
Most, hogy a kibővített főmenüből indítom a makróimat, egy új hiba született :(( Ha több munkafüzet is nyitva van ugyanabban az Excel példányban, és ezekben megvannak ezek a makrók (csak az adatok mások), akkor a menüpont nem az éppen aktuális munkafüzet makróját indítja el, hanem azét, amelyik feltette a menüt (amelyiket először nyitottam meg). Most tehát a makróknak csak az a példánya fut, amelyik abban a munkafüzetben van, ami feltette a menüt, és így a makró nem az aktuális munkafüzet adataival számol, hanem az elsőként megnyitottal, mert erre a makróra hivatkozik a menüpont. Marad az Eszközök/Makró/Makrók? Hmm...
Megint a segítségeteket szeretném kérni! Az Excel menüt kibővítettem egy új menüponttal, hogy a saját makróimat közvetlenül a főmenüből indíthassam. Már ott is rezeg a léc, hogy nem tudom, jól írtam-e meg a kódot (jónak tűnik mert megjelenik a menü és elindulnak a makrók, bár elég fura, hogy a menüpontok msoControlButton típusúak, pedig nem is gombok). És vajon az Excel főmenü mindig a CommandBars(1) lesz, vagy névre keressek rá (ami azért veszélyes, mert ha más Excelben más neve van, akkor nem találja meg a makró)?
De nem is ez a fogfájásom. Hanem szeretném csoportosítani a menüpontokat, és itt-ott elválasztó vonalat (separator-t) szeretnék beilleszteni, de nem tudom, azt hogyan kell. Ebbe most eléggé belegabajodam, szóval a kód így néz ki, talán abból világosabb, mit szeretnék:
Sub CreateSajatMenu() Const SajatMenuName As String = "Saját makrók" Dim i As Integer
Dim MainMenu As CommandBar Set MainMenu = CommandBars(1)
Dim MenuPont(5) As String, Menu(5) As CommandBarButton MenuPont(0) = "Első pont" MenuPont(1) = "Második pont" MenuPont(2) = "Harmadik pont" MenuPont(3) = "Negyedik pont" MenuPont(4) = "Ötödik pont"
Dim SajatMenuCommand As CommandBarPopup For Each SajatMenuCommand In MainMenu.Controls If SajatMenuCommand.Caption = SajatMenuName Then Exit Sub Next SajatMenuCommand
Set SajatMenuCommand = MainMenu.Controls.Add(msoControlPopup) With SajatMenuCommand .Caption = SajatMenuName For i = 0 To 4 Set Menu(i) = .Controls.Add(msoControlButton) With Menu(i) .Caption = "&" & MenuPont(i) .OnAction = MenuPont(i) End With Next i End With End Sub
(bocs, ha ideszemeteltem) Szerintetek hogyan kell megoldani, hogy (mondjuk) a második és harmadik pont között legyen egy elválasztó sor?
Azt szeretném megkérdezni, hogy lehet beállítani azt, hogy az Adatok -> Érvényesítés -> Beállítások -> Érvényességi feltétel -> Megengedve: Lista kiválasztásakor a cellára lépve az első listaelem jelenjen meg?
A Munka2 lapon a sárga háttérrel jelzett területnek nevet adsz a Beszúrás/Név/Név megadása menüben (én a termék nevet adtam).
A Munka1 lap A oszlopában kijelölöd a kívánt számú sort, az Adatok/Érvényesítés/Beállítások fülön a Megengedve legördülőből kiválasztod a listát, a Forráshoz pedig beírod: =termék.
A melléklet képen (reményeim szerint) látszik a Munka1 B3 képlete, amit jobbra- és lehúzol addig, ameddig szükséges.
Sok soros táblázatot kellene készítenem, amely némely oszlopában választható legördülő menü kellene, ami alapján ő automatikusan kitölti a vonatkozó cellákat.
Konkrétan: van egy 10*30-as segédtáblázatom (külön munkalapon szeretném tárolni), 10 különféle termék, amelyeknek van 30 tulajdonsága (számok mind).
Azt szeretném, hogy a táblázatomba elég legyen a legördülő menüből kiválasztani mondjuk a 7-es terméket, és ő automatikusan töltse ki a 30 sornyi adatot, ne kelljen mindig bepötyögni.
A lapfülön, amelyik a rendezendő adatokat tartalmazza, jobb klikk, Kód megjelenítése. A VBE jobb oldalán kapott üres lapra másold be:
Sub Worksheet_Change(ByVal Target As Excel.Range) If (Target.Column = 1) Then '*** Ehelyett másold be a rögzített rendezést ******* Selection.Sort Key1:=Range("A2"), Order1:=xlAscending, Header:=xlYes, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom '******************************************** End If End Sub
Itt az If (Target.Column = 1) Then sor az A oszlopba írásra reagál. Ha nem az kell, az 1-et írd át a kérdéses oszlop sorszámára. A ***-ok közötti rész helyére másold be a rögzített rendezést, mert ez csak az A oszlop szerint rendez.
Most tanulgatom az excelt és a következő problémám adódott: Van egy táblázatom tele adatokkal, amiket 3 rendezési elv alapján sorba rendeztem. A kérdésem az, hogy be lehet-e állítani úgy, hogy automatikusan rendezzen a megadott elvek alapján, ha változik a táblában az adat, és ne kelljen mindig minden adat változásnál külön rendezgetni. Hogyan? Köszönöm előre is.
Azt szeretném kérdezni, hogyan lehet rávenni az Excel-t, hogy a UserForm-on elhelyezett elemek ControlTipText szövegeit ne egy sorba jelenítse meg, hanem mondjuk a Label-eknél szokott módon egy adott szélességű tartományba tördelje be? Esetleg használjak sortörés karaktereket? Valahol nem lehet megadni, hogy legfeljebb hány betűt írjon egy sorba és eszerint tördelje a szöveget? Nekem 200 betűs (megszámoltam) ControlTipText-et is egy sorba írt, szépen végigér a monitoron :))
Dim i As Integer, j As Integer, k As Integer Dim l As Integer, m As Integer, n As Integer Dim i1 As Integer, i2 As Integer, i3 As Integer Dim i4 As Integer, i5 As Integer, i6 As Integer On Error Resume Next For i = 65 To 66: For j = 65 To 66: For k = 65 To 66 For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66 For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66 For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126
Első próbálkozásként próbáld meg OpenOffice Calc-cal megnézni. Itt a topikon már sokaknak segített ez jelszóproblémánál. Ha nincs a gépeden, letölthető a www.openoffice.org honlapról.
Van egy Excel-es táblázatom, és van benne alul egy olyan lapfül amire, ha rámegyek az az egész lap le van jelszavazva, és sajnos nem tudom modósítani. :-((( Olvastam, vannak ilyen-olyan jelszótörő progik, csak sajnos kemény pénzbe kerülnek. Tudnátok nekem valami jót ajánlani ami működik is és ingyenes (ha van ilyen)? Köszönöm szépen, elnézést ha OFF téma.
Egy UserForm-on elhelyeztem egy ListBox elemet és a listaelemek szürke pontsorral határolva jelennek meg. Azt szeretném kérdezni, ennek mi lehet az oka? Hátha lényeges, ideírom, a UserForm-on van egy MultiPage, ennek egyik Page lapján van ez a ListBox. A TabIndex és a TabStop be van állítva (erre gyanakodtam, de nem ez a hiba). Mellékelek egy képei is a jelenségről:
Hú, ha ezt a reptéren hallották volna! Nehogy még valaki úgy értse, hogy a repülőgéppel. Érdekes látvány lenne, csak precíz kivitelezést igényel. :-DDD
Ha nincs benne az y érték, ez még akkor is lekezeli: =HA(NEM(HIBÁS(HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0)));HA(NEM(SZÁM(KÖZÉP(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);2;1)));BAL(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);1);BAL(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);2));"nincs ilyen elem")
1. Ha A1-van, hogy hányadik sor(x), B1-ben keresendő érték: =HA(NEM(SZÁM(KÖZÉP(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);2;1)));BAL(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);1);BAL(CÍM(SOR(OFSZET(A1;A1-1;0;1;255));HOL.VAN(B1;OFSZET(A1;A1-1;0;1;255);0);4);2))
trimmeld le, a Windows API alavetően C nyelvi adatstruktúrával dolgozik a stringnek ott a karaktertömb felel meg. Ha kódba bele nézel, akkor 254 szóköz van lefoglalva a név helyének. ezt írd be: MsgBox Len(Trim(adatfile))
A problémám az, hogy nem tudom megadni egy központi tárhely és azon belül egy könyvtár elérését, vagyis, hogy ne kellejen ezeket állandóan kiválasztani, hanem ezt ajánlja fel a GetOpenFilename eljárás, és innen lehessen kiválasztani egy *.txt kiterjesztésű fájlt. Tudna valaki segíteni?
Nézd meg 4690 hsz.-t vagy keress rá a GetOpenFilename-re ebben a topikban. Az itt lévő megoldásban a opfile.lpstrInitialDir = CurDir sorba a CurDir helyett a saját könyvtárad elérhetőségére változtasd meg. Én egyébként mindig ezt Windows API-hoz tartozó dialógusablakot használom, mert ezen aztán minden testreszabható. Üdv József
Sziasztok!
Segítséget szeretnék kérni egy fájlmegnyitási problémában. Az alábbi eljárással próbálkozom, de idáig sikertelenül:
ChDir "\szerverkönyvtárneve"
Fájltípus = "Szöveg fájl (*.txt), *.txt"
Felirat = "Szövegfájl kiválasztása"
Szövegfájl = Application.GetOpenFilename(Fájltípus, , Felirat)
A problémám az, hogy nem tudom megadni egy központi tárhely és azon belül egy könyvtár elérését, vagyis, hogy ne kellejen ezeket állandóan kiválasztani, hanem ezt ajánlja fel a GetOpenFilename eljárás, és innen lehessen kiválasztani egy *.txt kiterjesztésű fájlt. Tudna valaki segíteni?
Előre is köszönöm.
Nekem ez nem működik. Hiába Trim, ha átmásolom értékként, ott van a szóköz. Azért nem működik a TRIM, mert igazából nem szóköz, hanem egy 160 ASCII kódú karakter van a végén. Esetleg megpróbálhatod ezzel a képlettel is: =DÁTUMÉRTÉK(CSERE(A4;12;1;""))
Próbáld meg át alakítani a következő képlettel: =DÁTUM(BAL(A4;4);KÖZÉP(A4;6;2);KÖZÉP(A4;9;2)) Utána visszamásolhatod az eredeti helyre Irányított beillesztés/Értékettel
Ha az a-ban vannak, akkor pl. B1=TRIM(A1) stb. Ez legalább megmutatja, hogy tényleg szövegformátumban van-e. Aztán esetleg ki lehet másolni a kapott értékeket irányított beillesztéssel (az "értéket" bejelölésével), és törölni a nyers adatokat.
Köszönöm Jozsef, tényleg ott a szóköz, és ha kiveszem onnan, akkor helyreáll a dátum formája.
Most már csak egy apróság: hiába próbálom, hogy keresse meg a szóközöket és cserélje ki őket semmire, azt írja, nem talál egy szóközt sem.
Persze, kitörölgethetném kézzel is, de akkor megint jön az a kínos érzés, hogy neandervölgyi vagyok a csúcstechnológiához, ami lehet, hogy igaz, de csoda kellemetlen. ;-)
kezdem szégyelni, hogy a teknika századát követő évszázadban újra be kell írogatnom a dátumokat. Tud valaki segíteni? A probléma igen egyszerű: az OTP-től jövő dátum végén ott van egy szóköz, (ami persze nem látszik elsőre), emiatt szövegként értelmezi az Excel. Le kell törölni és utána már megformázható a kívánt formátumba.
Szokásos dátum-problémába futottam, és nem bírok vele. A bank küldi a dátumokat egyik formátumban, nekem meg egy másikban kellenének, és nem tudom átalakítani. És már kezdem szégyelni, hogy a teknika századát követő évszázadban újra be kell írogatnom a dátumokat. Tud valaki segíteni?
Jelöld ki az eredménycellákat, és a formátum menüben a feltételes formázásnál állítsd be. A logikája hasonló a HA függvényhez, csak nem értéket ad vissza, hanem formázást.
Sziasztok, tudna valaki segíteni, hogy egy HA függvénynél hogyan tudom pl. piros színnel kiíratni az egyik lehetőséget? =HA(D2-B2-90>0;"van";"nincs") tehát, hogy a "nincs" pirosan jelenjen meg, de a "van" maradjon fekete. Köszi!
Sziasztok, azt szeretném megtudni, hogy a következő sorra miért kapom ezt a hibaüzenetet: "Nincs jogosultság a Visual Basic projekt programozási elérésére,"
Üdv ismét! Excelben, ha entert nyomok, normál beállítások mellett, ahogy az szokásos, a következő cellára ugrik lefelé. Ha több, enterrel elválasztott sort szeretnék beírni egy cellába, mit üssek? A fejemen kívül. :) Úgy emlékszem, valahol át lehet állítani a programot, hogy az entert azt ne sorugrásnak vegye, de én szeretném megtartani ezt a funkciót, s csak "időszaki" billentyűparanccsal elérni, hogy a cellán belül maradjon.
Sziasztok! Adva van egy táblázat, sok-sok adattal, mint pl. név, e-mail cím, telefonszám, rendelési tétel, akármi. Hogyan tudom kiszűrni (esetleg automatikusan törölni) egy táblázatból a duplán szereplő e-mail címeket és csak az egyiket megtartani, amik különböző névhez tartoznak? (Pl. Béla - 123@freemail.hu és Józsi - 123@freemail.hu közül csak az egyiket kellene megtartani).
Masik forumon mar kerdeztem, es azt mondtak, hoyg nem lehet megcsinalni, de azert megkerdem itt is. Van egy ilyesforma tablazatom:
Rossz fórumon kérdezted :)) Meg lehet oldani: Fapados módszer: 1. A Diagramvarázslóval csinálsz egy PontXY diagramot a számpárokból A Diagram beállításai lépésben, a Feliratok fülön, bekapcsolod az X vagy Y érték megjelenítését. 2. Ha kész a diagram, a diagramterületen a pont mellett megjelenő számra addig kattintasz, amíg szerkeszthetővé válik, és átírod a feliratot a kívánt betűre.
Haladó módszer: 1. Letöltöd és felrakod a következő Excel kiegészítést : http://www.appspro.com/Utilities/ChartLabeler.htm 2. Miután készítesz egy PontXY diagramot a számokból, ráállsz, az Eszközök/XY Chart Labels/Add labels menüponttal, megadod neki a feliratot tartalmazó tartományt.
Profi módszer Írsz egy makrót, aminek megadsz három tartományt, a VBA kód a fapados módszert automatizálja. Ennek megírására most nincs időm :( Üdv József
Igen, ez gyorsabb mint stromba függvénye. A Find helyett nem érdemes inkább Application.Match függvényt használni? Azért kérdem mert több forrásból is inkább ezt javasolják (én is ezt szoktam használni).
Mi a véleményed? Mondjuk ennél kezelni kell a hibát is...
Van tartomány amiben vannak különböző értékek (B2:B21)
Van mellette egy másik tartomány (C2:C21)
Van egy cella (E2),aminek az értéke megtalálható a (B2:B21) tömbben.
A kérdésem az lenne, hogy hogyan lehet azt megoldani, hogy mondjuk az E2-es (fehér cella) értéke ha 135, akkor a mellette lévő (C2:C21) tömbből a mellette lévő értéket, azaz a 6 os számot adja eredményül, és ezt az eredményt írja ki a sárga cellába.Ha a fehér cella értéke nem a 135,hanem a 131, akkor a sárga cella értéke 10 legyen, azaz a 131 mellett lévő 10-es szám.
Próbálkoztam már a FKERES függvénnyel, de érdekes eredményeket ad eredményül, és ahogy próbálkoztam, azért lehetett ez,mert a B2:B21 tartomány nincs sorrendben.
Én az alábbi verziót javaslom, mert 1) a Find metódus soxor gyorsabb, mint akármelyik cellákon végrehajtott ciklus, 2) ha nincs Találat, akkor a függvény automatikusan #ÉRTÉK! hibával tér vissza, tehát ezt nem kell külön lekezelni.
Function ULookup(Mitkeres As Variant, Holkeres As Range, Oszlop As Long) Dim Találat As Range If Oszlop > Holkeres.Columns.Count Then Oszlop = 260 Set Találat = Holkeres.Columns(1).Find(What:=Mitkeres, LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlPrevious) If Találat.Offset(, Oszlop - 1) = "" Then ULookup = "" Else ULookup = Találat.Offset(, Oszlop - 1) End If
End Function
Az utolsó If..Then..Else azért van, mert anélkül a függvény nullát ad vissza ott, ahol üres sztringet kellene. Ezt esetleg egy elágazásnál elegánsabban is fel lehet oldani, de most ez jutott eszembe.
Kösz. Az összekapcsolt cellák volt az első ötletem nekem is. Voltak is ilyenek, de nem ez volt a hiba. Időközben ugyanis rájöttem. Az átmásolandó füzetben több lap is aktívvá volt téve. Így ezekről is másolni akart az 1 aktivlapos füzetbe, ami érthetően nem sikerült. Elég triviális hiba, de már vagy egy hete bosszankodtam miatta. Aztán hogy elküldtem a kérdést, véletlenül ráhibáztam a megoldásra.
Igen, meg lehet csinálni for each .... next loop-pal is. A for each ciklus egy array (collection) minden elemén végigmegy - sorrendben - tehát azt a sort kell hogy megtaláld ahol a 'Mitkeres' érték legutoljára előfordul.
Az array ebben az esetben a Holkeres tartomány első oszlopa lesz, a for - next each ciklus pedig ezen tartomány minden elemén (cellján) végigmegy, és keresi azokat az elemeket ahol a cella értéke megegyezik a 'Mitkeres' értékével. A for... next each ciklus végeredményeként annak a sornak a számát kell megkapnunk, ahol ez utóbbi adott, ebből pedig már képezhető a függvény végeredménye. Remélem ez így segít, mivel szeretnél játszani ezért nem adom meg a megoldást. Szólj ha a fentiek alapján nem menne.
Masik forumon mar kerdeztem, es azt mondtak, hoyg nem lehet megcsinalni, de azert megkerdem itt is. Van egy ilyesforma tablazatom:
A 1 5 B 5 6 C 2 2 D 4 2
A szamokat szeretnem egy koordinata rendszerben abrazolni ugy, hogy az egyes koordinatakhoz automatikusan hozzarendelodjenek a hozzatartozo betuk. Meg lehet ezt csinalni?
Az információ nem illeszthető be, mert nem azonosak a kijelölt területek. Mit kéne átállítani? Esetleg, ahová másold, ott lehet, hogy összenyitott cellák találhatóak.
Egy másik gépen készült fileba akarok átmásolni egy cellatömböt a saját gépemről. A szokásos módon, CTRL-C, CTRL-V. De hibaüzenettel nem engedi: Az információ nem illeszthető be, mert nem azonosak a kijelölt területek. Mit kéne átállítani?
Közben egy következő kérdés,
Hogy lehet azt egy függvénnyel megoldani, hogy számok közül mondjuk 1-100- ig számok
Bizonyos számok, pl: 7, 38, 4, 23, 78, 12, 26, 7, 34, 56, 29, 61, 48, 36, 82, 49, 69, 36, 73, 46, 59, 23, 47, 41
Egy bizonyos kritériumnak megfelelnek-e pl páros-e. Ha igen, akkor mutassa meg az összes ilyen számot, ami ennek a kritériumnak megfelel vesszővel elválasztva, egy cellában.
Hogy állnátok neki egy olyan függvény megírásának, ami annyiban tér el az FKERES beépített függvénytől, hogy nem a megadott tartomány első sorától keres lefelé, hanem fordítva. (Tehát az utolsó sortól keres felfelé) ?
Szia! Hogy lehetne itt megoldani mondjuk 60 eseményre ugyanezt?
Többféleképpen meg lehet oldani. Ha jól értem a feladatot, azt kell megnézni, hogy egy vízszintes tartományban szerepel-e a C46 érték. 1. HOL.VAN függvény =HOL.VAN(C46;FM45:FQ45;0) Ha a képlet eredmény nem hibás, akkor megtalálható a tartományban. Mellékhatásként megkapod, hogy hányadik pozícióban található meg először. 2. Tömbképlet =SZUM((FM45:FQ45=$C$46)*1) beírás után lezárás Ctrl+Shift+Enter(!!!) Ha az érték nem 0, akkor megtalálható a tartományban, mellékhatásként megkapod hányszor szerepel az érték. Midkettő működik számokra, szövegekre is. Üdv József
Sziasztok,
Kérdésem az lenne, hogy hogy lehetne a VAGY függvényt nem csak 5 esemény vizsgálatára használni, vagyis ,hogy lehetne megoldani, hogy több mint 5 eseményt figyeljen.
Például itt egy függvény:
=OR(FM45=C46,FN45=C46,FO45=C46,FP45=C46,FQ45=C46)
Hogy lehetne itt megoldani mondjuk 60 eseményre ugyanezt?
Válaszotokat előre is köszi
Laci
Nagyon köszönöm! Megmentettél a munka közbeni méteres szakáll kinövésétől. :)
-
Még egy kérdésem volna. Amikor rámegyek egy mezőre, amelyben már van szöveg (pl. "alma"), hogyan tudom egér nélkül megoldani, hogy beleírhassak (pl. "alma és körte") anélkül, hogy az eredeti szöveg átíródjék? (A cél az volna, hogy az egérhez való kapkodás nélkül írhassak.)
Sziasztok! Szerkesztési kérdésem volna. Van egy sornyi adatom, minden cellában egy szó. Szeretném ezeket oszlopba rendezni (hogy abc-rendbe tudjam tenni). Megoldható ez valahogy Excelben? Az adatrendezés funkciót ismerem, csak azt szeretném, hogy a sorból oszlop keletkezzen.
Sziasztok! Tanácsot szeretnék kérni! Egy form-on ListBox kombinált listát használok MultiSelect = fmMultiSelectMulti tulajdonsággal, azaz bármelyik listaelem ki-be kapcsolható. Igazából nekem három állapotú listaelemek kellenének, tehát nem elég az igen-nem opció, hanem ezekhez egy harmadik lehetőség is jó lenne. Ezt milyen elemekkel lehet megoldani, ezetleg a ListBox valamilyen beállításával tudja ezt? Vagy például a listaelem előtti jelölőnégyzet (ListStyle = fmListStyleOption esetén) nemcsak üres vagy kipipált lenne, hanem mondjuk egy a windows-ból ismert szürke állapota is lenne.
Arról van szó, hogy a lista minden tagja egy-egy további al-listát tartalmaz, és ezeknek az elemeknek a csoportos kinyomtatását szeretném makrózni. Az igen-nem állapot jelenti, hogy a listaelemhez tartozó al-lista minden eleme ki lesz-e nyomtatva, vagy egyik sem. Viszont ha egy listaelem al-listájának nem kell minden elemét nyomtatni, akkor nem szeretnék sem igen, sem nem opciót kiadni, akkor lenne ez a harmadik állapot és a nyomtatást nem a csoportos nyomtatás beállítása határozná meg, hanem az al-listákban a minden elemre egyedileg beállított érték lenne érvényes. A makró egyébként csak az al-listák nyomtatási beállításait adja meg, így nem kell a felhasználónak (nekem) szűrögetni és listánként egyesével beállítgatni az értékeket, csak ráküldöm a makrót, bejelölöm az engem érdeklő elemeket és szevasz. De nem feltétlenül kell mindig az összes listaelemre elvégezni ezt a beállítást, a harmadik opció jelentené, hogy hagyjuk változatlanul a listához tartozó al-lista beállításait.
Bocsánat, a gyakorlatban ez sokkal egyszerűbb, mint ahogy most megpróbáltam elmondani a bánatomat...
Van olyan, hogy Adatok/Érvényesítés... ablak Beállítások fül Megengedve listából a "Lista" opciót választva megadható, hogy az adott cellába milyen értékek kerülhetnek. Ekkor a cellába kattintva lesz egy lenyíló ablak a választható szövegekkel. Az is beállítható, mi legyen, ha a listában nem szereplő szöveget írsz a cellába.
Szóval! Oylan kellene mint az FKERES, csak úgy, hogy ne egy cella legyen képletre, hanem mondjuk egy oszlop, illetve abban adott sor és ne csak az első eredményt adja meg, mint az FKERES, hanem ahány egyezőt talál annyi sorba rakja ki a lehetőségeket. Vagy ezt tudja valahogy FKERES? Mert mondjuk úgy megoldhatták volna a készítők, hogy "HAMIS" helyett mondjuk azt írom be, hogy 2 és akkor ez azt jelentené, hogy a 2. találat és így tovább. Vagy van erre másik függvény?
Igazából eléggé benne vagyok egy nagy feladatban excelben, és eléggé elmerültem már benne, de egy olyan dolgon akadtam fenn, ami lehet hogy tök alap. Szóval annyi lenne a kérdésem, hogy megoldható-e, hogy egy cellába íráskor feldobjon lehetőségeket. SZóval mondjuk úgy mint, amikor egymás alatti cellákba írsz és amit egyszer már írtál azt feldobja "enterezésre". Ugyanez kellene csak úgy, hogy a lista egy másik munkalapban van. ????????????? Lehetséges?????????
Talán más különbség is van, de annyi mindenképpen, hogy ha VeryHidden, akkor menüből (Formátum->Lap->Felfedés) nem tudod láthatóvá tenni. Ha csak Hidden, akkor igen.
Sziasztok! A munkalap objektum (Worksheet) Visible tulajdonsága lehet xlSheetVisible, xlSheetHidden, xlSheetVeryHidden. Mi a különbség az utóbbi kettő között?
Szerintetek mitől van az, ha lezárom a számítógépem, és utána bejelentkezem, megnyílik a Visual Basic Editor. Nem tudom mihez kötni a dolgot, mert akkor is szokta csinálni, ha semmilyen Office dokumentum nincs megnyitva. Furcsa és idegesítő jelenség.
Futtasd ezt azon a lapon, ahol a címek vannak felsorolva.
Sub teszt() Dim Rng As Range, cel As Range, sEMail As String Set Rng = Range("A1", Range("A" & Rows.Count).End(xlUp)) For Each cel In Rng With cel sEMail = .Offset(, 4) If InStr(sEMail, ";") > 0 Then .Offset(1).EntireRow.Insert .EntireRow.Copy .Offset(1) .Offset(, 4) = Trim(Left(sEMail, InStr(sEMail, ";") - 1)) .Offset(1, 4) = Trim(Mid(sEMail, InStr(sEMail, ";") + 1)) End If End With Next End Sub
Újabb kérdéssel fordulok hozzátok, mellyel lehet, hogy feladom a leckét :)
Excel adatbázisból rendszeresen készítek Word körlevelet, mellyel a következő problémám van:
pl.
"A" oszlop tartalmazza a nevet
"B" oszop tartalmazza az életkort
"C" oszop tartalmazza az átlagkeresetet
"D" oszop tartalmazza a gyermekek számát
"E" oszlopba FKERES-sel bemásolom a nevek alapján az e-mail címeket
Azokat a rekordokat, ahol több cím szerepel, annyiszorosan kell többszöröznöm, ahány cím tartozik a névhez. Ezután manuálisan kitörölgetem a felesleges címeket, úgy, hogy az "E" oszlop celláiban csak egy cím szerepeljen (mindegyikből lesz).
Az e-mail címek alapból "; " -l vannak elválasztva.
egy kis segítségre lenne szükségem egy hozzáértőtől!
Egy tartományban szereplő maximum értéket szeretnék megkeresni a MAX() függvénnyel, de a tartomány az nem egy fix tartomány hanem időnként változik.
Odaáig megvagyok, hogy a tartomány egy cella tartalmazza szövegként (pl: $B$1:$B$9) de ezt nem tudom megadni a MAX függvény argumentumaként, mivel nem találtam olyan függvényt, ami a szöveget tartományra való hivatkozássá alakítaná át.
Ha pl. a B21 -es cellám szöveges tartalma ez a bizonyos $B$1:$B$9, akkor a MAX(B21) függvény nem a kívánt értékket, hanem 0-át ad eredményül.
Meg tudná esetleg valaki mondani, hogy hogyan kell ezt a tartományt a MAX() függvénynek megadni, úgy hogy működjön a dolog?
Ez fantasztikus! Már kézzel végigpötyögtettem egyenként a sorokat, de most kipróbáltam, és tényleg :))) Köszi szépen! Mi mindent lehet tőletek tanulni...
Hát az látszik, hogy félreértettem a kérdést :) Hanem a ciklusmag utasításait egyszerre is beljebb "lökdösheted". Kijelölöd az összes érintett sort, és TAB. Ugyanez kifelé: kijelölöd az összes érintett sort, és Shift+TAB.
Sziasztok! Egy problémám van, de az két kérdést generált :)) ebben kérek segítséget.
1. Hogyan lehet makróból egy cella tartalmát csupa nagybetűssé átalakítani? A makró végigfutja a táblázatot és a vizsgát oszlopból az aktuális sornak megfelelő elem tartalmát kiolvassa, majd azt összehasonlítja a "no" szöveggel. Azám, de ha a cellában "No" vagy "NO" szerepelt, akkor már nem lát egyezést. Tehát a cellát nagybetűssé kellene konvertálni (nem kell megőrizni ezt a szöveget) és ezt a "NO" szöveggel összehasonlítva máris nem számít az eredeti szöveg kis- vagy nagybetűs típusa.
2. Egy izmosabb ciklusban a ciklus elején egy ellenőrzést végzek, és ha az előbb "no" értékket találtam, akkor nem fut le a ciklusmag, hanem következik az újabb iteráció. A C vagy Java programnyelvekben erre használják a continue utasítást, de vajon ennek van megfelelője az Excel makrónyelvben? Jó lenne elkerülni a goto utasítást és nem akarok (ha nem muszáj) újabb if-else elágazást (már így is sokszorosan egymásba ágyazott utasításhalmaz van a ciklusban).
Készítettem egy pivottáblát. Vannak benne üres sorok, és ezeket kell eltüntetnem, de nem tudom hogyan. Első oszlopában szállítók vannak, ezek mellet 3-3 pénznem. Viszont szállítónként nincs használva mindegyik pénznem, ezért azok a sorok üresen maradnak, és ezeket kell eltüntetnem. Tudtok segíteni ebben?
Az igazi persze az lesz, ha megtanulok olyan progit írni, ami kommunikál az Excel-lel. Mert sok oka lehet, ha nem nyitható meg az eredmény-file, mondjuk ha a progi nem állította elő, de ezt a progi tudja, csak valahogy az Excel-nek meg kellene mondania :))
Igazad van, nem kell! Viszont rájöttem, miért is vetettem el, hogy rögtön beolvassam az eredményeket :) mégiscsak kell felhasználói beavatkozás (valamennyi idő el kell teljen, míg a kilépett program "elengedi" az eredményfile-t, nem lehet azonnal hozzáférni). Tehát:
Do AppActivate ProcessID Loop Until Err.Number > 0
If MsgBox(ResFileName & " beolvasása?", vbYesNo + vbQuestion) = vbYes Then InsertTxtFile ResFileName End If
Illetve dehogynem :)) Nem is kell felhasználói beavatkozás, csak váltogatom a task-okat és egyszer csak, mikor lefutott a progi, megszűnik a PID-je és kész is vagyunk:
Do AppActivate ActiveWorkbook.Name AppActivate ProcessID Loop Until Err.Number > 0
Igen :)) Útnak indítom Loads.exe progit a Shell paranccsal, majd kiírok egy MsgBox üzenetet, hogy elindult a program, akarom-e az eredményeket behúzni a munkalapra? (Hiba esetén a hibaüzenetet írom ki.) Ha a user az igen-re kattint, akkor megnézi a makró, hogy a PID él-e még, ha igen, akkor újra kidobja az üzenetet. Ha már lefutott a progi, akkor nem él már a PID, hibakód jelenik meg az Err változóban, ez lesz a ciklusból a kilépési feltétel. Ha tehát a progi lefutott, akkor ki lehet lépni az MsgBox üzenetből, de amíg fut a progi, azaz érvényes a PID, addig nem tudunk tovább lépni. A makró végén az InsertTxtFile egy másik makró, ami formázásokkal beolvassa a Loads.exe progi által generált Results.txt file-t. Kicsit fapados, de nekem jó, nem kell kívülről indítani Loads.exe-t és nem kell külön beolvasni-formázni az eredményeket. Az igazi az lett volna, ha a makró észre tudná venni, mikor futott le az elindított progi és utána rögtön behúzná az eredményeket.
Sub Futtat()
On Error Resume Next
Const ExeName As String = "Loads.exe" Const ListTxt As String = "List.txt" Const ResultsTxt As String = "Results.txt"
Dim DirName As String, CommandLine As String DirName = ActiveWorkbook.Path & "\" CommandLine = DirName & ExeName & " " & DirName & ListTxt & " " & ResultsTxt
Dim ProcessID As Double ProcessID = Shell(CommandLine, vbNormalNoFocus)
If Err.Number > 0 Then MsgBox Chr(34) & ExeName & Chr(34) & " nem futtatható!" & Chr(10) & _ "Hiba: " & Err.Description, vbExclamation Exit Sub End If
Dim InsertResFile As Variant, ResFileName As String ResFileName = DirName & ResultsTxt
Hát igen, kérdezni lehet :) De pl. a "A külső program mikor fejeződik be" kérdésedre (hacsak el nem néztem valamit) nem tudott senki válaszolni... Megoldottad valahogy?
Sziasztok! Mikor egy eseménykezelőben (mondjuk a Worksheet_Change-ben) a Target tartomány valamelyik elemét megváltoztatom, akkor az eseménykezelő újra meghívódik és végtelen ciklusba csavarodik. Mit tehetnék, hogy ezt elkerüljem? Mondjuk egy esemény kiváltódásakor a kezelő elején tiltanám a további ilyen típusú esemény kiváltódását, kezelném az eseményt, majd ismét engedélyezném ezt az eseményt. Hogyan lehet tiltani és engedélyezni az események kiváltódását? Köszi előre is a segítséget!
tudniillik, ha kikapcsolva hagyod a figyelmeztetéseket, az az összes effélére vonatkozik, ami nem biztos, hogy jó. Másrészt a lap törlése nem igényli, hogy előtte kiválaszd egy Select utasítással.
2) A nyomtatási nézet bezárására nem ismerek lehetőséget a "Bezár" gombon kívül. Ez talán még változhat, de ha találok is valamit, az valószínűleg elég trükkös lesz, mivel úgy tűnik, hogy a kód futása szünetel addig, amíg a munkalap PrintPreview állapotban van.
3) If Sheets("Munka3").Range("B2") = "" Then Sheets("Munka3").Delete
Pl sum ettől eddig, adott eredményként egy számot, de ezzel konstans számként akarok tovább dolgozni.
Először kijelölöd a tartományt, Szerkesztés/Másolás, majd ugyanarra a tartományra Szerkesztés/Irányított beillesztés Értéket. Ezt könnyen le is lehet makrózni, ha többször kell.
Tudtok arra a problémára esetleg megoldást, ha van rengeteg számom és ezek függvények eredményei, hogy lehet azt megoldani, hogy ezeket konstans számokká alakítsuk.
Pl sum ettől eddig, adott eredményként egy számot, de ezzel konstans számként akarok tovább dolgozni.
Ezt idáig úgy oldottam meg, hogy kimásoltam excelből, áttettem Wordbe, aztán vissza excelbe, de ez nagyon sokáig tart, mire a gép végrehajtja. Meg az én gépemnél még sokszor azt is kiírja, hogy nincs elég memória.
Mondjuk a január, február, március adathoz tartozó értékek egymás mellett, de aztán a november december pedig a grafikon végén, és mindezt arányosan, ahogy a egyébként a 12 hónap követi egymást, anélkül, hogy fel kellenne töltenem ezeket a kimaradó értékpárokat. De pl 200 értékpár esetén még drámaibb a helyzet.
Nagyon egyszerű a megoldás: X tengely adatai dátum típusú adatok legyenek. Megjelenésüket pedig formázással állíts be a kívánt formátumra (pl. csak a hónap jelenjen meg)
Ez rendben is van, de úgy gondoltam, lehet ennyire felhasználóbarát ez a program :) De nem az. A grafikonjaival sem vagyok kibékülve. Hogyan lehet azt megcsinálni, hogy pl 5 adatpár esetén a vízszintes tengelyre kerüljön a dátum, de azok nem egymást követik, hanem arányosan kéne eloszlania. Mondjuk a január, február, március adathoz tartozó értékek egymás mellett, de aztán a november december pedig a grafikon végén, és mindezt arányosan, ahogy a egyébként a 12 hónap követi egymást, anélkül, hogy fel kellenne töltenem ezeket a kimaradó értékpárokat. De pl 200 értékpár esetén még drámaibb a helyzet.
1. A szögmérés hivatalos SI mértékegysége a radián. Definió szerint a (ív)hosszmérésből származtatjuk. A fok az atmosztféra, lóerő stb. közkedvelt, de nem hivatalos egységekkel van egy kategóriában. Ezért van külön RADIÁN ill. FOK függvény az oda-visszaváltásra.
2. A számítástechnikában (az összes általam ismert) programnyelven a trigonometrikus függvények radiánnal számolnak. Ennek az az oka, hogy a sin, cos függvényt igen barátságosan sorba lehet fejteni (Taylor-polinom), amit után egyszerűen lehet kiszámítani, ha a szög radiánban van. Egyébként így számol a számológép is belül.
3. A számológép is csak akkor számol fokkal, ha meg mondod neki (DEC-RAD-GRAD váltás) :)
Az Excel trigonometrikus függvényei radiánba számolnak, így a 30 fokot át kell váltani radiánba, vagy a RADIÁN függvénnyeé vagy a alfa/180*PI() (pl 30 fok=PI()/6) Üdv József
jelöld ki az összes cellát. ctrl+1 védelem fül. pipákat kiszedni. eszközök/védelem/lapvédelem... jelölj be mindent, kivéve oszlopok törlése, sorok törlése OK
és a cellák szerkeszthetőek maradnak. itt tanultam vkitől.
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If (Target.Address = Target.EntireRow.Address) Or (Target.Address = Target.EntireColumn.Address) Then Me.Protect Else Me.Unprotect End If End Sub
Ez meg letiltja a környezeti menüt (ami jobb gombra feljön a munkalapon) :
Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) Cancel = True End Sub
Azt viszont, hogy ha egy cellán állva a user menüből Szerkesztés/Törlés parancsot választ, majd a felugró panelon az egész sor ill. oszlop törlését választja, nos azt nem tudom, hogy lehet kiküszöbölni.
Sziasztok! Egy jó ötletet szeretnék kérni :)) Azt szeretném, hogy egy munkalapnál ne lehessen törölni sorokat vagy oszlopokat. A zárolás nem jó, mert a cellák értékét tudni kell módosítani.
Sub rendez_vizszint() usor = ActiveSheet.UsedRange.Rows.Count For sor = 1 To usor Rows(sor).Select Selection.Sort Key1:=Cells(sor, 1), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlLeftToRight Next End Sub
Ez egy kicsit lassúbb művelet lesz, ha sok adatod van.
Sub rendez_vizszint() uoszlop = ActiveSheet.UsedRange.Columns.Count usor = ActiveSheet.UsedRange.Rows.Count For sor = 1 To usor For oszlop = 1 To uoszlop a = Cells(sor, oszlop) b = Cells(sor, oszlop + 1) If a > b Then Cells(sor, oszlop) = b Cells(sor, oszlop + 1) = a End If Next Cells(sor, uoszlop).Select Selection.Delete Shift:=xlToLeft Next End Sub
Ez a kis makró végigszalad az oszlopaidon, és mindegyiket emelkező sorrendbe rakja, egymástól függetlenül.
Sub rendez() uoszlop = ActiveSheet.UsedRange.Columns.Count For oszlop = 1 To uoszlop Columns(oszlop).Select Selection.Sort Key1:=Cells(1, oszlop), Order1:=xlAscending, Header:=xlGuess, _ OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom Next End Sub
Nem lehetne erre is egy makrót írni, mint a multkor. Egyébként a makró amit a multkor írtál az majdnem jó lenne, hisz ott is emelkedő sorrendbe kellett rakni számokat. Most viszont nem kellene az azonosítás, tehát adott számhoz nem kellene hozzárendelni másikat.
Egyszerüen pl arra a számblokkra alkalmani azt, hogy az ott lévő számokat emelkedő sorrendbe rakja.
A sorbarendezésnek az a lényege, hogy egy (vagy több) kulcs-mező alapján rendezi az összes többit is. Ahhoz, amit te akarsz, (legjobb tudásom szerint) az összes oszlopra egyenként kell kiadni a sorbarendezés parancsot.
Sziasztok!
Abban kérném segítségeteket, hogy hogyan tudom megoldani az alábbi problémát
Különböző excel fájlok között másolok át adatokat és nem tudom megoldani, hogy a forrás fájl bezárásakor ne kérdezzen rá az excel a mentésre, és a vágolap ürítésre hanem simán -mentés nélkül- csukja be a fájlt.
Előre is köszi a segítséget
Az a gond, hogy FormulaR1C1-et használsz, miközben abszolút cellahivatkozást adsz meg. FormulaR1C1 esetén R[x]C[y] formában kellene megadni a hivatkozást, ami ebben az esetben elég körülményes lenne, ezért javaslom, próbáld ki úgy, hogy
Az öcséd makrójához képest annyi az eltérés, hogy ő a
Worksheets("Munka1").Cells(ujsor,1)=adat sorban a másik füzet adatát másolja be, én meg a
Workbooks("beillesztos.xls").Sheets("Munka1").Cells(sor_2,1).FormulaR1C1= "=["lista.xls]"Munka1!A" & sor_1 sorban a képletet adom meg.
Ennél, ha a sorközök számát akarod növelni, azt a sor_2=sor_2+3 -nál teheted meg, ha pedig A3-tól akarod indítani, akkor az elején a sor_1=1 és a sor_2=1 -eket növeld 3-ra.
A sor_1 azonos az öcséd sor nevű változójával, a sor_2 pedig az ujsorral.
Jimmy, vagy aki tudja, mi a hiba:
A formulás sortól azt vártam, hogy ezt írja be: =[beillesztos.xls"]Munka1!A1, de ehelyett az A1-et aposztrófok közé teszi. Azért tettem a végére a cserét, és így már működik.
Rájöttem közben, hogy ha például minden ötödikbe szeretném rakni a számokat, és nem a Munka1 A1-től szeretnék indulni, hanem Munka1 A3-tól, akkor gondolom a maradékképzési dolog miatt a képletben A1 helyett mindenhol 2x5+1, tehát A11 írandó, a hármasokat meg ötösre kell átírni.
Nagyon köszönöm! Sokat segítettél! Már többször is sok plusz munkát okoztam magamnak ilyen problémák miatt, örülök, hogy nem kell minden cella hivatkozását egyenként bepötyögni, és létezik megoldás. A képlet paramétereit még próbálom értelmezni, hogy megértsem, hogy pontosan hogyan is működik, és hogyan lehet más esetekhez is hozzáigazítani. Gondolom ha négyesével akarom, akkor csak a hármasokat kell átírni, ha meg nem az A1-től szeretnék indulni, akkor meg csak a kezdőcellát kell átnevezni. Mégegyszer köszi! Király vagy!
Ez elvileg azt csinálja amit szeretnék, de a közbülső cellákban is képlet van. Ha azt akarod, hogy a kimaradó (tehát 2., 3., 5., 6., stb.) sorokban ne legyen semmi, azt szerintem képlettel nem lehet megoldani, legfeljebb úgy ha végig képlet van az A oszlopban, aztán (kézzel vagy makróval) törlöd azokat, amik nem kellenek.
Sziasztok!
A következő kérdésem lenne: hogy lehet számokat sorba rendezni úgy, hogy nem egyenként kattintok egy kijelölt tartománynál az adatok menüben a sorbarendezésre, vagy a sorbarendezés ikonra, hanem egy nagy, több száz oszlopból álló tartománynál minden oszlopban lévő adatokat rendezze egyszerre emelkedő sorrendbe.
Ez ugyanis nem nem megy úgy hogy kijelölöm az adatokat, aztán egyszerüen sorbarendezés. Az excel itt csak mindig csak az első oszlopot rendezi sorba.
Köszi
Laci
Sziasztok! Lenne egy excel-es kérdésem, remélem ti profik vagytok, és tudtok segíteni! Hogyan lehet egy munkalap egyik oszlopából egy másik munkalapon lévő táblázatba úgy beilleszteni a számadatokat, hogy két sor szünet legyen az adatok között. Pl. A1-et A1-re, A2-t A4-re, A3-at A7-re, A4-et A10-re stb. Ja és fontos lenne, hogy a kapcsolat megmaradjon, tehát a másolt adatok tartalmának változása a másolatokon is változzon. Az öcsém csinált egy makrót, amivel egy excelből egy másikba lehet sorkihagyással másolni, de több oszlopnál, illetve több munkalapra való másolásnál elég bonyolult, mert mindig át kell írni a file, oszlop, sor paramétereket. Ez az:
Sub makroka() sor = 1 ujsor = 1 Workbooks("lista.xls").Activate Do While Worksheets("Munka1").Cells(sor, 1) <> "" adat = Cells(sor, 1).Value Workbooks("beillesztos.xls").Activate Worksheets("Munka1").Cells(ujsor, 1) = adat ujsor = ujsor + 3 sor = sor + 1 Workbooks("lista.xls").Activate Loop End Sub
Remélem ti értitek, nekem ez elég zavaros. Meg aztán ez csak simán adatmásolás, tehát a másolt adat változása csak újabb makrófutáskor frissül. Nincs valami egyszerűbb megoldás? Valami függvénnyel nem lehet megoldani? Előre is köszönöm a segítséget!
Beszereztem az említett magazin számát, és minden le van benne írva naccerűen, még1x köszi Delila a súgást.
Felmerült egy újabb kérdés. Van egy táblázatom, és kéne csinálni hozzá egy kis szűrést. Láttam egyszer olyat, hogy egy combobox működtetésével lehetett szűrni. Meg is csináltam szépen, csak nem tudom eltüntetni a szűrés fejlécét, pedig az esztétika kedvéért szükséges lenne. Próbáltam az elrejtés funkciót, de nem túl szép, mert egy-egy pillanatra mindig kivillan, amikor változtatom a szűrőfeltételt.
Találtam egy DataGrid nevű vezérlőt. Tudja valaki, hogy hogyan lehet feltölteni adattal. Pl a tábla A1:D5 és a fejléc az 1. sorban van. Előre is köszönöm.
If Err.Number > 0 Then MsgBox ExeName & " nem futtatható!"
Exit Sub End If
AppActivate ProcessID While Err.Number = 0 AppActivate ProcessID Wend
MsgBox ExeName & " lefutott!"
End Sub
Tehát elindítom a progit, visszakapom a PID-et, ennek érvényességét az AppActivate-tal szeretném ellenőrizni (szerintem itt rossz az elgondolás). Ha elindítom a makrót, azonnal kiírja, hogy lefutott a progi, pedig még nem futott le. Debug módban is hasonló a helyzet, ha F5-tel futtatom a makrót, azonban F8-cal lépkedve, a makró úgy működik, ahogy gondolom. A progi.exe csak akkor lép ki, ha én megállítom (a végén vár egy billentyű leütésre, eddig érvényes a PID). Azt szeretném kérdezni, hogyan tudnám leellenőrizni, mikor lép ki progi.exe?
A PC WORLD májusi számában a Mesterfogások között Weisz Tamásnak van egy kiváló cikke a dinamikus grafikonokról (108. oldal), ahol pont ezt írja le lépésről lépésre. Főszereplő az OFSZET függvény. Érdemes megnézni, klassz.
Ha már gányolásról van szó, talán egyszerűbb lenne egy cellában megjeleníteni az évszámot, és ehhez kötni a le-fel gombot, aztán valami eldugott helyre az évszám alapján létrehozni egy (rejtett) másolatot a megfelelő adatsorról, a diagram meg a másolatból dolgozna.
van egy 5 darab adatsorom, minden adatsor éves termelési eredmény. Azaz 5 termelő üzem termelési számai egymás után egy sorban, 2000, 2001, .. 2005 évekre bontva.
Ebből szeretnék olyan diagramot készíteni, amin van egy le-fel gomb, és azzal váltja az évét az adatsornak, amiből megjelenítendő grafikont rajzolja.
Erre gány megoldást tudok: legyártom a diagramot, rárakok egy lefel gombpárost, és az ahhoz kötődő makrófüggvény átírja az adott Chart objektum Source-át. Nincs erre valami hivatalos, értelmesebb eljárás?
Sziasztok! Keresem azt az Excel-függvényt, ami egy focimeccs eredményéről az 1x2 (v. 102) eredményt meg tudja állapítani (úgy, h. az első cellában pl. 2, a másikban 1 van). A HA függvénnyel az a bajom, hogy az IGAZ v HAMIS értéket ad, de nem tudom, hogy a HA és az ÉS függvényeket hogyan kombináljam. Ha tudjátok, lszi írjátok meg! UI: Utoljára BASIC-ben, 20 éve kontárkodtam hasonlóval.
Na arra nem gondoltam, hogy a B mezőnevet félkövér írás bekapcsolásaként fogja értelmezni a fórumszoftver... Szerintem azért látszik a lényeg. Ha valahol gyanús, hogy hiányzik valami, képzeld oda a [.B.] mezőnevet, pontok nélkül.
Tegyük fel, hogy a nyuszika C értékét akarod növelni 2-vel, a D értékét pedig nullára állítani. Rekordmódosításhoz, jól gondoltad, először meg kell keresni azt a bizonyos rekordot, amit módosítani akarsz.
Egyik lehetőség a Seek metódus és az index mezők felhasználása. Legyenek az [ID] és a [Név] mezők megadva indexként. Ekkor:
Sub ModifyRecord() Dim DB As DAO.Database, Rst As DAO.Recordset
Set DB = OpenDatabase("D:\db1.mdb") Set Rst = DB.OpenRecordset("állatok") With Rst .Index = "Név" .Seek "=", "nyuszika" .Edit ![C] = ![C] + 2 ![D] = 0 .Update .Close End With DB.Close End Sub
Másik lehetőség, hogy már eleve szűrt rekordhalmazt nyitsz meg, SQL lekérdezés segítségével.
Sub ModifyRecord() Dim DB As DAO.Database, Rst As DAO.Recordset, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb") mySQL = "SELECT * FROM [állatok] WHERE [Név] = 'nyuszika'" Set Rst = DB.OpenRecordset(mySQL) With Rst .Edit ![C] = ![C] + 2 ![D] = 0 .Update .Close End With DB.Close End Sub
A Seek metódus egyetlen rekordot ad vissza, az SQL lekérdezés a szűrési feltételektől függően akár többet is. Ha több rekordot akarsz módosítani, akkor az utóbbit javaslom. Pl ha az a feladat, hogy minden olyan rekordban, ahol C=0, legyen C = B + D, akkor:
Sub ModifyRecord() Dim DB As DAO.Database, Rst As DAO.Recordset, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb") mySQL = "SELECT * FROM [állatok] WHERE [C] = 0" Set Rst = DB.OpenRecordset(mySQL) While Not Rst.EOF With Rst .Edit ![C] = ! + ![D] .Update .MoveNext End With Wend Rst.Close DB.Close End Sub
Itt tehát végig kell lépkedni az összes visszaadott rekordon, erre való a MoveNext. És ezt addig, amíg EOF nem igaz, ami akkor válik igazzá, ha nincs több rekord. Ha az SQL kiválasztási feltételeknek egyetlen rekord sem felel meg, akkor EOF alapból igaz, tehát a ciklus nem fut le.
Ugyanezt egyetlen sima SQL UPDATE utasítással is el lehet végezni:
Sub ModifyRecord() Dim DB As DAO.Database, mySQL as String
Set DB = OpenDatabase("D:\db1.mdb") mySQL = "UPDATE [állatok] SET [C] = + [D] WHERE [C] = 0" DB.Execute mySQL End Sub
Az SQL Update akkor jó, ha az új érték, amit be akarsz írni, konstansok és sajátrekord mezőértékek kombinációjaként megadható. A fenti példánál a [C] mező új értékét az ugyanabban a rekordban lévő és [D] összegeként állítjuk elő, tehát az SQL UPDATE használható.
De ha a [C] mező új értéke bonyolult módon áll elő, pl. egy bizonyos excel munkalap -edik sorában és [D]-edik oszlopában lévő értéket olvassuk ki, akkor az SQL UPDATE nem jó, és a DAO.Recordset a nyerő.
A tábla- és mezőneveket nem kell feltétlenül szögletes zárójelbe tenni, de melegen ajánlott. Egyrészt rögtön látszik belőle, hogy az ott a kódban (tábla-, vagy) mezőnév. Másrészt, ha a név szóközt, kötőjelet, ékezetes karaktert, stb. tartalmaz, akkor a szögletes zárójelek elhagyása hibás működéshez, vagy nem működéshez vezethet.
A progi Win32 konzol típusú. Az eredmények szövegfile-ban, minden rekord új sorban, minden sorban a mezők tab-bal elválasztva, minden sor egyforma, kivéve az elsőt, mert az a fejléc, de ezt az Excel makró kezeli.
A szövegfile beolvasását most így oldottam meg:
Sub InsertFile() Dim FileName As String FileName = Application.GetOpenFilename("Text Files (*.txt), *.txt," & _ "All Files (*.*), *.*") If FileName = "False" Then Exit Sub Workbooks.OpenText FileName, DataType:=xlDelimited, Tab:=True
'formázások
End Sub
Természetesen, ha a progit Excelből hívom meg, akkor nem kell megnyitás dialogusablak, akkor marad az open. Egyelőre nem tudom, hogyan indítsam makróbol a progit.
Az, hogy egy külső programot milyen módon lehet megnyitni VBA-ból szerintem ennyi infó alapján megmondani nem lehet, bár igazából annyira nem értek hozzá. Amit javasolni tudok az az "Adatok/Külső adatok importálása/Adatok beolvasása" menüpont, varázsló. Amennyiben a .txt fájlban található adatok szóközzel vannak elválasztva azt szépen külön sorokba és oszlopokba tölti. Innen úgy formázod ahogyan szeretnéd és ezt le is makrózhatod.
Van egy programom, ami számításokat végez és az eredményeket szöveg file-ba menti le. A szöveg file-t beolvasom Excel-be, ahol makrókkal megformázom. Azt szeretném kérdezni, hogyan lehetne a külső programot Excel makróból elindítani? Most külön futtatom a progit, majd formázom Excelben az eredményeket. Egyszerűsíteni szeretném a folyamatot, hogy az Excel indítsa el a progit, majd miután lefutott, beolvasnám a szövegfile-t és feldolgoznám az adatokat.
Az igazi megoldás persze az lenne, ha a progi kommunikálna az Excel-lel és eleve oda írná az eredményeket, de attól még messze vagyok, hogy ilyet tudjak :)) A progit Excel makróvá átírni még ettől is reménytelenebb számomra, marad tehát a külső progi, amit ha az Excel tudna meghívni, akkor már teljesen komfortos lenne a megoldás.
1000 és egy hála, soha nem jöttem volna rá (a szövegdobozos és gombos dolgot valóban megoldottam, legalább ennyi megy a témában). Még egy gyors kérdésem ezért lenne. Amennyiben meglévő adatot szeretnék módosítani azt hogyan tudom megoldani? Gondolom az azonosító alapján kellene megkeresni, de ehhez az accesses dologhoz egyelőre nem igazán értek.
a Commandbutton meg a Textbox részt kihagytam, de azt szerintem meg tudod oldani. Új rekord létrehozása az Access adatbázisban Excelből (pontosabban annak egyik lehetséges módja):
Sub TransferData() Dim DB As DAO.Database, Rst As DAO.Recordset
Set DB = OpenDatabase("D:Tesztdb1.mdb") Set Rst = DB.OpenRecordset("name") 'táblanév With Rst .AddNew 'mezőnév ![Név] = "valami string" 'szükség esetén további mezők is lehetnek ' ![field2] = érték ' ![field3] = érték .Update .Close End With DB.Close End Sub
Ne felejtsd el a VB Editorban a Tools->References listában a Microsoft DAO 3.x Object Library elé betenni a pipát. (x verziószám minél nagyobb, lehetőleg 6.) Arra is figyelni kell, hogy az átadott érték adattípusa megfeleljen a mező adatbázisban definiált adattípusának.
Egy kérdésem lenne Access és Excel kapcsolattal. Van egy kis programom Excel-ben, de az adatbázis része kezdi kinőni az Excel-t, így szeretném átültetni azt Accessbe. Úgy gondoltam, hogy első körben csak valami egyszerű példán kipróbálom miként is megy ez. Addig el is jutottam, hogy az Excel át tudja venni az adatokat amik az .mdb -ben vannak. A problémám az, hogy viszont fordítva nem működik. Amit szeretnék az az, hogy: Adott a D:Tesztdb1.mdb, azon belül egy name tábla. 2 oszlop található benne, Azonosító (ez az elsődleges kulcs) ami automatikus számláló és a Név ami szöveg. Az Excel-ben van egy form melyen található egy Textbox1 és egy CommandButton1 mely click eseményére szeretném, hogy a Textbox1 tartalma bekerülne a name táblába.
1. Létrehozok egy új modult, legyen a neve mondjuk StringTable. Itt definiáljuk a stringeket:
Public Txt(10) As String 'vagy amennyi kell
Public Function init()
Txt(1) = "Első szöveg" Txt(2) = "Második szöveg" Txt(3) = "Ez is egy szöveg" Txt(4) = "Na még egy" Txt(5) = "Még mindig csak a felénél járunk"
...
Txt(10) = "Utolsó"
End Function
2. A StringTable modul init metódusát a Workbook_Open eseménykezelőből meghívjuk, ami a ThisWorkbook (vagy DieseArbeitsmappe esetleg más) névre hallgató object kódjába kell írni:
Private Sub Workbook_Open()
StringTable.init
End Sub
3. A többi modul bármelyik makrójából meghívható StringTable.Txt(i) formában az array:
Mikor elkezdtem az Office segéddel ismerkedni, első körben nekem is kint maradt a figyelmeztető buborék. Egyből meg akartam kérdezni, de mert többször is kapkodtam már, gondoltam, előbb körülnézek a neten, hátha találok választ, úgyis volt pár jó Excel-es link-tipp itt a fórumon :)) Nos, tele van a net ezzel a problémával, tényleg valami gond van az Office segéddel. Nekem a WaitMsg.Close segített, azonban ezzel új probléma merült fel, amire már nem találtam választ, ez az üres buborék dolog. Tehát nem tudom, miért nem tűnt el nekem is, és miért jó nekem a .Close, máshol pedig miért nem működik. Fura.
A modeless userform lesz a megoldás, köszi szépen!
És azt hogy csinálod, hogy eltűnjék a végén a buborék? Nekem ott marad, annak ellenére, hogy elvileg végrehajtja ezt a sort:
WaitMsg.Close
Egyébként egy (pl. MsgBox-nak álcázott) modeless userform is alkalmas erre a célra. Itt aztán végtelen a lehetőség a figyelemfelkeltésre. Továbbá (ezt ugyan nem próbáltam, de biztos vagyokbenne, hogy működik) sima szövegdobozt is ki lehet tenni a munkalapra, aztán törölni.
Delila, a StatusBar tartalmának törlését így érdemes végezni:
Application.StatusBar = False
Ha üres sztringet adsz neki, akkor elnémul, és már semmi olyat nem jelez ki, amit normál működés esetén ki szokott.
Érdekes, mióta beírtam ezt a sort az Office segéd buborék megjelenítő részhez:
Application.ScreenUpdating = True
azóta megjelenik a szöveg a segéd buborékjában. Hurrá! Ez azért különös, mert az Application.ScreenUpdating alapból True, nem állítok semmit azzal, hogy ismét igazra állítom. Itt valami nem megbízhatóan működik...
Ez se rossz :-)) Legalább már tudom, hogyan kell a sátutsz-sorba írni, köszi!
Valami feltűnőbb üzenetre gondoltam. Most, hogy este pihent a gép (és én is), gondoltam, hátha friss üde fejjel és procival mégis frissül a segéd buborék, de nem. Pedig ez az office segéd nagyon kézenfekvő és elegáns megoldás lenne.
Egy (viszonylag) nagy táblázatban számításokat végzek makrókkal, ami hosszú másodpercekig tart, és nem feltétlenül van látványos eredménye (nem szaladnak a sorok a képernyőn, hogy nyomon követhető legyen, még dolgozik a makró). Ezért arra gondoltam, az Office segéddel kiíratok egy figyelmeztető üzenetet, ami a makró futása alatt fent van a képernyőn, és mikor eltűnik, akkor feltűnik a user-nek (vagy luzernek, ha éppen én használom a progit), hogy kész a számítás. Így oldottam meg:
Sub TablazatKitoltes
With Assistant .On = True .Visible = True .Sounds = True End With Dim WaitMsg As Balloon Set WaitMsg = Assistant.NewBalloon With WaitMsg .BalloonType = msoBalloonTypeBullets .Mode = msoModeModeless .Heading = "Számítások" .Text = "A táblázat kitöltése alatt légy türelemmel!" .Button = msoButtonSetNone .Animation = msoAnimationGestureUp .Show End With
Az a probléma, hogy nem jelenik meg a figyelmeztető szöveg, csak az üres buborék. Persze valahol ott van a szöveg is, mert ha elmozgatom a segédet, mialatt fut a makró, akkor ott marad a buborék helyén a régi buborék nyoma, és látható lesz a szöveg. Gondolom, a Win nem frissít, ez lehet a gond. Vagy én nem csinálok valamit jól?
Esetleg nem használom az Office segédet, de akkor hogyan lehet figyelmeztető szöveget kiírni (olyan felületre, ami nem ragadja magához a vezérlést és nem vár semmi beavatkozást), esetleg hogyan lehet megoldani, hogy amíg a makró dolgozik, addig az egérkurzor homokóra legyen és csak a makró végén álljon vissza a normális Excel-kurzor?
Üdv mindenkinek,excel ügyben elakadtam.Ma délután óta egy pár excel fájl megynyitásakor az elérési út és megadott név hibájára hivatkozik a program,de úgy,hogy a hibaüzenetben a fájl elérési teljes útja nem jelenik meg,hanem először az első része,aztán több hibaüzenet ablakban szép sorban a név többi része,majd 5-6 hibaüzenet után megnyitja a fájlt.Ötlete valakinek? Köszi előre is.
"Egyébként mivel lehetne helyettesíteni Application.FileSearch elemet?"
Én a Dir() függvényt szoktam használni. A programod átalakítva:
Sub Listáz() Dim FN As String, Fldr As String, lCount As Long
Fldr = "C:\Temp" FN = Dir(Fldr & "*.doc", vbNormal) Do While FN <> "" lCount = lCount + 1 Cells(lCount, 1) = Fldr & "" & FN FN = Dir() Loop End Sub
Kíváncsi vagyok, vajon ez megoldja-e az eredeti problémát. Bár nem hiszem... Szerintem ez valami Exceltől független, Windows-os pufferelés dolog lehet. Azért teszteld, aztán kérlek, jelezz vissza.
Beolvasom a word forrásfájlokat, amikből adatokat emelek át egy táblába, majd ezekből különböző kimutatásokat készítek. A probléma akkor jelentkezett, amikor teszteltem az eljárásokat és a meglévő forrásfájlokhoz másoltam vagy készítettem újakat. Ekkor a Application.FileSearch rutint futtatva nem listázta ki az új fájlokat.
Egyébként mivel lehetne helyettesíteni Application.FileSearch elemet?
Nálam nem jelentkezik ez a késés, vagy ha igen, akkor 2-3 másodpercnél rövidebb, és ezért nem veszem észre. Nálad hogy van? Programmal hozod létre a fájlt, és rögtön utána futtatod ezt a listázó szubrutint?
Próbáltam utánanézni a neten ennek a kérdésnek, de használható infót nem találtam. Viszont azt igen, hogy az Application.FileSearch elemet az Excel 2007-ből kihagyták a fejlesztők, mert problémásnak találták. Szóval hosszú távra nem biztos, hogy érdemes tervezni vele.
Kezdő kérdésem lenne. Az alábbi kis programmal egy adott mappában található *.doc fájlok neveit íratom ki. Ez idáig rendben is van.
A problémám az, ha egy új fájlt másolok vagy hozok létre az adott munkakönyvtárban és újból futtatom a keresést, ezt az új fájlt (nem találja meg?) nem listázza ki.
Ami érdekes, ha nem közvetlenül a másolás vagy létrehozás után, hanem egy kis idő elteltével futtatom a keresést, az eljárás rendben, már új fájlt is tartalmazva írja ki a mappa tartalmát. Vajon miért?
Sub FileList()
With Application.FileSearch .NewSearch .LookIn = "C:TMP" .FileType = msoFileTypeWordDocuments .SearchSubFolders = False .Filename = "*.doc" If .Execute() > 0 Then For lCount = 1 To .FoundFiles.Count Cells(lCount, 1) = .FoundFiles(lCount) Next lCount End If End With
A munkalap vezérlőinek kódját a munkalap objektumba tettem, szerintem logikailag oda illik, nem külön class modulba. Ekkor persze kell init függvény, hogy mielőtt használni szeretném a vezerlőket, be legyenek állítva az objektum változói. Ezt az inicializáló kódot muszáj public-nak definiálni, hogy a Workbook_Open eseménykezelővel elindíthassam, és erre az init-re más nem hivatkozik, tehát egyszer fog lefutni, minden megnyitáskor, mielőtt még bármi bármit is csinálna. Hurrá! Eddig ez rendben is volt, a fogfájásom amiatt volt, hogy így megjelent az Excel menüben a Munkalap8.init makró, ami eléggé luzer megoldás. Csak annyit kellett tennem, hogy az init nem sub, hanem function lett :)) így már sehol nem jelenik meg a menüben (sem a makrók sem a függvények között), viszont publikus maradt, nem kellett kiszedni a logikailag ésszerű helyéről, és el tudom indítani a szükséges időben.
Most értem haza a munkahelyről, kipróbálnám amit irtál, de még addig sem jutok el, hogy mi az a Sub sorba() és hogy hova is kell beirni ezt az egészet, hogy működjön.
2) Workbook moduljára Private Sub Workbook_Open() Set ChkBox(1) = Munka1.chk1 Set ChkBox(2) = Munka1.chk2 ... stb...
End Sub
Ha a checkbox-ok nem az Űrlapok eszköztárból, hanem a Vezérlők eszközkészletéből származnak, akkor ennek működnie kell. És akkor, mivel publikos tömbről van szó, már akármelyik modul akármelyik szubrutinjából el lehet érni.
Szintén nem vagyok programozó, az Excel-t is csak most tanulgatom. Hagyjuk a konstruktorokat. Mert nem ismerem a basic-ot, ezért lehet, nem is olyan logikával közelítek hozzá, ami ide kellene.
Van egy "Beállítások" munkalap, ahol igen-nem checkbox-okat helyeztem el, ahol ilyen-olyan opciókat lehet ki-be kapcsolgatni. Az opciókat <név>_Change() eseménykezelővel állítom be. 22 db ilyen választókapcsoló van, mind CheckBox típusú objektum. Létrehoztam egy ChkBox() tömböt, ami az objektumokat tartalmazza:
Dim ChkBox(22) As Object
Az init függvény csak ennyit csinál, hogy feltölti a ChkBox tömböt:
Private Sub init()
Static initLoad As Integer initLoad = initLoad + 1 If initLoad > 1 Then Exit Sub
Set ChkBox(0) = chk1
...
Set ChkBox(21) = chk22
End Sub
Ezután már így hivatkozhatok a vezérlőkre: ChkBox(i), ezzel a kódban bármelyik vezérlőt lekérdezhetem, nem kell az eredeti nevükre hivatkozni. Pl, ha az érdekel, hogy van-e egyáltalán akár csak egyetlen igen-re állított érék, ezt kell tegyem:
Public Function VanIlyen() As Boolean 'Van-e igen-re állított jelölőnégyzet?
Dim i As Integer For i = 0 To 21 If ChkBox(i).Value Then VanIlyen = True Exit Function End If Next i
VanIlyen = False
End Function
De ez csak úgy működik, ha előbb lefutott az init metódus, tehát most ez nem fog lefutni, így javítom:
Public Function VanIlyen() As Boolean 'Van-e igen-re állított jelölőnégyzet?
"Továbbra is kérdésem, van-e az Excel makróban az objektumoknak konstruktora, azaz olyan metódusa, ami az első példány meghívásakor lefut és ezt a kódot meg lehet írni?"
A válasz röviden: nem tudom.
Hosszabban: Én nem vagyok programozó, csak egy lelkes amatőr, és a "konstruktor" fogalma nem teljesen világos számomra. Ezért aztán nem is értem a kérdést kristálytisztán. Már csak azért sem, mert nem tudom, mit értesz "objektum" alatt.
Azt tudom, hogy ha készítesz egy új objektumosztályt, annak van Initialize eseménye, amit a a Class Modul-on lehet lekódolni. De ez minden egyes példány esetében, annak létrehozásakor lefut, vagyis, ha a definíciódat nézzük, ez nem konstruktor.
Ha tisztában lennék a projekted részleteivel, talán tudnék kerülő megoldást javasolni. De ha ragaszkodsz a konstruktoros verzióhoz, kétlem, hogy segítségedre lehetek.
Igen, olyan kódot szerettem volna írni, ami az objektumra való első hivatkozáskor lefut és többször nem. Ezért gondoltam, hogy a Workbook_Open eseménykezelőnek kell ezt az inicializálást elvégezni. Viszont a kód az objektum része, olyan változókat állít be, amik private-ok, így ennek az inicializáló rutinnak publicnak kell lennie, hasonlóan a példányosítható objektumok konstruktoraihoz.
Végül átszerveztem a makróimat és ahol beállítandó változókat használok, oda beírtam egy-egy szubrutinhívást, illetve az inicializáló rutin elejére ezt:
Static initLoad As Integer initLoad = initLoad + 1 If initLoad > 1 Then Exit Sub
így a kód csak egyszer fut le. Továbbra is kérdésem, van-e az Excel makróban az objektumoknak konstruktora, azaz olyan metódusa, ami az első példány meghívásakor lefut és ezt a kódot meg lehet írni?
Sub sorba() Dim rng1 As Range, rng2 As Range Set rng1 = Range("C10:J10") Set rng2 = Range("K10:R10") rng1.Offset(1).EntireRow.Insert rng1.Copy rng2.Offset(1)
Első körben azon a példán próbáld ki, amit kép formábyn feltöltöttél. A vastagított részekbe helyettesítsd be a két cellatartományt. rng1 legyen a sárga rng2 legyen a kék
Aztán kipróbálhatod ott is, ahol szükség van rá.
Én leteszteltem úgy, hogy a sárga és kék cellákban csak konstans számok voltak, és úgy működik.Kipróbáltam úgy is, hogy volt a sárgában pár olyan képlet, amelyekben csak fix (tehát $A$1 típusú) cellahivatkozások voltak, és az is működött. Amikor viszont a képletben futó oszlop- vagy sorindex van (tehát $A1, A$1, A1 típusú cellahivatkozás), akkor nagy valószynűséggel elhasal a dolog, mivel sorbarendezésnél az Excel automatikusan módosítja a képleteket.
Közben rájöttem, hogy at 1) kérdésem hülyeség volt. De akkor azt nem értem, hogy a narancssárga meg a kék meg a zöld számok hogyan helyezkednek el egymáshoz képest. Tudnál esetleg egy képet feltölteni erről?
Kezdek megvilágosodni. Tehát az a feladat, hogy az A1:AN1 tratományt kell az AO1:CB1 tartomány szerint sorbarendezni. Ha jól értem, ez nem okozna gonndot pl. akkor, ha az A1:AN1 tartomány az AO1:CB1 alatt lenne, tehát AO2:CB2-ben, igaz?
Ha így van, akkor további kérdéseim vannak. 1) vannak-e az A1:AN1 tartományban képletek, vagy esetleg csak konstans számok/betűk? 2) az a többezer sor, amit így kezelni kellene, hogyan helyezkedik el? Pl. A1-től lefelé egy 3000 soros összefüggő tatomány? Vagy minden második sorban?
Rendezze a narancs sárga számokat a kék számok szerint. De úgy, hogy adott sorban még más adatok is vannak, itt zölddel, a sorbarendezés viszont csak bizonyos tartomány, bizonyos tartomány szerint történjen. Itt narancs sárga számok kék számok szerint. Eredmény ez lenne, zöld békénhagyva, narancs sárga számok kék szerint rendezve. 23 3 4 6 4 1 4 2 3 5 6 8 7 2 3 4 5 6 7 11 20 2 4 34
Sorbarendezendő számok
1
2
3
4
5
6
7
8
2
4
5
3
6
7
20
11
Most, ha alsó sor szerint rendezzük a felsőt: eredmény a következő. Tiszta sor ez nekem is megy.
1
4
2
3
5
6
8
7
2
3
4
5
6
7
11
20
De mi van akkor, ha ugyan ezt az ededményt szeretném elérni egyetlen soron belül, méghozzá igy:
23
3
4
6
4
1
2
3
4
5
6
7
8
2
4
5
3
6
7
20
11
2
4
34
Rendezze a sárga számokat a kék számok szerint. De úgy, hogy adott sorban még más adatok is vannak, itt pirossal, a sorbarendezés viszont csak bizonyos tartomány, bizonyos tartomány szerint történjen. Itt sárga számok kék számok szerint.
Eredmény ez lenne, piros békénhagyva, sárga számok kék szerint rendezve.
23
3
4
6
4
1
4
2
3
5
6
8
7
2
3
4
5
6
7
11
20
2
4
34
Hát, lehet, hogy erre a problémára nem gondoltak az excelben.
Nekem azért lenne fontos, hogy sorokra nézve tudjam ezt a sorbarakást elérni, mert előtte már bizonyos képletekkel számoltam eredményeket és ezeket kéne az előzó hozzászólásban leirtak szerint sorbatenni.
Oszlopokban viszont meg sem próbálnám, mert kevés oszlop van, több ezer sorban kellene ezt elvégezni, mindig az adott sorban szereplő eredményekkel.
Egyébként én nem igazán, vagyis egyáltalán nem ismerem hogy kell makrót késziteni.
A másik kérdésem esetleg, hogy egy munkalalap méretét meg lehte-e növelni.
Tehát ne 256 oszlop legyen, hanem annyi ,amennyit én akarok, mondjuk 3000.
Ja és ha tudsz, a makrokrol irhatnal valami helyet, ahol tanulhatnék róluk.
A leírásodból nem derül ki, hogy a munkalapokból miért kell elérni azt az Init szubrutint. Innen nézve úgy tűnik, hogy csak a Workbook megnyitásakor kell egyszer lefutnia, és semmi több. Ez esetben viszont a Workbook kódlapján is elhelyezheted. Akkor nem kell publikusnak lennie, és a Workbook_Open-ből mégis meg tudod hívni.
Sziasztok! A makrókkal mostanában ismerkedek, lehet buta kérdésem van, előre is bocsánat!
A munkalap objektumban megírom az eseménykezelőket, amelyek csak azokban meghívott függvényeket használnak, ez rendben, az ilyen függvények private-ok lettek. Csakhogy, amint megnyitom a file-t, pár dolgot be kell állítani (konstruktor-szerűséggel inicializálom az objektumot), amit úgy oldottam meg, hogy egy init nevű publikus függvénybe írtam a kódot, amit a Workbook_Open eseménykezelő hív meg. Ha nem publikus lenne az init függvény, akkor nem tudnám a munkalap objektumban elérni. Mindez idáig rendben is van.
Csakhogy ennek a publikus init függvénynek a neve megjelenik az Excelben az Eszközök/Makró/Makrók... ablakban, azaz a felhasználó látja és akár el is indíthatja. Noha bajt nem okoz, ha többször is lefut, de nem elegáns, hogy olyan szubrutin neve is láthatóvá váljon, amivel a felhasználónak (nekem) nincs semmi dolgom.
Mit tehetnék, hogy ne is legyen Excel menüből látható, de objektumon kívülről is futtatható legyen az a függvény?
Szép feladat...:) Megróbáltam makrózni, de csak eddig jutottam:
Sub sorrend() Range("A1:CB1").Select Selection.Sort Key1:=Range("AO1"), _ Key2:=Range("A1"), _ Orientation:=xlLeftToRight End Sub
Ez így azért nem jó, mert az egész sort rendezi be növekvőbe, nem a két sorrészt. A dolog azért is érdekes, mert ha ugyanezt megcsinálod két oszlopra, akkor ez a makró (átírva oszlopokra) működik. Elvileg sorra is működnie kéne, és mégse...
De mi van akkor, ha ez a két adatsor egymás után egy sorban helyezkedik el. Ráadásul úgy, hogy még előtte vagy utána más adatok, vagy képletek is vannak a sorban.
Hogy tudom itt a sorba rendezést megoldani. Azt hogy rendezze emelkedő sorrendbe az AO1-től, CB1-ig terjedő számokat az A1 től AN1 ig lévő számok szerintit.
Az a helyzet, hogy különböző userformokon gyűjtögetem a makróimat, mint öreg nénik a nejlon zacsikat, és olykor-olykor szükség van arra, hogy az egyik makró elindítson egy másikat. A legkényelmesebb megoldás, hogy átírom a makrók private sub neveit sub-ra, és így nem kell új struktúrákat létrehoznom, használhatom a kis megszokott makróimat továbbra is.
Szerintem nem szerencsés dolog egyik objektum eseménykezelőjéből meghívni a másikat. Inkább azt javasolnám, hogy pakold ki egy külső szubrutinba a két eseménykezelő közös részét. Nem csak tisztább dolog, de áttekinthetőbb is.
Pl Form1-en:
Private Sub CommandButton1_Click() .... Kozos_makro End Sub
Sub Kozos_Makro() ... End Sub
Form2-n Private Sub CommandButton1_Click() .... Form1.Kozos_makro End Sub
Function Van_Settings As Boolean() Dim ws As Worksheet On Error Goto hiba Set ws = ThisWorkbook.Sheets("Settings") Van_Settings = True Exit Function hiba: Van_Settings = False End Function
If Van_Settings Then ... Else ... End If
Ez a módszer (azt hiszem) bármilyen objektumtípusnál használható. Deklarálsz egy megfelelő típusú változót, hozzárendeled az objektumot, és ha hiba van, akkor az azt jelenti, hogy az objektum nem létezik.
Az eljárás: beszúrok a vba szerkesztőbe két userformot. Ráteszek a két userformra egy-egy commandbuttont. A commandbuttonok mögé írok egy-egy makrót, amik a commandbutttonokre való ráklikkeléssel futnak le. (A programnevek a következők lesznek: Private Sub CommandButton1_Click(), mindkét userformon.) Meghívom az első userformot és ráklikkelek a commandbuttonre. Azt szeretném, ha az első makró lefutása után induljon el a másik userformon lévő commandbutton mögé írt makró is.
A következő dolgot nem tudom megoldani és ezért kérném a segítségeteket: van két userform, mindegyiken egy-egy command button, mögöttük egy-egy program. Hogyan lehet elindítani az egyik programból a másikat?
Megint belefutottam egy problémába. Lényegében az a kérdésem, hogy egy nemlétező objektumot hogyan tudok úgy lekezelni, hogy ne hibaüzenettel álljon le a makró (azaz el sem indul, kidob egy "Variable not defined" üzenettel).
Leírom, mit csináltam, hátha így könnyebben kiderül, mit szeretnék és hol rontottam el. Egy (elég nagy) adathalmazt kimásolok az "Analysis" nevű munkalapra. Makrók segítségével ezekből ilyen-olyan számítások után elkészülnek az adatlapok. Eddig minden ok, a számításokhoz szükséges beállítások (számok és logikai értékek) is a makró modulban voltak. Gondoltam egy nagyot, és a beállítási adatokból készítettem egy Excel Objectet, mégpedig úgy, hogy létrehoztam egy "Settings" munkalapot, ezen állítgatom be az értékeket, majd publikus függvényekkel lekérdezem az egyes cellák értékét, amit majd a makróból hívok meg. A publikus lekérdező függvények ott vannak, ahol az eseménykezelő is, így ezek az objektum függvénymezői lettek. Innentől a makró a beállításokat nem a makróból veszi, hanem a direkt erre a célra létrehozott munkalap publikus függvényeivel éri el. Minden jól működik. Azám, de mi van, ha kitöli valaki ezt a lapot? Akkor is működni kellene a makrónak, csak akkor maradnának a makróban definiált alapértelmezett beállítások. Ezt csináltam:
If Settings Is Nothing Then
...
Else
...
End If
A "Settings" név nem a munkalap neve, hanem a "Munka8" alapértelemezett nevet írtam át, hogy ez az object neve legyen. Ha kitörlöm ezt a munkalapot, akkor a nemlétező Settings munkalap esetén jön a "Variable not defined" üzenet.
1. http://vbaexpress.com/forum/ 2. http://www.cpearson.com/excel/MainPage.aspx 3. http://www.ozgrid.com/VBA/ 4. Ez egy Microsoft oldal, talán az MSDN-en valahol, de most sehogy se találom 5. még kiadó :)
Na megvan a negyedik is. Nagyon hasznos, bár sok helyen szóról szóra egyezik a Help-pel.
A Target nevű, Range típusú változó tartalmazza azt a tartományt, ami megváltozott. Ez lehet többcellás is egyszerre, pl akkor, amikor sok kijelölt cella tartalmát törlöd egyszerre a DEL gombbal.
Arra figyelj, hogy ha az eseménykezelőn belül megváltoztatod a Target cella/tartomány tartalmát, akkor az eseménykezelő meghívja önmagát, és végtelen ciklusba kerülsz.
Na jó, többet nem kapkodok, bocsánat. Szóval maga az eseménykezelő visszaadja ezt a Target változóban. Máskor mielőtt beírok, vagy félórát várok, hátha rájövök magamtól is és nem szemetelek ide...
Sziasztok! Egy munkalap Worksheet_Change eseményét szeretném programozni, és le szereném kérdezni, melyik cella (régió?) megváltozása okozta az eseménykezelő meghívását. Ha az ActiveCell.Address éréket lekérdezem, akkor nem azt a cellát adja vissza, ami megváltozott, hanem ahová a megváltozás után ugrott, azaz enter leütés után a cella alatti cella címét, ha meg egérrel kattintok ki a cellából, akkor akár jó messze is lehetek a változás helyétől. Köszi előre is a segítséget!
"12/1/1999. Ezt adja vissza." Milyen év, hónap és nap beállítása esetén adja ezt vissza?
"(nem magyar dátum rendszer szerint dolgozom.!)" Ezt még korai volt közölni, ráért volna azután is, ha már két napot foglalkoztunk a kérdéssel. Sőt, egyéb részleteket sem kell leírnod, hadd találjuk ki őket félmondatokból. Ettől kihívás. :P
1. http://vbaexpress.com/forum/ 2. http://www.cpearson.com/excel/MainPage.aspx 3. http://www.ozgrid.com/VBA/ 4. Ez egy Microsoft oldal, talán az MSDN-en valahol, de most sehogy se találom 5. még kiadó :)
Felhívnám a figyelmedet a két pirossal karikázott mezőre, amelyek segítségével nagyon egyszerűen ki lehet deríteni, hogy egy-egy objektumnak milyen eseményei vannak.
Köszi szépen! Megint van egy problémám. Honnan tudom lekérdezni, hogy egy munkalapon be van-e kapcsolva az AutoFilter? Illetve ha én akarom makróból beállítani, akkor a Munkalap.Rows("1:1").AutoFilter ki-be kapcsolgatja a szűrőt, pont mintha menüből ki-be kapcsolgatnám, azaz ha volt szűrő, akkor kikapcsolja, ha éppen nem volt, akkor meg bekapcsolja. Tudni szeretném, a kérdéses lapon van-e szűrő, ha igen, akkor kikapcsolom azt és olyat állítok be, amilyen kell, ha nincs, akkor értelemszerűen olyat állítok, amilyen kell. Köszi előre is!
Ja, a másik kérdés. Nem biztos, hogy jobb megoldás, de bizonyos esetekben alkalmazható a "kikommentezendő" rész átugrása, a vezérlés eltérítése, pl. GoTo valami, vagy Exit Sub, vagy hasonlók által.
Azt szeretném kérdezni, hogy makróban több soros kommentet hogyan lehetne a legegyszerűbben megoldani? Arra gondolok, van-e olyan, mint az assemby-ben a comment <syb> - <syb> páros, vagy a /* - */ C-ben és java-ben? Adott esetben nem kényelmes egy szakasz minden sora elé beírkálni a '-jelet. Esetleg van jobb megoldás?
"De elsősorban: A VBA beépítetthelp-je nagyon jó szrtem."
Csatlakozom. No meg a makrórögzítő. Én ha ha nem tudom, hogyan kell egy bizonyos dolgot Excelben leprogramozni, először mindig a makrórögzítővel próbálkozom, hogy legalább az alapvető dolgokkal tisztában legyek. Kezdőknek mindenképpen ajánlott. És az internet is kimeríthetetlen tudásforrás. Van legalább 8-10, esetleg több olyan fórum a neten, ahol elképesztően nagytudású Excel-guruk (is) osztják az észt.
Aztán van olyan is, ami nem fórum ugyan, de a fórumokon forrásként hivatkoznak rá. A Top5 egyike: http://www.cpearson.com/excel/MainPage.aspx
Angolul persze tudni kell hozzá, de az általában nem árt, ha az ember programozásra adja a fejét, mivel a súgó leggyakrabban angol nyelvű.
Könyvet sajnos nem tudam volnam mondani, mert sosem használtam erre a célra. Köszönöm Robbantómesternek, hogy kisegített a válaszadással.
Szia, Nagyon köszönöm, tökéletesen érthető a leírásod. Köszönöm a segítséget is. (még egy apró kérdés: esetleg nem tudsz, tudtok szakkönyvet amit érdemes lenne megvenni, amiből tudnék tanulni? Pl. ezt vagy a makrókat...)
Te is cseréld ki a SorokSzama és az i típusát, ha előfordulhat 32767-nél több sor, mert ilyenkor a .Count nullát ad vissza (azaz túlcsorduláskor 0 lesz az értéke). Legyen tehát így:
Tehát makróban a tizedest mindig a '.' jelzi területi beállítástól függetlenül. Ezt én is itt a fórumon tanultan Jimmy-től. Ezért képeltbe a 20% áfát 1.2-nek kell írni, de amint majd látod, a cellába már az 1,2 fog kerülni :)
Úgy kell érteni, hogy ez egy esemény-kezelő rutin. Mostanában a programozásban általános, hogy a különféle objektumoknak vannak eseményei, amiket a rendszer figyel, és ha valamelyik esemény bekövetkezik, a hozzárendelt kód automatikusan lefut.
A legegyszerűbb példa a nyomógomb, és annak "OnClick", vagyis "Kattintásra" eseménye. Ez - értelemszerűen - akkor hajtódik végre, amikor a felhsználó a gombra kattint. De van a gombnak olyan eseménye is, hogy pl. "MouseMove". Ez akkor következik be, amikor a felhasználó úgy mozgatja az egérmutatót, hogy az a gomb fölött bármekkora távolságot megtesz. Vagy egy másik példa: egy programban különféle beviteli mezőket kell kitölteni, és amikor az egyikbe beírsz egy adatot, és továbblépsz a másikra, az első utánad szól, hogy rossz adatot vittél be. Ez úgy történik, hogy a beviteli mezőnek van egy "OnExit" azaz "Kilépésre" eseménye, ami akkor következik be, amikor a kurzor elhagyja azt a mezőt. A programozó ezt az eseményt arra használta fel, hogy megvizsgálja az éppen bevitt adatot, és ha az nem érvényes, figyelmeztetést küldjöna felhasználó felé.
A különféle események lekezelése lehetőséget ad a programozónak, hogy a programot minél interaktívabbra tervezze, és minél jobban kézben tartsa a különböző eshetőségeket.
A munkalap is egy objektum, amelyet úgy terveztek meg, hogy számos lehetséges, és külön-külön lekezelhető esemény tartozik hozzá.
A munkalap eseményei között van olyan, hogy OnChange, vagyis kb. "Változásra". Ezt hasnáltam fel én is. Ez akkor hatódik végre, amikor a munkalapon bármelyik cella tartalma megváltozik. Ezzel a felhasználónak nem kell törődni. A rendszer maga figyeli, hogy az esemény bekövetkezik-e, és amikor bekövetkezik, a hozzá rendelt kódot lefuttatja. Tehát a kód, amit írtam, és az eseménykezelő rutinok általában, nem futnak a háttérben állandóan, viszont az objektumok eseményfigyelői igen, és ezek hívják meg az eseménykezelő rutinokat, de csak amikor szükség van rá.
A kódot, amit írtam, a munkalap kódlapján kell elhelyezni. A Visual Basic szerkesztő bal felső rszén duplán kattintasz a kívánt munkalapra, és a jobb oldalon kinyíló kódlapra bemásolod a kódot. Onnatól kezdve az adott munkalap bármely cellájának megváltozásakor a rutin le fog futni.
Köszönöm szépen, működik; sőt, tovább is akartam gondolni. Ha van egy perc időd, megnéznéd, hogy szerinted ez hol hasal el? Const Db As Integer = 1 'A oszlop Const Megnevezes As Integer = 2 'B oszlop Const Egysegar As Integer = 4 'D oszlop Const Nettoertek As Integer = 5 'E oszlop Const Bruttoertek As Integer = 6 'F oszlop
Dim SorokSzama As Integer SorokSzama = Termekek.Columns(Megnevezes).SpecialCells(xlCellTypeConstants).Count + 3
Dim i As Integer Dim helyes_nettoertek As String Dim helyes_bruttoertek As String
For i = 6 To SorokSzama helyes_nettoertek = "=A" & i & "*D" & i helyes_bruttoertek = "=E" & i & "*1,2" If (Termekek.Cells(i, Db).Formula = "") Then Termekek.Cells(i, Db).Formula = 0 Termekek.Cells(i, Nettoertek).Formula = helyes_nettoertek Termekek.Cells(i, Bruttoertek).Formula = helyes_bruttoertek Next i
A cél ugye az, hogy ha felvesz az user egy új terméket, akkor beírja a megfelelő képleteket, illetve ha nem vett még fel mennyiséget, akkor beír egy 0-t. A nullák és a nettók működnek, a bruttó oszlophoz hozzá sem nyúl.
Egy igazán robusztus megoldáshoz tudni kellene, hogy az A oszlopban hogyan helyezkednek el a rendelésüsszegek. Pl. A2-től lefele, vagy A10-től A19-ig, aztán egy sor kimarad, aztán A21-től A31-ig, stb.
A másik kérdés, hogy az A oszlopba beírt értéket hogyan, tehát milyen algoritmus szerint kell szétosztani a C, D, vagy E oszlopok között?
Feltételezve, hogy A2-től lefelé, összefüggő az adatsor, továbbá feltételezve, hogy az A-ba írt értéket egy az egyben az E oszlopba kell beírni, az én megoldásom kb. így néz ki:
Private Sub Worksheet_Change(ByVal Target As Range) Dim ValidTarget As Range Set ValidTarget = Range("A2", Range("A" & Rows.Count).End(xlUp)) If Not Intersect(Target, ValidTarget) Is Nothing Then Application.EnableEvents = False Target.Offset(, 4) = Target Target.Formula = "=SUM(" & Target.Offset(, 2).Resize(, 3).Address & ")" Application.EnableEvents = True End If End Sub
Magyarpityu megoldásához képest annyi az előnye, hogy automatikusan működik, meg kicsit rövidebb.
Dim Termekek As Worksheet Set Termekek = Worksheets(MunkalapNev) If Err.Number > 0 Then MsgBox "Nincs " & Chr(34) & MunkalapNev & Chr(34) & " nevű munkalap!" Exit Sub End If
Const OsszesRendeles As Integer = 1 'A oszlop Const Megnevezes As Integer = 2 'B oszlop Const Bolt1 As Integer = 3 'C oszlop Const Bolt2 As Integer = 4 'D oszlop Const Bolt3 As Integer = 5 'E oszlop
Dim SorokSzama As Integer SorokSzama=Termekek.Columns(Megnevezes).SpecialCells(xlCellTypeConstants).Count
Dim i As Integer Dim Sum As String
For i = 2 To SorokSzama Sum = "=SUM(C" & i & ":E" & i & ")" If Not (Termekek.Cells(i, OsszesRendeles).Formula = Sum) Then Termekek.Cells(i, Bolt3) = Termekek.Cells(i, OsszesRendeles).Value Termekek.Cells(i, OsszesRendeles).Formula = Sum End If Next i
End Sub
****
Tehát a "Termékek" munkalap oszlopait kell javítani. Ha egy sorban az összes rendelés oszlopában (ez az A oszlop) nem a 'szum(Cx:Ex)' képlet van, akkor az ott talált számot beírja az adott sor E oszlopába, majd az A oszlopba beírja a szum(Cx:Ex) képletet. Első közelítésre ennyi, lehet még finomítani, hogyan ossza szét a terméket a boltok között, stb.
Sziasztok! Egy érdekes kérdéssel állok szemben: Van egy táblám, kb. így néz ki: B oszlop: termék neve; C oszlop: 1-es bolt rendelése ebből a termékből, D: 2-es bolt rendelése, E: 3-asé, stb.; A oszlop: szum(Cx:Ex). Felmerült az igény, hogy ne kelljen mindig a c, d, e... oszlopokba "elsétálni", és beírni a mennyiségeket, engedjük, hogy az A-ba is beírja, és majd szétosztják a boltok között ahogy akarják. Ez így rendben is van, viszont ha egyszer valaki beleír az A oszlopba, akkor ugye tönkre teszi az eredetileg beírt képletet. Úgy gondoltam, hogy talán lehetne rögzíteni egy makrót, ami megnézné az A oszlopot, és ahová be van írva rendelés, azt fogná, és ugyanannak a sornak beírná pl. az E oszlopába, a helyére pedig visszaírná a szum (Cx:Ex) képletet. Szerintetek? Az elmélet megvan, de a gyakorlattal elhaltam, sajnos nem tudom, hogyan lehetne megvalósítani. Nagyon köszönök minden segítséget!
Segítséget szeretnék kérni excelből makróval történő word *.doc megnyitása, és az abban található táblázat excelbe történő átmásolásában. Ez utóbbi nem megy, itt akadtam el.
Sub Rögzítés1() Dim word As Object
Set word = CreateObject("Word.application")
With word '.Visible = True .Documents.Open "C:próba.doc" .ActiveDocument.Tables(1).Range.Select End With
Egyelőre csak az első mondatodhoz van erőm választ írni: Azt mindig lekezelem, ha nem a megfelelő cella az aktív. Ha debugban léptetem tovább kiakadás után, nyilván benne rejlik az a hibalehetőség, amit írsz - erre odafigyelek. A program olvashatóságát viszont valóban rontja - na de mit tudsz használni helyette, mivel tudod "pótolni". Én azt hiszem, nehezen tudnám nélkülözni. Nem tudok rutinszerűen mást kitalálni, inkább viselem a következményeit. Egyelőre. Amíg el nem sajátítom, hogy kerüljem ki a használatát.
A bejárási sorrendet a form tervező felületén lehet beállítani. Jobb gomb a formon, és Tab Order. (Ezt Delilától tanultam nem olyan rég.)
A Tab elvileg ugyanúgy kiváltja az AfterUpdate eseményt, mint az Enter, feltéve, hogy a textbox tartalma megváltozott. Ha mindig ugyanaz az érték van benne, akkor sem Enter, sem Tab után nem lesz AfterUpdate
Ha pedig bejárási sorrendtől függetlenül akarsz egy bizonyos vezérlőre lépni, akkor (pl. textbox exetén) TextBox2.SetFocus
Azért, mert bizonytalan. Nem tudhatod, hogy mi lesz az aktív cella, amikor a programodat indítod. Nem biztos, hogy mindig eszedbe jut kijelölni a megfelelő cellát, mielőtt egy szubrutint elindítasz, és ha rossz helyről indítod, esetleg totál elbarmolja a táblázatodat. Aztán visszavonni meg nem lehet Vagy ha a programod tesztelés közben hibával megáll, és belépsz a debug üzemmódba. Sorról-sorra, lépésenként futtatod a programot, és közben vissza-visszanézel a táblázatra, hogy lásd, mi történik. Egyszer véletlenül belekattintasz, és megváltoztatod az aktív cella helyét. Vagy átkapcsolsz egy másik munkalapra, hogy ellenőrizz valamit, és elfelejtesz visszakapcsolni. Onnatól kezdve a programod rosszul megy tovább.
Vagy tegyük fel pl. hogy van egy ilyen felépítésű programod:
Sub szubrutin1() Do 'mindenféle műveletek cellákkal If Activecell.Value = "" Then szubrutin2 If Activecell.Value = "1" Then Exit Do ActiveCell.Offset(1).Activate Loop End Sub
Sub szubrutin2 Darab = Inputbox("Hány cellát töltsek fel?") For I=49 To 49+Darab-1 ActiveCell= Chr(i) ActiveCell.Offset(,1).Activate Next End Sub
Jól látható, hogy mindkét szubrutinban az értékkel feltöltendő cellát aktiválással jelöltem ki. Namost, a második szubrutinban van egy bizonytalan tényező: a felhasználó. A felhasználótól függ, hogy hány cellával megy jobbra az aktív cella a szubrutin futása során. És amikor a vezérlés visszatér a szubrutin1-be, mi történik?
És a felhasználó nem az egyetlen, aki előre nem tudható információt adhat át a programnak. Így az aktív cella összevissza bolyonghat, és csak nagy kínok árán lehet nyomon követni, hogy éppen hol kell tartózkodnia.
Persze, ha valaki zseni és elég kitartó, akkor az aktív cellával is lehet operálni hosszútávon is. De rengeteg hibalehetőséget rejt magában, mert ha valahol elfelejted oda tenni az aktív cellát, ahol a következő szubrutin várja, akkor kiakad a programod, és keresheted, hogy miért.
Emellett a program olvashatóságának sem tesz jót. Írsz egy programot, amiben nagy kínok árán végigköveted, hogy mikor, milyen művelet után hová kerül az aktív cella, és mindig jó helyre teszed, hogy rendben lefusson. Félév múlva előveszed újra a programot, mert kicsit módosítani kellene rajta... és rájössz, hogy fogalmad sincs már, hogyan működik. Mikor hol az aktív cella, és hogyan kellene beavatkozni, hogy azt csinálja, amit szeretnél.
Na de ennyi hegyibeszéd elég is. Lehet, hogy saját bőrödön kell megtapasztalnod a hátrányait, hogy elhidd nekem ;)
hát csináltam egy félmegoldást, mint lelkes amatőr.
Private Sub TextBox1_AfterUpdate() ActiveCell.Value = TextBox1.Value ActiveCell.Offset(1, 0).Activate Application.SendKeys ("+{TAB}") End Sub
És ráraktam a forma egy parancsgombot, onnan vissza ugrik SendKey segítségével. nem vagyok rá büszke, csak gondoltam tanulhatok más kritikájából - ha lesz.
Robbantómester, a textboxod formon van? Nekem igen, és az Enter lenyomása nem váltja ki az AfterUpdate eseményt, és így nem is történik semmi.... Neked hogyan műxik?
Húhh. Ezt fel kell dolgoznom, tényleg nem olyan egyszerű :)
Köszönöm szépen, ez nagyon jó. Mondjuk már nekiláttam az előzővel megodani a feladatot és már majdnem kész is, de szerintem megéri átirni. Mégegyszer köszönöm.
Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer) Dim sor As Long, pos As Long, CS As String If KeyCode = 13 Then CS = TextBox1.ControlSource Range(CS) = TextBox1.Text pos = InStrRev(CS, "$") sor = Mid(CS, pos + 1) TextBox1.ControlSource = Left(CS, pos) & sor + 1 TextBox1.Text = "" End If End Sub
Ajánlott a textbox controlsource tulajdonságát "$A$1" (tehát nem "A1") formában megadni.
Na, hát úgy látom, nem kapkodták el a feladatot. Összeütöttem egy formot. Letöltés Csomagold ki, tedd be a két fájlt valahová, aztán Excel VB Editorban importáld a formot. Aztán írj egy Sub-ot, ami megjeleníti a formot, a többi már magától értetődő lesz.
Ja, a letöltéshez jelszót is állítottam be, amely a következő: byszka
Van olyan lehetőség, hogy pl. a program megkeresni egy mappában az összes (valamilyen feltételnek eleget tevő) xls fájlt, és azt a formon, pl. egy listboxban kilistázza. (1.ábra)
Vagy van olyan is, hogy egy Fájl-megnyitás szerű ablakban, tallózva lehet kiválasztani a megfelelő munkafüzetet. (2. ábra)
Egy kis kiegészítés. Konrétan arra lenne szükségem, hogy a felhasználó kiválaszt egy tetszőleges .xls-t és annak az elérési útvonala lenne pl. az "eleres" változó. Ezzel a változóval tudnék fgv-t létrehozni.
Van egy táblázatom amiben termékek vannak. Jelenleg van egy makro ami bizonyos feltételek (amit a felhasználó a form-on beállít) szétválogatja külön munkalapokra a termékeket és amikor végzett a válogatással elmenti a fájlt az aktuális dátum néven. S azt szeretném ha a válogatás közben bizonyos feltételek szerint összehasonlítana. Ehhez kellene, hogy ki lehessen választani melyik régi fájlt szeretném összehasonlítani a jelenlegivel.
Ismét lenne egy kérdésem. Milyen megoldást tudnátok javasolni arra, hogy egy xls. fájlt szeretnék kijelölni form segítségével. Sajnos nem találtam olyan vezérlőt amivel akár csak egy adott mappában lehetne tallózni a gépen. Ha létezik egyáltalán valami megoldás erre....
SZiasztok. Lenne egy excel problémám, amit nem is neveznék problémának, inkább feladatnak. Van 2 táblánk.....
De konkretizálom....
1. Tábla Oszlop1 Oszlop2 C 1 D 5 A 7 A 7 C 3 B 6 D 8 ........ (Akár a végtelenig)
2. Tábla (az eredmélytábla) Oszlop1 Oszlop2 A SumA (Tehát az első tábla azon értékei összesítve ahol "A" van) B SumB (Tehát az első tábla azon értékei összesítve ahol "B" van) C SumC (Tehát az első tábla azon értékei összesítve ahol "C" van) D SumD (Tehát az első tábla azon értékei összesítve ahol "D" van)
KÉRDÉS: Mi a 2. Tábla 2. Oszlopának sorainak képlete?????