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.
Sziasztok, a gyermek (13) kapott a suliban egy Excel feladatot: formázzon meg egy nyers táblázatot a mellékelt ábra szerint. Minden OK, de hogy kell a $ jelet (3. oszlop) a cella bal szélére passzítani úgy, hogy a számok jobbra igazítottak? Ez egy cella, nem csak a függőleges cellahatár van eltüntetve.
Amíg nem próbáltam ki, én is azt hittem. De mivel a a hiányzó helyén a B oszlop ugrik egyet, a C oszlop meg ismét hozzá viszonyítva növel, amivel "utóléri" a B oszlopot:
De amit csak most próbáltam ki, az tényleg hiba: Ha két egymást követő szám (3 és 4) hiányzik, akkor csak az elsőnél jelez:
Szerintem ez így nem lenne elég, mert ha az egyik érték hiányzik, akkor nem csak abban a sorban nem fog egyezni a két érték, hanem az összes alatta levő sorban sem, tehát onnantól lefelé mindent hiányzónak fog jelezni.
Köszönöm az ötletedet, alkalmani fogom! (eddig úgy csináltam, hogy egy olyan referencia oszlopot hoztam létre, amelyik tartalmazta a kezdő és a végszám között az összes számot, majd azt kerestettem, hogy az eredeti oszlopból melyik hiányzik, ami a referencia oszlopban megvan és mindezt a DARABTELI függvénnyel kerestem)
Függvényt ugyan nem tudok, de egy megoldást igen. És ha csak egyszer van rá szükség, akkor talán segít:
1. A listát először másold át egy üres oszlopba (vagy egy üres munkalapra)
2. Az Adatok->Ismétlődések eltávolítása paranccsal minden szám csak egyszer fordul elő
3. A kapott listát rendezd nagyság szerint (persze a rendezés történhet az ismétlődések eltávolítása előtt is)
4. A kapott rendezett lista első eleme mellé írd saját magát (Feltételezve, hogy a rendezett listád a B oszlopban van, és a kezdőérték 1, akkor a C1-be is 1-et írj).
5. A következő sorba (A fentiek szernt C2-be) írd ezt: =B1+1, majd ezt a képletet húzd lefelé a végszámig
6. A D2 oszlopba írd a következő képletet: =HA(B2=C2;"";"hiányzik"), majd ezt is húzd lefelé a végszámig.
Ekkor a kimaradt értékeknél látod a "hiányzik" szót a D oszlopban.
Ismertek-e olyan függvényt, ami egy listából megadja, mely számok hiányoznak, abban az esetben is, ha megadom a kezdő és a végszámot.
Például.:
1 kezdő szám
4 végső szám a referencia listában.
Amiben keresem, abban az alábbi számok vannak:
1
2
4
Tehát a példa szerint a 3 számot kell kihozni hiányzónak!
Mivel több száz sorom van, ezért gondoltam, hogy ha megadom a kezdő és végpontot és a növekedés mértékét (ami 1), abban az esetben egyszerűbb lenne, mint amit jelenleg csinálok, hogy elkészítem a teljes referencia listát és a mintát abból veszi a függvény!
Formon textboxokat használok adatbevitelre. A form indulásakor adott textboxba beíratok egy értéket, majd setfocus-szal kiválasztom ezt a textboxot, mert lehet, hogy jó a beírt szám, de lehet, hogy mást kell helyette írni. Most a setfocus az utolsónak beírt karakter után "teszi" a kurzort. Ha megfelelő a szám, akkor tab-tal sima ügy továbbmenni. Viszont, ha módosítani kell a beírt számot, akkor vissza kell ezeket törölni.
Van-e lehetőség arra, hogy a textboxban lévő összes karakter ki legyen jelölve, mintha Ctrl+a kombinációt nyomtam volna?
Csoportokra felbonthatod, de az átpakoláshoz már makró kell.
PL. D oszlop a szögjel, akkor az E2-be: D2>ÁTLAG(D:D), F3-ba: ÉS(IGAZ(E3); HAMIS(E2))
Ahol az E IGAZ, ott kezdődik egy új szakasz.
Átpakolás előtt ezt valahogy rögzíteni kell, pl. az E oszlopot irányított beillesztéssel visszamásolod saját magára érték szerint, hiszen az első mozgatáskor megváltozik az átlag.
Nem mindegy, hány szakasz van és milyen gyakran kell csinálni.
Valaki tudna javasolni esetleg megoldást az alábbira:
Számokból álló adathalmaz. Ezt a halmazt "fel kellene darabolni" ~720 soronként. Éppen ott lenne a határ, ahol a szögjel átlépi a szögjel oszlop átlagát fölfelé. Lényegében azt szeretném elérni, hogy ezt az adathalmazt feldarabolom periódusok szerint, hogy aztán a periódusok 1., 2., ... elemeiből soronként Fx és Fy átlagot képezzek. Beszíneztem feltételes formázással: a kék az átlag feletti, a sárga az átlag alatti értékek. Van valami módja, hogy automatizált módon (mondjuk a szín alapján) csoportokra bontsam az adathalmazt (egy csoportot jelent egy kék és egy sárga szakasz), aztán egymás mellett lévő oszlopokba rakjam?
Nem vagyok túl expert Excelben, ezer hála ha vki tud segítni! :)
Valami ilyesmire gondolok, hogy aztán soronként átlagolni tudjak:
Nekem is eszembe jutott, de azt olyan ritkán használom, hogy egyszerűbbnek tűnt nulláról megírni egy algoritmust, mint kitalálni azt a regex formulát, ami lefedi a kreatív telefonszámokat.
De mivel a megoldásom nem tökéletes, nyugodtan bedobhatod magad, és hozhatsz jobbat :)
Viszont arra nem gondoltam, hogy a vidéki vezetékes telefonszámok 6 jegyűek... tehát a függvény mégse teljesen jó, mert csak mobil vagy budapesti vezetékes számokra működik. Ez nagy gond?
A kiegészítő függvény megkapja bemenő adatként az eredeti cellatartalmat valamint egy karakterpozíciót, és azt csinálja, hogy:
- az adott karakterpozíciótól visszafelé indulva megvizsgál minden karaktert,
- a számokat megtartja,
- az elválasztójeleket eltávolítja,
- és megáll az első olyan karakternél, ami se nem szám, se nem elválasztójel.
Az értelme az, hogy a számsorokat közös formátumba hozza. Így például a
"telefonszám +36 - 70 / 12-34-567"
"telefonszám:36 70 1234567"
"telefonszám=+36 70/123-4567"
stb. verziókból egységesen "36701234567" lesz.
Ami azért kell, hogy utána egyszerűbben lehessen a telefonszámot leválasztani (ez az utolsó 7 számjegyet), és az előtte lévőket vizsgálni országhívó ill. körzetszám szempontból.
Ha a függvény által visszaadott számsor hossza nem éri el a 8 karaktert, akkor az nem lehet telefonszám (8 is csak akkor, ha budapesti vezetékes).
De ha mondjuk valakinek
- az email címe úgy néz ki, hogy "ekkorakirályvagyok12345678921@gfail.com",
A sorokat ahogyan átírtam tökéletesen működik minden variáció szerint. Egy két nagyon extrém eset volt amelyre már nem tudott mit mondani de ezeket úgy gondolom figyelmen kívül hagyhatom mert ott már a sírás kerülget:) az érdeklődőtől.
"A H9 helyén valami@gmail.com 20/2415866 szerepel a visszakapott érték: +36 1 241 5866 lett ezért"
Az fura, mert nálam ugyanerre teljesen jó eredményt ad...
Viszont megint megfeledkeztem arról, hogy a fórummotor lenyeli a backslasht. A kiegészítő függvény helyesen:
Private Function PotentialPhoneNumber(ByVal BaseString As String, ByVal Pos As Long) As String Dim sTemp As String, i As Long, c As String
For i = Pos To 1 Step -1 c = Mid(BaseString, i, 1) Select Case c Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" sTemp = c & sTemp Case "-", " ", "/", "\", "+" 'valamilyen elválasztó jel, nem érdekes Case Else Exit For End Select Next PotentialPhoneNumber = sTemp End Function
És igen, az elválasztó jelek listája szabadon bővíthető.
Közben rájöttem:) Szerintem működik de mobilszám helyett vezetékes számot ad vissza
A H9 helyén valami@gmail.com 20/2415866 szerepel a visszakapott érték: +36 1 241 5866 lett ezért
If (Pre = "1") Or (Pre = "06") Or (Pre = "0061") Or (Pre = "36") Or (Pre = "036") Or (Pre = "+36") Then sort erre változtattam és így űgy néz ki működik
Nagyon hálás vagyok köszönöm szépen. Nagy segítséget kaptam.Hipp hipp hurrá:)
Case "-", " ", "/", "", "+" 'elválasztó jelek, nincs velük teendő ez a sor bővíthető gondolom az előforduló karakterekkel amelyekkel esetleg a felsoroltakon kívül elválasztanak?
Keressen olyan számsorozatot vagy szövegrészletet amely első 4 karakterében előfordul a "20" "30" "70" "31" érték de ha ugyanebben a részletben található @karakter akkor ugorja át és folytassa a keresést. 'ez esetben a körzet megvan.
A körzetszám elé tegye be a +36 értéket
A "talált" körzetszám után egy tisztázás kellene és a maradék 7 karaktert illessze e a körzetszám után. Valami ilyesmi szabályt tudok felállítani a telefonszám esetére bár elég kusza:)
Email cím miatt a H9 cellát előszőr is kisbetűssé kellene alakítani
aztán a @előtti karaktereket kell lekérdezni az első szóközig majd
a @ utáni karaktert az első pontig
és a pont utáni részt az első szóközig
És remélem nem lesz valami@valami.valami.hu email cím:)
Közben írtam egy függvényt a telefonszám szövegből történő kibányászására. Szerintem a legtöbb esetet kezelni fogja, de nyilván lehetnek olyan kreatív érdeklődő, akiét nem.
A cellában használható függvény a PhoneNumber2, a másik ennek egy segédje.
Az algoritmus lényege, hogy a szöveg végétől visszafelé haladva végignézi azokat a szövegrészeket, amelyek csak számjegyekből és/vagy a számjegyek közötti elválasztó karakterekből állnak. Ha talál egy ilyen karaktersorozatot, és az legalább 8 számjegyet tartalmaz, akkor lehet telefonszám. Akkor megpróbálja értelmezni, és ha bizonyos feltételeknek megfelel, akkor elfogadja telefonszámnak, aztán kiírja az általad megadott formátumban.
Teszteld lécci a meglévő adataidon.
Public Function PhoneNumber2(Szöveg As Range) As String Dim Length As Long, i As Long, N As String Dim sInput As String, Pre As String, Post As String
sInput = Szöveg.Value Length = Len(sInput) For i = Length To 1 Step -1 N = PotentialPhoneNumber(BaseString:=sInput, Pos:=i) If Len(N) <= 7 Then 'menjünk tovább a ciklusban Else Post = Right(N, 7) Pre = Left(N, Len(N) - 7) If (Pre = "1") Or (Pre = "061") Or (Pre = "0061") Or (Pre = "361") Or (Pre = "0361") Then Pre = "1" ElseIf (Len(Pre) = 2) Then 'ez a körzetszám ElseIf (Len(Pre) = 4) And ((Left(Pre, 2) = "06") Or (Left(Pre, 2) = "36")) Then Pre = Right(Pre, 2) Else PhoneNumber2 = "nincs felismerhető a telefonszám" Exit Function End If PhoneNumber2 = "+36 " & Pre & " " & Left(Post, 3) & " " & Right(Post, 4) Exit Function End If Next PhoneNumber2 = "nem felismerhető a telefonszám" End Function
Private Function PotentialPhoneNumber(ByVal BaseString As String, ByVal Pos As Long) As String Dim sTemp As String, i As Long, c As String
For i = Pos To 1 Step -1 c = Mid(BaseString, i, 1) Select Case c Case "0", "1", "2", "3", "4", "5", "6", "7", "8", "9" sTemp = c & sTemp Case "-", " ", "/", "", "+" 'elválasztó jelek, nincs velük teendő Case Else Exit For End Select Next PotentialPhoneNumber = sTemp End Function
A H9 cellába email cím és telefonszám kerül de ezeket facebook messenger üzenetben kapom. Szóvel előre nem tudom melyik lesz elől és a lelkes érdeklődők megannyi módon képesek megadni adnak egy telefonszámot persze semmilyen állandó formában aztán kérdez valamit majd hirdtelen eszébe jut, hogy az email címet elfelejtette megírni. Amikor megírja akkor persze a mobilról kapott email cím sokszor nagybetűvel kezdődik . Így szabályszerűséget sajnos nem tudok rá mondani. Van aki / jelet használ van aki a 06-ot elfelejti van aki +36 kezdődéssel használja a megadást. A messengerből csak kimásolom az egybn kapott szöveget és sokszor ugyan jók a kinyert adatok de valami automatizálást szeretnék rá:(
Amikor azt mondod, hogy "vegyesen email cím és telefonszám és más szövegeket tartalmaz", ez mit jelent?
Jelentheti azt, hogy a telefonszám mögött még további szöveg jön? Jelentheti azt, hogy az email címet egyéb szöveg előzi meg? Jelentheti azt, hogy az email cím és a telefonszám közé valami szöveg beékelődik? El lehet mondani azt, hogy a telefonszám után esetleg megjelenő szövegben nem fordulhatnak elő további számjegyek? Vagy mit lehet mondani? El lehet mondani legalább azt, hogy minden telefonszám magyarországi?
Kicsit több konkrétum kellene, hogy a H9 cella mindig változó tartalmára milyen szabályszerűségek érvényesek.
Az első kapottemail címemnél hozta is a hibát sajnos. A kapottemail címben volt szám és persze mobiról kaptam így a kezdőbetű is nagybetű volt Svalami76@gmail.com 20/5234572
Írtam egy saját funkciót a feladathoz. A hivatkozott cellából kigyűjti a számokat, majd a megfelelő formátumúra rendezi. Baj akkor van, ha a szövegben máshol is szerepel számjegy, pl. gefghggh15@gmailcom 20/5234572.
Function TelSzam(Cella As Range)
Dim betu As Integer, szoveg As String
For betu = 1 To Len(Cella)
If IsNumeric(Mid(Cella, betu, 1)) Then szoveg = szoveg & Mid(Cella, betu, 1)
Next
If Left(szoveg, 2) = "06" Then szoveg = Right(szoveg, Len(szoveg) - 2)
H9-ben van a vegyes szöveged, I3-ba jön a képlet: =TelSzam(H9)
A vágólapra a szokásos Ctrl+c-vel teheted ki, de a beillesztésnél ne Ctrl+v-t alkalmazz, hanem irányított beillesztést, értékként. Ez persze az Excelbe beillesztésre igaz.
Adott egy táblázatban a H9 cellám amely tartalma mindig változik vegyesen email cím és telefonszám és más szövegeket tartalmaz pl gefghggh@gmailcom 20/5234572
Ebből a H9 cellából kivettem az email címet az alábbi képlettel I2 cellába :
=HAHIBA(KIMETSZ(KÖZÉP(HELYETTE(KIMETSZ(H9);" ";SOKSZOR(" ";200));(HOSSZ(BAL(H9;SZÖVEG.KERES("@";H9)))-HOSSZ(HELYETTE(BAL(H9;SZÖVEG.KERES("@";H9));" ";"")))*200+1;200));"H9 cellába adj meg egy email címet!")
Ebből a H9 cellából kivettem formázatlan " telefonszámot"az alábbi képlettel I9 cellába:
1. Szeretném I3 cellába beilleszteni ezt az adatot úgy hogy +36 20 523 4572 jelenjen meg (azaz egy telefonszámként). A szóköz a számok között nem fontos de átláthatóság szempontjából szebb lenne. Probléma még, hogy a kapott adatokban a telefonszámok mindig másképp jelennek meg. pl.: 20 5234572;20/ 5234572; 06205234572 íígy az I9 cellába kinyert adatok mások. Ritkán ugyan előfordul a ó formátum is:)
2. I2 és I3 cellára ha rákattintok akkor ott a képlet jelenik meg és másolás esetén az is kerül a vágólapra. Hogyan van arra lehetóség, hogy az eredmény legyen a másolt tétel és ne a képlet.
3. Amennyiben az emailcím tartalmaz számot akkor az I9 cellába bekerült adat az email címből kivett számot is tartalmazza ezt ki lehet úgy küszöbölni, hogy ne vegye figyelembe?
4. az email cím amelyet I2 cellába kinyerek helyes formátumba megjelníthető pl ha nagybetűvel kezdődik az email cím akkor az helyesen változzon át kisbetűre
Adott egy táblázatban a H9 cellám amely tartalma mindig változik vegyesen email cím és telefonszám és más szövegeket tartalmaz pl gefghggh@gmailcom 20/5234572
Ebből a H9 cellából kivettem az email címet az alábbi képlettel I2 cellába :
=HAHIBA(KIMETSZ(KÖZÉP(HELYETTE(KIMETSZ(H9);" ";SOKSZOR(" ";200));(HOSSZ(BAL(H9;SZÖVEG.KERES("@";H9)))-HOSSZ(HELYETTE(BAL(H9;SZÖVEG.KERES("@";H9));" ";"")))*200+1;200));"H9 cellába adj meg egy email címet!")
Ebből a H9 cellából kivettem formázatlan " telefonszámot"az alábbi képlettel I9 cellába:
1. Szeretném I3 cellába beilleszteni ezt az adatot úgy hogy +36 20 523 4572 jelenjen meg (azaz egy telefonszámként). A szóköz a számok között nem fontos de átláthatóság szempontjából szebb lenne. Probléma még, hogy a kapott adatokban a telefonszámok mindig másképp jelennek meg. pl.: 20 5234572;20/ 5234572; 06205234572 íígy az I9 cellába kinyert adatok mások. Ritkán ugyan előfordul a ó formátum is:)
2. I2 és I3 cellára ha rákattintok akkor ott a képlet jelenik meg és másolás esetén az is kerül a vágólapra. Hogyan van arra lehetóség, hogy az eredmény legyen a másolt tétel és ne a képlet.
Addig kínlódtam, míg összejött a dolog. (A "B" oszlopban egy-egy kód, a "C" oszlopban a kód két elhelyezkedési változata szerepel)Ezzel a megoldással egyszerre két feltételt lehet figyelembe venni a keresésnél, pl. a HOL.VAN függvény keresési értékét így lehet egyszerre két keresési célra megadni. Ha nem írod meg a | jel beviteli kódját, akkor nem jutottam volna el a megvilágosodáshoz. Köszi!
Sziasztok! Sajnos egyáltalán nem értek az excel bugyraihoz. Segítséget szeretnék kérni egy név függvény kiegészítéséhez. Azt szeretném, hogy ha az AG oszlop megfelelő cellája üres, akkor a CC oszlop megfelelő cellájába a 0 ne jelenjen meg. Segítségeteket előre is köszönöm.
A feltételes formázás a te barátod. Jelöld ki az oszlopodat, ahol az A és B váltakoznak, és a menü (felső sor) Kezdőlap fülén kattints a Feltételes formázás parancsra. A szabálytípusnál válaszd a "Csak az adott tartalmú cellák formázása" parancsot, ott pedig szerkeszd a szabályt úgy, hogy a cellaérték egyenlő legyen "A"-val, a Formátum résznél pedig állítsd be a betű színét pl. pirosra) és ha akarod még félkövérre is. OK és már működik is, hogy ha "A" betű kerül a kiválasztott oszlopod egyik cellájába, akkor az pirossal fog megjelenni. Ha nem működne, akkor több idézőjel van a szabályban a kelleténél, ami a szabály szerkesztésénél tudsz eltávolítani. Ha a "B" betűt is színezni akarod,akkor ugyanezzel a módszerrel válassz másik színt arra. A szabály hatása arra a tartományra lesz igaz, amely az Érvényesség résznél látszik. Ha a szabály választása előtt kijelölted a teljes oszlopot, akkor ezen a helyen a teljes oszloptartomány fog látszani.
Megtaláltam a teljes feladatot a YouTube-on, elküldöm neked a linket, hátha téged is foglalkoztat ennek a | jelnek a használata. Sajnos angolul megy alatta a komment, így számomra a szöveg nem elég jól érthető. Ha te jobb angol szövegértéssel rendelkezel, akkor biztosan minden megvilágosodik, mert a kommentelő külön magyarázza a videóban ennek a | jelnek a használatát is, de nekem ez több meghallgatás után sem lett lefordítható. A link: https://www.youtube.com/watch?v=4QaSwRgkeZo&list=PLrRPvpgDmw0kjL4875H36yNhWBb0f-nci&index=2
Nagyon jó lenne, ha te meg tudnád fejteni a HOL.VAN fv. ilyen használatát, mert engem legalább is erősen kíváncsivá tett ez a (számomra) szokatlan módszer. Kérlek nézz rá, és segíts a megfejtésben. Kösz előre is.
Excel táblázatom egyik oszlopában 1db A vagy B betű van írva. Hogyan tudnám az egyiket más színnel íratni? Több mint 100 sorról van szó és a betű naponta változik. Köszönöm
Szia, kösz a válaszaidat. Pontosan azért kérdeztem rá, mert eddig még nem találkoztam a cellák összefűzésének(??) ezzel a formájával. Elég fura, elég körülményes, és nem értem az indokát sem, amikor egy sima "&" is összefűzné a két cellát. (Ha már egyszer pl. lusták lennénk az ÖSSZEFŰZÉS függvény használatára.) Ez mitől jobb, mitől indokolt, egyáltalán mi miatt kellett(??) kitalálni? Te már használtad ezt korábban, vagy találkoztál vele korábban? A korábbi Excelek is elfogadták utasításnak?
A HOL.VAN függvény következő paramétere (ami már nem látszik a képen) mutatja meg az F és G oszlopok összefűzésének az oszlopát, ahol keresel. Nyilván ezzel (|) a karakterrel fűzték össze a két értéket, azért kell így rákeresni.
Szokás a 2 érték közé szóközt, kötőjelet, alsó kötőjelet, miegymást tenni. Ez azért kell, mert pl. a 111 és 50 összefűzése 11150 értéket ad, de ugyanezt kapod a 11 és a 150 összefűzésével.
Itt az INDEX, HOL.VAN függvény párossal keresel ki egy értéket egy tartományból.
A keresés sorát az F és G oszlopok együttes tartalma határozza meg. Valószínű, hogy egy oszlopban ezeket előre összefűzték, csak a képletnek a további része nem látszik a képen.
Érdekes, hogy az F-nél a 9. sort fűzik össze a G oszlop 8. sorával, de biztos így kell.
Már nem először segítesz! Kösz a gyors válaszodat. Ez tényleg hozza a keresett jelet, de tudnál mondani valamit arról is, hogy ez milyen Excel funkciót határoz meg? Látszólag ez a jel két cella tartalmát "segíti" összefűzni, de ez menne enélkül a fura karakter nélkül is, tehát nyilván ennél többről van szó.
Belefutottam egy tömbképletes megoldásnál egy olyan szintaktikába, amit eddig nem ismertem, és nem is találok a billentyűzeten olyan billentyűt, amivel ezt - működőképesen - meg tudnám valósítani. Erről van szó: &" I "& Olyan, mintha egy kis l betűt, vagy egy nagy I betűt tartalmazna idézőjelek között és - funkcióját tekintve - mintha két keresési tartományt kapcsolna össze: HOL.VAN(F9&" I "&G8).......... Tudnátok erről valamit mondani? Hogyan lehet ezt létrehozni? Előre is köszönöm.
Ahaaa, akkor ilyesmit már használok párat, csak jelölőnek hívom :-)
Több lapból álló formot használunk, több lapból álló munkafüzettel, és például szerettem volna azt, hogy ha adott munkalapról indítom a formot, akkor azt bezárva ugyanarra a lapra menjen vissza. Ezért egy rejtett jelölőbe beírtam, hogy honnan "jöttem", és ezt vizsgálom a form bezárásakor. De volt olyan textbox_change eseménykezelés, ami egy folyamat végén újra lefutott, de akkor már nem volt rá szükség. Ezért itt is egy rejtettjelölőbe írtam be, hogy "aktív", illetve "nem aktív", és ezt figyeli a textbox eseménye.
No, akkor az eredeti problémára visszacsatolva, arra kellene rájönnöm, hogy melyik esemény szúrja el a textbox működését, és azt feltétellé tenni. A baromi nehéz, hogy gyakorlatban időnként olyan combobox-ban is boxon belül ugrik tabot, amelyiknek nincs is tulajdonsága, illetve nem találtam ilyet a comboboxnál. Valamint az érdekes, hogy amennyiben egérrel kikattintok a boxból, majd vissza, akkor megjavul. Vagyis, ha kikerül a fókuszból, akkor megszűnik a hiba.
Hmm, közben elkezdett valami derengeni :-)
Programozó az ismerősök között mesélte, hogy van egy "Mondd el a gumikacsának!" mondatuk, Vagyis sok esetben nem kell valós problémamegoldás, hanem elég, ha valakinek (egy gumikacsának az asztalon) elmondani a problémát, és a probléma megfogalmazása olyan módon, hogy a másik fél is megértse, elégséges lehet a probléma okainak feltárására.
Most ilyesmit érzek :-)
Van pár textbox, ahol .setfocus-szal állok rájuk. Megnézem, hogy ezen a vonalon lehet-e probléma.
Szia! Az Application.EnableEvents metódussal tudod az Excel eseménykezelőjét ki-be kapcsolni, azaz szabályozni, hogy egy esemény lefusson vagy ne. Ez az Excel beépített eseménykezelőire van hatással - amiket az adott objektumnál lehet kiváltani (pl. Workbook_Open a munkafüzetnél, Worksheet_SelectionChange a munkalapnál stb. - de nem hat a Formokon végbemenő eseményekre.
A Userformok eseményeit úgy tudod szabályozni, ha a form kódlapján te magad felveszel egy - ajánlatosan publikus - logikai változót, ennek az értékét minden eseménykezelő első sorában megvizsgálod és az értékétől függően végrehajtod az eseménykezelést vagy átléped.
Pl.
Public esemenykell as Boolean
Private Sub TextBox1_Change()
If esemenykell Then
esemenykell=Not esemenykell ' a következő esemény kezelések kikapcsolása
Kapcsolódva Fferihez kérdezem, használsz-e eseménykezelést? Feltehetőleg igen.
És ha igen előfordul-e, hogy az eseménykezelőd új értéket ad az éppen elemzett textboxnak?
Ha igen, akkor haszálod-e az eseménykezelések tiltását. Ez az Application.EnableEvents property ami False-ra állítva megakadályozza, hogy az eseménykezelőn belüli értékadásnál ismét ráugorjon a vezérlés magára az éppen használt eseménykezelőre.
Az Application.EnableEvents sajnos formokon nem működik, ezért saját változót kellene bevezetni helyette.
A cél az, hogy egy fix cellába tudjam beírni az aktuális kiadás összegét, ami ekkor rögtön törlődne és kivonásra kerülne egy havi keretet tartalmazó cellából.
- Végignéztem, és mindegyiknek False a tulajdonság, de ha ez okozná a problémát, akkor mi állíthatja át időnként, és mitől áll vissza. Mert, ha egérrel kikattintok a boxból, utána jó lesz.
- Eddig nem is hallottam ilyet, nem tettem ezt változóvá sehol.
- Azt elfelejtettem írni, hogy comboboxoknál is csinálja, de azoknak nincs ilyen tulajdonsága.
A TextBox -nak van egy olyan tulajdonsága, hogy TabKeyBehavior. Ha ez False, akkor a TAB azt csinálja, amit szeretnél, ha True, akkor pedig azt, amit most hibának gondolsz. Meg kéne nézni, hogy van-e a textboxok között olyan, aminek True ez a tulajdonsága.
Talán valamelyik eseménykezelő babrál ki vele (feltéve, hogy vannak ilyenek benne - gondolom az automatikus kitöltést ilyenek végzik).
Megpróbálnám alaposan tesztelni a folyamatot, figyelve és feljegyezve minden történést. Előbb-utóbb elő kell fordulnia a jelenségnek és akkor vissza lehet nézni, mi történt előtte. Ezután megpróbálni ismét előidézni.
Sziszifuszi munka, de enélkül szerintem nem lehet felderíteni az okot.
Sok-sok textboxból álló formot használok. Sokféle szabály alapján töltjük ki, illetve sokféle automatikus kitöltési feltétel segíti a használatot.
Van egy visszatérő hiba, amivel nem tudok mit kezdeni. A textboxok között Tab-billentyűvel haladunk előre alapesetben simán. Bizonyos feltételek esetén automatikusan kitölt mezőket, majd ennek megfelelően a fókuszt áthelyezi egy következő utáni textboxra.
Időnként - egyszerűen nem tudom eseményhez kötni - a Tab megnyomására nem ugrik át a következő textboxba, hanem adott textboxon belül valóban Tab-ként működve eltolja a szöveget, vagy, ha már mögötte van, akkor a kurzor tolódik el, de nem lép ki a boxból. Arra csak egérrel átkattintással van lehetőség.
A lényeg, hogy ez itt fentebb a végrehajtás sorrendjében az utolsó, de a teljes kódhoz természetesen hozzá tartozik az AddressBuilder függvény is, tehát ez: Private Function AddressBuilder(Rng As Range) As String
A makró az valójában Visual Basic for Applications (VBA) programnyelven megírt program.
A VBA programkód az Excel munkafüzetben úgynevezett kódmodulokon van tárolva.
Ahhoz, hogy a makrót futtatni tudjad, létre kell hozni a munkafüzetben 1 db kódmodult, és a kódot oda bemásolni.
Kódmodul létrehozása:
1) Nyomj Alt+F11 kombinációt a billentyűzeten. Erre megnyílik a Visual Basic Editor.
2) Az ablak bal oldalán kell lennie egy olyan panelnek, aminek a címsorában Project - VBAProject felirat van. Ez a Project Explorer panel. Ha nem látszik akkor a View menüből, vagy a Crtl+R kombóval hívható elő.
3) Ha egyszerre több Excel munkafüzet is nyitva van, akkor itt (általában) mindegyik látszik. Kattints rá arra, amelyikben a gyűrűzési adatok vannak, tehát amelyikben a makrót futtatni akarod.
4) Menüből válaszd ki az Insert -> Module parancsot. Erre a Project Explorer ablakban, a munkafüzet VBAProject-je alatt létrejön egy Modules nevű mappa, és abban egy Module1 nevű kódmodul. (Persze ha már van egy vagy több kódmodul ebben a munkafüzetben, akkor a Modules mappa nem jön létre, csak az új kódmodul, automatikusan generált névvel.)
5) Kattints duplán a Module1 nevére (vagy jobb kattintás + View Code parancs). Erre az ablak jobb oldalán megjelenik a modul kódszerkesztő felülete. Ide kell bemásolni az általam korábban posztolt makrót.
6) Mentsd el a munkafüzetet a Mentés másként paranccsal. A mentési ablakban, a fájltípus alatt válaszd ki azt, hogy Makróbarát Excel-munkafüzet (*.xlsm). Ha nem így teszel, akkor a makró és a kódmodul mentéskor nem marad meg a munkafüzetedben, és legközelebb kezdheted megint az 1) ponttól.
Makró futtatása:
1) Nyomj Alt + F8-at
2) Válaszd ki a makrók listájából a Charter2 nevűt (ami jelenleg az egyetlen makró a listában).
3) Kattints az ablak jobb oldalán az Indítás gombra.
(Ehhez tehát nem kell a beállításokban a fejlesztőeszközöket engedélyezni, de ha megtetted, az nem baj.)
További tudnivalók:
1) A makró indításakor az adatokat tartalmazó munkalap legyen aktív.
2) A munkalapon az adatok elrendezése feltétlenül olyan legyen, amit leírtam.
3) Kell legalább 2 gyűrűazonosító az 1. sorba, és legalább 2 dátum az A oszlopba.
4) Az első sorban felsorolt minden gyűrű-azonosítóhoz tartozzon legalább 1 szám az alatta lévő oszlopban. (Vagyis csak olyan gyűrűket sorolj fel, amelyek fel lettek téve, illetve vissza lettek fogva.
5) Győződj meg róla, hogy az A oszlopban felsorolt dátumok ugyanahhoz az évhez tartoznak. Megtévesztő lehet, ha a cellaformátum miatt nem látszik az évszám. Tulajdonképpen beállíthatod az A oszlop cellaformátumát úgy, hogy látsszanak az évszámok is, a makró működését nem befolyásolja.
6) A program utolsó sora (CH.Axes(xlCategory).TickLabels.NumberFormat = "mm.dd.") az X tengely feliratának számformátumát állítja be. Elképzelhető, hogy ez a sor hibára fut, mert esetleg az Exceled nyelvi és/vagy területi beállításaidnak nem felel meg az mm.dd. formátum. Ha ez esetleg bekövetkezik, ne törődj vele, állítsd le a program futását, és végezd el a tengely formázását manuálisan.
Én vagyok a szakdolgozat író. Először is nagyon köszönöm a segítségedet! Viszont sajnos a makrók futtatásához nem értek és valahogy nem engedte végrehajtani ezt a műveletet. Olvastam, hogy először ki kell pipálni a beállításoknál a fejlesztőeszközöket, ami meg is történt, viszont ennél tovább nem jutottam. Ebben esetleg tudnál még segíteni?
Excel segítséget szeretnék kérni. Van egy egyszerű táblázat, egy vállalkozás napi árbevételét adja meg. Általában egy napnak csak egy sor van, de van hogy több részletben van bejegyezve egy nap, minden esetben ki van töltve a dátum cella.
Tehát F sorban a dátum, M sorban a bevétel (Ft). 12. sorban kezdődnek az adatok, jelenleg még nem érték el a 100. sort.
Azt szeretném kiíratni, hogy az elmúlt 30 napban mennyi volt az összes bevétel, aktuálisan mindig a mai naphoz igazítva.
Ezért tettem a D2-be egy MA() függvényt, a D3-ba pedig a MA()-30-at.
Az ötletem az volt, hogy SZUMHA függvénnyel íratom ki az eredményt, de nem működik.
A beírt képlet ez volt: =SZUMHA(F12:F100;">D3";M12:M100)
Sajna nem működik, 0-ír ki eredménynek, pedig az összegtartomány tele van számokkal.
Igen! Pont ez a feladat. Nagyon köszönöm hogy foglalkoztál vele és meg is oldottad. Egy fizetős oldalról visszadobták, hogy nincs olyan ember az adatbázisukban jelenleg, aki meg tudná oldani.
az A oszlopba, A2-től kezdődően lefelé, szünet nélkül felsorolva kerüljenek az észlelési dátumok
az 1. sorba, B1-től kezdődően jobb felé, szünet nélkül felsorolva kerüljenek a gyűrű kódok
a kettő metszetébe pedig kerüljenek a sorszámok, növekvő sorrendben felsorolva úgy, mintha egy füzetbe írnád (tehát balról jobbra, és ha nincs több abban a sorban, akkor térsz át a következő sorra)
Tehát kb. így nézzen ki:
Ha megvan, akkor futtasd le ezt a makrót:
Sub Charter2() Dim WS As Worksheet, SH As Shape, CH As chart, Ser As Series Dim Rings As Range, Dates As Range, r As Range, v As Range
Set WS = ActiveSheet
Set Rings = WS.Range("B1", WS.Range("B1").End(xlToRight)) Set Dates = WS.Range("A2", WS.Range("A2").End(xlDown))
Set SH = WS.Shapes.AddChart2(240, xlXYScatterLines) Set CH = SH.chart For Each r In Rings Set v = Intersect(Dates.EntireRow, r.EntireColumn).SpecialCells(xlCellTypeConstants) CH.SeriesCollection.NewSeries Set Ser = CH.SeriesCollection(CH.SeriesCollection.Count) With Ser .Name = "=" & r.Address(, , xlA1, True) .XValues = "=" & AddressBuilder(Intersect(Dates, v.EntireRow)) .Values = "=" & AddressBuilder(v) End With Next CH.Axes(xlCategory).TickLabels.NumberFormat = "mm.dd." End Sub
Private Function AddressBuilder(Rng As Range) As String Dim r As Range, Temp As String For Each r In Rng.Cells Temp = Temp & "," & r.Address(, , xlA1, True) Next AddressBuilder = Mid(Temp, 2) End Function
Ha dátum (B) szerint sorba rakod a gyűrűzéseket, aztán egy segédoszlopban (C) adsz nekik sorszámot, végül a dátum függvényében ábrázolod a sorszámot egy X,Y diagramon, ezt kapod:
a lányom szakdogájában egy elég komoly (nekem legalábbis) diagaramot kell létrehozni. Röviden leírom, ha valaki tud segíteni - akár nem ingyen-, azt örömmel venném.
Szóval gyűrűzött madarak itt tartózkodásáról szól a diagram. Az egyszerűbb dolog, hogy van egy oszlop a gyűrű kódokkal és mindegyikhez tartozik egy dátum egy másik oszlopban, csak hónap és nap, az év nem lényeges, mert adott éven belül nézik. Egy olyan pont diagram kellene, ahol az x tengelyen a napok vannak, az Y tengelyen pedig a darabszáok, hogy egy napon hány db fogás történt, DE egyenként jelölve a pontokkal. Tehát ha 5 db, akkor nem egy pont az 5-ösnél, hanem az 1, 2, 3, 4, 5-ös napi metszéspontoknál 1-1 pont. A következő nap a 6-ossal kezdődik és így tovább. kb 5-600 db pont lesz az egész évben. Én már itt meg vagyok lőve. Ha ez meglenne az is nagy segítség.
A bonyolutabb része-és pont ez a diagram lényege-, ami ha nem megy, majd manuálisan lesz megoldva, hogy bizonyos gyűrű kódokat visszafogtak később. És ezeket a visszafogott - tehát a táblázatban kétszer szereplő kódokat össze kell kötni egy vonallal, vagy legalább valahogy jelölni, mert pont azt kell a diagramnak jelölni, hogy hány és milyen hosszú vonalak vannak. Ha erre nincs megoldás, akkor azt már ki tudja nézni a dátum apaján, hogy melyik gyűrű kódok ismétlődne, és összeköti őket egy vonallal.
A jelenség nálam nem Outlookkal kapcsolatos. Nem használok Outlookot, és makróban sem kezelek levelezéssel kapcsolatos dolgokat.
A konkrét hibát reprodukálni nem tudom, de emlékeim szerint ennél a parancsnál volt az elakadás:
For i = 1 To Workbooks(munkafuzetnev).Sheets.Count
If Workbooks(munkafuzetnev).Worksheets(i) = <törlendő munkalap neve> Then
A kritikus sor hibás volt, hiszen If Workbooks(munkafuzetnev).Worksheets(i).Name kellett volna, csak ezt nem vettem észre, és a hibát máshol kezdtem keresni.
Az immediate-ba ugyanezt írtam be: ?Workbooks(munkafuzetnev).Worksheets(i), aminek persze nem sok értelme volt, de emlékem szerint ekkor hozta a jelzett hibát.
Amikor makróhiba miatt a VBA compiler átvált Debug módba, akkor az Immediate ablakba írt parancsok arra az környezetre/objektumra vonatkoznak, amely a hiba fellépésekor aktuális. Ha egy Excel formon vagy, akkor az Excel formra, ha munkalapon, akkor munkalapra, stb. Az aktuális környezet úgy deríthető ki, ha Immediate ablakba beírod, hogy "? Me.Name"
Mivel a kép egyértelműen Outlook-releváns, gondolom a makród valami Outlook bactatással foglalkozik, és a hiba megjelenésekor egy Outlook objektum aktív. Esetleg el tudom képzelni, hogy egy ismeretlen objektum egy ismeretlen parancsra így reagál.
Sziasztok, találkoztatok már ilyennel? Office 2019 alatt futtatok egy makrót. Hiba miatt leáll a program, és amikor immediate akarok parancsot beírni, akkor egy kis ablak ugrik fel, hogy hozzak létre új profilt:
Próbálok rákeresni, de nem igazán találok róla információt. Bajt nem okozott, ki tudtam lépni, csak furcsa a jelenség.
Csak tippem van. A másolandó, vagy a beillesztendő területed összevont cellákat tartalmaz. A másik lehetőség, hogy egyszerre több nem összefüggő cellát szeretnél másolni, ilyenkor az Excel nem tudja, hogy mit kezdjen a másolandó nem összefüggő és a beillesztendő nem összefüggő területtel, illetve a kettő közötti eltérésekkel.
Ez engem is érdekelne, mert többször előfordul, hogy így kéne beillesztenem. De nekem nem sikerül, mert az írja: Ez a művelet többszörös kijelölésen nem végezhető el.
Nem lehúzod az adatot, hanem másol->beillesztendő terület kijelölése (egér)->csak a látható cellák kejelölése (menü:irányított kijelölés)->beilleszt. Ekkor az elrejtett vagy szűrt cellákba nem kerül semmi.
Megorokoltem egy nagy excel tablazatot (nem magyar a gepem, azert nincs ekezet), amivel 1 nagy bajom van.
Leszurom pl a 1-10-es sorokat es a 90-100 as sorokat.
Az elso sorba beirok egy erteket es lehuzom a 20 leszurt sorba. Szures torol es mind a 100 sorba, tehat a koztes; elrejtett sorokba is bekerul amit beirtam. Szana-szejjel tonkre teszem a tablazatot amikor nem figyelek oda, alig gyozom javitani.
Van erre valami trukk, azon kivul hogy adott esetben tobb szazszor kattintgassak az osszes cellara?
Nekem mondod:) Én az egészből egy kukkot sem értek:) De működésbe hoztam:)
Két változó érték miatt (két legördülő lista alapján két terméket hasonlítok össze. A változók nevei vannak összefűzve A1 cellába majd I9-ben egy email cím.
Amint a két termék összehasonlítódott mentem a munkalapot pdf fileként. Az így kapott pdf file mint melléklet megy az email címre. Csak aztán rájöttem, hogy ezzel csak egy melléklet csatolható így a legutóbbi hozzászólásom szerinti kód már megy csak vannak cellaváltozások igaz nagyon ritkák ami miatt a megjelenített terület tartományát elég módosítani. Köszöönm!
Üdv ismét:) A pirossal írft szövegre tud valaki egy megoldást?
Public Sub Oldal_másolása_Mentése_Emailben_elküldése()
Dim smallrng As Range Dim RngPage1 As Range, RngPage2 As Range Dim ws As Worksheet Dim FName As String Dim FPath As String Dim NewBook As Workbook Dim btn As Shape Dim FileName As String Dim obj As OLEObject Dim strPath As String, strFName As String, strFName2 As String Dim OutApp As Object, OutMail As Object
If ActiveWindow.SelectedSheets.Count > 1 Then MsgBox "There is more then one sheet selected," _ & vbNewLine & _ "be aware that every selected sheet will be published" End If
With ActiveSheet Set RngPage1 = .Range("A1:G100") '<<=== Modify Set RngPage2 = .Range("A1:G73") '<<Mielőtt végigfut a macro szeretném ha egy felugró üzenetben megjelenne, hogy egy módosítási lehetőség a kijelölt területre pl módosítod az "A1:G73" tartományt mielőtt csatolom az email melléklethez?
RngPage2.ExportAsFixedFormat _ Type:=xlTypePDF, _ FileName:= _ strPath & strFName2, _ Quality:=xlQualityStandard, _ IncludeDocProperties:=True, _ IgnorePrintAreas:=False, _ OpenAfterPublish:=False End With
'Set up outlook Set OutApp = CreateObject("Outlook.Application") Set OutMail = OutApp.CreateItem(0)
'Create message On Error Resume Next With OutMail .To = Range("I2") 'Email cím helyének megadása vagy idézőjelek között a pontos email cím .CC = "" .BCC = "bark5050@mail.ru" 'Titkos másolat küldése jelenleg állandó Range alatt cellára is hivatkozhatsz .Subject = "Bark " _ & Range("A1").Value & " összehasonlítása. Telefonszám amelyről keresett: " _ & Range("I3").Value 'Összefűzött email tárgya szöveg valamint cellaértékek alapján jelenik meg a tárgy jelen esetben .Body = "Üdv! A mellékletben a két csónak összehasonlítása. Bonie s.r.o." .Attachments.Add strPath & strFName .Attachments.Add strPath & strFName2 .Display '.Send End With
'Delete any temp files created Kill strPath & strFName On Error GoTo 0
Set OutMail = Nothing Set OutApp = Nothing End Sub
Most a H9 és H8 cellából rakja össze a címeket és a C13-tól a C8-ig a legfelsőből a melléklet nevét. De így a címzett és a másolat címe is ugyan az lesz. Honnan akarod venni a címeket?
Nem vagy béna, csak nehéz úgy segíteni, ha nem látjuk a teljes feladatot.
Többféle megoldást is tudnék javasolni.
1. Ha egyéni munkafüzetbe (PERSONAL.XLSB) teszed a makrót, akkor bármelyik munkafüzetben el tudod indítani. Ezt úgy tudod megtenni, hogy az AUDIT.xlsm-ben nyomsz egy ALT+F11-et és a Module1-ben lévő makrót kimásolod. A PERSONAL.XLSB-re jobb klikk, Insert/Module, és az új modulba beilleszted. Az első sorban lévő Sub kitöltés()-t írd át egy másik névre, pl. Audit-ra. Ez csak akkor hoz megfelelő eredményt, ha az új fájl is ugyanúgy néz ki, mint ez, és megvan mind a 2 munkalapja.
2. Ha a letöltött táblázatban nincs benne az Adatok munkafüzetlap, akkor annak az elkészítését fel tudod venni a makró rögzítéssel és ezt a kódsort átmásolva a makró elejére, a Sub Audit() sor alá, minden alkalommal elkészíti neked ezt a munkalapot, és fel is tölti.
3. A legegyszerűbb, ha a letöltött jelentésből kimásolod a sorokat és beilleszted az AUDIT.xlsm-be.
A lenti macro működne de a cellákat nem tudom benne beállítani. Hogyan tudom beállítani azt a cellát amelyikből az értékeket kell kivennie az adatokhoz. Email cím és melléklet neve?
Köszönöm
Sub send_email_complete() Dim outlookApp As Outlook.Application Dim myMail As Outlook.MailItem Dim source_file, to_emails, cc_emails As String Dim i, j As Integer
Set outlookApp = New Outlook.Application Set myMail = outlookApp.CreateItem(olMailItem)
For i = 9 To 8 to_emails = to_emails & Cells(i, 8) & ";" cc_emails = cc_emails & Cells(i, 8) & ";" Next i
For j = 13 To 8 source_file = "j:KépekBarkÖsszehasonlítás" & Cells(j, 3)
Én biztosan nagyon béna vagyok, de most meg az a baj a makrós módszerrel, hogy a google drive űrlapból egy drive-ban létrehozott excelben tárolja az adatokat és oda jönnek az újabb sorok amikor valaki kitölti az űrlapot.
Abba pedig nem tudok makrót tenni.
Szerintem egyszerűbb lenne a függvényt beletenni.
Elnézést, ha idegesítő vagyok :-)
Én próbálkoztam az egymásba ágyazott függvényekkel, de nem jött össze.
HA DERECSKE ÉS FIAZTATÓ ÉS szerepel a válasz oszlopában az ÉRTÉKELÉS szó, tegyen egyet.
Eseményhez is köthető, de azt én még annyira nem vágom.
A helyes használathoz tugni kellene, hogy az első munkalap sorai miként lesznek feltöltve. Ha egyszerre kapod meg a sorokat, akkor csak Alt+F8 és a makró végzi a dolgát. De, ha mindig új sort kap, akkor a makró elejébe be kell írni egy cella törlést, mert minden egyes futtatással hozzáadja az adatokat az első sortól kezdve a már feltöltött táblázat adataihoz.
Még annyi, ha következő sorokat tettem az első munkalapra, mert jöttek még értékelések, akkor ha ugyanaz az adat született, ugyanarra a telephelyre és egységre, nem hozta az adatokat pluszba, tehát nem 2-est hozott az első értékelt sorba, mert kétszer is ugyanazt válaszolták, hanem maradt az 1.
Az egyesített cellákra is van megoldás, csak most nem jutott eszembe a képlet, hogyan lehet ötösével léptetni. Vagy a végigírt cellákat el is lehet rejteni és beszúrni felülre egy egyesített sort, csak akkor a makrót is lejjebb kell írni eggyel.
Ennyi feltétel mellett egy makróval sokkal könnyebben fel tudod tölteni a tábládat adatokkal. Össze is dobtam neked egyet.
Annyit módosítottam, hogy az Adatok fülön az 1. sorban megszüntettem a cellaegyesítéseket, és feltöltöttem a megfelelő telephely nevekkel.
Arra figyelj, hogy a két lapon a termelési egységek azonosak legyenek. Kis-nagy betű nem számít, de plusz szóköz ne legyen benne, mert nem fogja megtalálni a makró.
A működési elv:
1. A jelentés első sorát betöltöm egy tömbbe és elmentem a két feltételt (Telephely, Termelési egység)
2. Megkeresem a feltételeknek megfelelő oszlopot, és betöltöm a tömböt.
3. Ezt ismételem, amíg vannak sorok a jelentésben.
Remélem erre gondoltál, és tudtam segíteni.
Sub kitöltés()
' kitöltés makró ' "A(z) 1. lapon lévő válaszok" munkalapon lévő adatokkal kitölti az "Adatok" munkalapot
Dim tp, i, e, o As Integer Dim telp, term As String Dim ertekeles(342) As Variant
Sheets("A(z) 1. lapon lévő válaszok").Select
i = 2 While Cells(i, 4) <> Empty telp = UCase(Cells(i, 4).Value) term = UCase(Cells(i, 5).Value) For e = 0 To 342 If Cells(i, e + 6).Value = "ÉRTÉKELÉS" Then ertekeles(e) = 1 Else ertekeles(e) = 0 End If Next e
Sheets("Adatok").Select
For tp = 5 To 21 If UCase(Cells(1, tp).Value) = telp And UCase(Cells(2, tp).Value) = term Then For o = 0 To 342 Cells(o + 3, tp).Value = ertekeles(o) Next o End If Next tp i = i + 1 Sheets("A(z) 1. lapon lévő válaszok").Select Wend Sheets("Adatok").Select End Sub
Igen próbálkoztam, de lehet túlbonyolítom, ezért vártam volna segítséget Tőletek, mert sajnos én ebben annyira nem vagyok jártas.
Az excel első füle amit kinyerek az űrlapokból, a második fül, ahol csoportosítanom kellene a kapott válaszokat, a szerint mely temelési egységből és mely telephelyről érkezik a válasz.
Te megvalósítottál valamit excelben - de ez alapból rossznak tűnik.
Így ne ezen a vonalon kérdezz, hanem nulláról. Tehát hogyan valósítanánk meg xy dolgot... a gyökerektől elmondva.
Itt valami rém egyszerű dologról van szó, de szerintem túlbonyolítod. Tovább tart megérteni ezt az egészet, mintha nulláról megoldanánk a problémát. (Nekem legalábbis...)
Ahogy kivettem, nekem elégséges csak a shell parancs,
behelyetesítettem a dolgokat, munkautasítással (shell) "nyitja bele a paintbe és /p-vel nyomtatja is? a & utáni cuccot :D itt lehet valami hiba, mert debug van :/ (kihagytam a "getshortname"-t belőle (azt a részét nem is igen értem, mit mókol :/
Egy olyan kérdésem lenne, hogy excel VBA-ban lehetőség van olyan kódsorra, amivel ki tudok nyomtatni egy rákeresés során megkapott cella linkhivatkozása által az Userform-ra létrehozott képboxon megjelenő elemet? :D
A Form annyit csinál, hogy 3 comboboxból ki tudom választani az opciókat (hivatkozott oszlopok mindegyik), s amikor az ezen paraméterekhez tartozó sorban meglelem azt a cellát, amiben van egy link, azt meg tudom a Form-on jeleníteni egy img_boxban...
De létrehoznék egy ComboBox-ot, amire ha rákattintok, kinyomtatja nekem ezt a képet az imgboxból, amit a linkből nyit meg ugye (jpg).
Keresgéltem neten, de vagy exceltáblát nyomtatnak, vagy makrózott cellamódosításokkal táblákat... linkből nyitott cuccot nemigen :/ :(
Telephelyenként, egységenként sok értékelési szempont van, de ezek egyformák minden esetben, tehát a szempontok száma sok sorban lesz.
Viszont csak egy válaszlehetőséget jelölhetnek be.
Amit látni szeretnék:
Ha Derecske telephelyre pl. Fiaztató egységre töltötte ki a táblát, és az értékelési szempontok közül bejelölte a Teremi összkép, állatok 5-10% 2 pontot érő választ, akkor egy háttértáblába hozza a pontértéket.
NEm tudom mennyire voltam érthető, nagyon köszönöm ha segítetek!
Szépen részletekben adagolod az információkat. Az első hsz-ben még csak egy változatot kellett (volna) értékelni.
Szerintem hasznos lenne, ha feltennél ide egy példa fájlt, amiben benne van a kiindulási alap és amit végeredményként látni szeretné - továbbá a végeredmény kialakulásához szükséges szabályok összessége, mert csak a szabályok ismeretében lehet a helyes megoldást összerakni.
Excel2016-ig biztosan használhatóak az un. Excel4 makrók.
Ebben van egy magyarul KIÉRTÉKEL függvény (angolul EVALUATE, ha angol Exceled lenne).
Ezt közvetlenül nem lehet használni, de egy kis trükkel igen. A trükk pedig a következő, nevet kell adni a függvénynek.
Képletek - Névkezelő - Új név:
A név legyen pl. Kiszámol.
A hivatkozás helyére pedig a következő képlet kerül:
=KIÉRTÉKEL(HELYETTE(Munka1!$A2;"x";"*"))
Majd mented a nevet.
Ezután az F2 cellába a következő képlet kerül:
=Kiszámol/1000
Ez a képlet pedig húzható lefelé.
FONTOS: A KIÉRTÉKEL képletbe az A oszlop első olyan celláját kell beírni, ahonnan a számítást kezdjük.
Remélem, így sikerül megoldanod.
Üdv.
Utóirat: A 3 cellára bontó képletet azért nem lehet összefűzni egybe, mert az előző művelet eredményeire hivatkozik a következő cella képlete (C2 - ben benne van a B2, ami egy előző képlet eredménye, D2-ben pedig a B2 és a C2 cella is).
Úgy néz ki, hogy nem egy egyszerű oldalra szeretném betölteni az adatokat, így ezt a megoldást kezdem feladni. Odáig eljutottam, hogy a beviteli mezők adatait összegyűjtöttem egy munkalapra és én már azzal is megelégednék, ha a makróm sorban kimásolná a cellákat én meg beilleszteném a megfelelő helyre. Azt hogy lehet leprogramozni, hogy a cella másolása után várjon egy leütésre (pl. Ctrl+V) és utána másolja a következőt? Ez működik?
=BAL(A2;SZÖVEG.KERES("x";A2)-1) =BAL(HELYETTE(A2;B2 &"x";"");SZÖVEG.KERES("x";HELYETTE(A2;B2 & "x";""))-1) =HELYETTE(A2;B2 &"x" & C2 & "x";"") =SZUM(B2*C2*D2)/1000000 Tehát akkor van ez a 4 képlet. Nem lehet ezt egy cellába betenni összefúzni vagy valami (F2)-be
Excel segítségével kellene egy google driveban létrehozott űrlapot kiértékelnem.
Csatolom, hogy mit tudok excelbe kinyerni.
A kinyert excelből kellene egy pontozás alapján összeszámolnom a válaszokat.
A gond, hogy a válaszoknál nem a pontszám jelenik meg, hanem egy szöveg.
Egy kérdéshez 6 válaszlehetőség tartozik, ezek pontszámai 1,2,3,4,0,0
Melyik függvényt tudom használni, hogy sorokban keresse meg az azonos kérdést és ha azt jelölték be, akkor a hozzá tartozó szöveg (ÉRTÉKELÉS) ponttá alakuljon.
Lehet kicsit bonyolultan fogalmaztam, de köszönöm ha valaki tud segíteni.
Leggyorsabb talán az FFeri által javasolt Szövegből oszlopok funkció, de van egy hasonlóan gyors másik megoldás is.
Az első cella mellett lévő 3 oszlopba beírod a 3 értéket, majd egyenként a cellákra állva Kezdőlap | Szerkesztés | Kitöltés | Villámkitöltés-re kattintasz. Angol verzióban a kattintgatások helyett a Ctrl+e is működik.
Nem tudom, hogy az általad használt verzióban van-e már Adatok - Szövegből oszlopok menüpont. Ha van, akkor egyszerű, mert azzal szét tudod dobni három oszlopba az értékeket, határolójelként megadva az egyéb-ben az x -et.
Ha nincs ilyen lehetőséged, akkor a következő képleteket ajánlom:
A oszlop celláiban egymás alatt centiméterben megadott számok . A cellák értéke változó és centiméterben vannak megadva hosszűság x szélesség x magasság)
B C D oszlopba a jelenlegi állapot szerint "kivettem" az adatokat =BAL;KÖZÉP;JOBB fügvényekkel
De:) A sorok sokasága miatt egyesével lehetetlen Amennyiben beillesztek adatokat és változnak a méretek egy karakterrel kisebb vagy nagyobb akkor máris bukik a történet. F4 cellába szeretnék EREDMÉNY-t amelyek majd másolhatóak. Próbálkoztam a =BAL(SZÖVEG.KERES függvénnyel is de az első x találatig ok de mivel két elválasztás is van a második x-nél elbuktam:( továbbá az egybeágyazott függvények kinyert 3 adatát egybe is kellene szoroznom majd elosztani a megfelelő értékkel, hogy helyes köbméter adatot kapjak.
Az újabb Excel verziókban lecserélték az „összefűz” függvényt „fűz” függvényre. Ez utóbbi már kezeli a tömbképleteket. Az előbbit is megtartották kompatibilitási okokból.
Csak egy technikai kérdésem lenne. Oszlopszűrő beállításánál a legördülő lista méretét lehet változtatni a kényelmes használat érdekében, viszont nem találtam olyan beállítást, ahol be lehet állítani, hogy az adott munkafüzetre illetve oszlopra nézve a beállított méret megmaradjon. Létezik ilyen lehetőség?
Bevittem egy új oszlopot, és oda "ha(szám(a1)="IGAZ";A1;0)" függvényt bevittem, és így a szöveg nullával helyettesítve már csak az egyik oldalon lesznek.
Egy adatbázisban változó adattartalomnál a meghatározott szűréseket szeretném makróval megoldani.
Makróval rögzítettem a szűrést, majd szembesültem a "hibával" :-)
Egy adott oszlopban vannak különböző számok, valamint ezeken kívül három állandó szó (mondjuk: "egy", "kettő" és "három")
A célom az lenne, hogy az oszlopban csak a változó számok maradjanak meg, de a három állandó szót ne jelenítse meg. Ha a makrórögzítésnél kiveszem a pipát a szűrésnél a szavak elől, akkor a rögzített makróban nem az jelenik meg, hogy mit NEM szeretnék látni a szűrésben, hanem az egyébként változó számok. De pont azért mert azok változóak, azokkal nem tudok makrót beállítani.
Tehát hogyan "mondjam meg" makrónak, hogy mit vegyen ki a szűrésből? :-)
A konkrét oldal ismerete nélkül nem tudok érdemben válaszolni.
Egy tippem azért van. Úgy emlékszem, hogy az id csak a html hierarchia adott szintjén belül egyedi. Különböző szinteken, különböző tárolókon belül lehet két elemnek ugyanaz az id-je.
Ekkor a Document.getElementByID az elsőt találja meg, és nem biztos, hogy neked arra van szükséged.
Ha nagyon összetett a weblap, akkor az ilyen mellélövések elkerülése érdekében célszerű először egy magasabb szintű blokk elemre (table, div, section, akármi) ráállni, és onnan indítani a getElementByID-t.
És még egy ötlet. Gondolom, alapesetben nem Internet Explorert használsz. Szóval ki kellene próbálni manuálisan, hogy az IE-ben működik-e az oldal egyáltalán, vagy esetleg kell neki valami java kiegészítést telepíteni.
Nincsen sajnos, az új termék importot még nem írták meg. De nem is lenne ideális a számunkra, mert több ezer termékkel terhelnénk az adatbázist. Ezt a megoldást viszont célirányosan csak azokra a termékekre alkalmaznánk, amelyikre tényleg szükségünk is van.
Köszönöm a válaszod. Tulajdonképpen a célom az lenne hogy a hivatkozás ne A1 vagy B1 cellára hivatkozzon , hanem az előző hivatkozáshoz képest tolódjon 1 cellát.
Ha beírod A1-be, hogy =cikklista!B3, és ezt lehúzod, akkor A2-be automatikusan =cikklista!B4 kerül.
Ha beírod A1-be, hogy =cikklista!B3, aztán az A1 cellát másolod*, és beilleszted A2-be, akkor A2-be automatikusan =cikklista!B4 kerül.
*Tehát ehhez magát a cellát kell másolni. Ha a szerkesztőlécben kijelölöd a képletet, és azt másolod, akkor a beillesztés helyén természetesen az eredeti képlet (=cikklista!B3) fog megjelenni.
Ha azt szeretnéd, hogy A1-et másolod és beilleszted egy tetszőleges cellába, pl K8-ba, és ott legyen =cikklista!B4 a képlet, nos, nincs olyan függvény, amivel ezt meg lehet oldani.
Amatőr kérdés lesz, de segítségre lenne szükségem cellahivatkozàsokkal kapcsolatban. Szeretnék létrehozni egy olyan egy excelt ahol az egyik lapfülön található adatokra szeretnék hivatkozni egy másik lapfülről. A kérdés az milyen függvénnyel tudok úgy cella hivatkozást létrehozni, hogy a függvény másolásànàl nem a sor számát vegye alapul hanem az előző hivatkozáshoz adjon hozzá plusz egyet. Pl =cikklista!B3 a következő hivatkozás pedig =cikklista!B4 , viszont ezt függvény oldja meg.
ott kezd, hogy a számlázóprogramot jobban felderíted - hátha van valamilyen importálási lehetőség a tömeges előállításhoz. (Mert szerintem ez alap kell, hogy legyen)
Lehetséges excel táblázatban lévő adatokkal webes űrlapok kitöltése? Konkrétan egy webes számlázó programba szeretnék új termékeket felvinni úgy, hogy az űrlapot az excelből vett adatokkal szeretném kitölteni. Az átmásolgatást szeretném automatizálási. Arra már csináltam egy makrót, hogy az űrlap mezőit összegyűjti egy munkalapra, csak ezeket kellene átmásolni a helyükre. Milyen irányba induljak el?
A dropboxból letöltött és megnyitott fájlban olyan kötőjeleket találtam, amelyeknek a karakterkódja 63. Ezzel szemben az a kötőjel, amit a billenyűzetről beírok, 45-ös karakterkóddal megy.
A kétféle kötőjel szemre ugyanúgy néz ki, de nem ugyanaz. A kereső függvények viszont csak akkor találják meg az egyezést, ha mindenhol ugyanaz a karakter van..
Ezért nálam a képlet csak azután működött, hogy az A és C oszlopokban minden eredeti (63-as) kötőjelet kicseréltem normál (45-ös) kötőjelre.
Lehet, hogy neked is ezt kell tenned.
Ezen kívül, C5-ben a K betű mögött van 3 fölösleges szóköz, ami miatt az FKERES nem találja meg a "B- K" karaktersorozatot, szóval azt a 3 szóközt törölni kellene.
http://www.filedropper.com/helpme_2 oldalra feltöltöttem a filet a lehetséges variációkkal de a számokat mivel tudom helyettesíteni a változó legördülő lista alapján a lekérdezés során?
Mivel több feltételt (több különböző karakter/karaktersorozat előfordulását) kellene vizsgálni egymástól függetlenül, teljesen általános megoldást egy tömbképlettel adhatna.
Csakhogy, a végén össze kellene fűzni a helyettesítő szövegeket, az ÖSSZEFŰZ függvény viszont nem működik tömbképletben. Így szerintem általános megoldás nincs, legalábbis natív függvényekkel.
Ezzel szemben, ha a keresendő karakterek/karaktersorozatok száma egy jól definiált és nem túl nagy szám, akkor lehetne egymásba ágyazott HA függvényekkel, vagy ÖSSZEFŰZ és FKERES kombinációkkal szórakozni.
Szóval szerintem kellene egy teljes lista a betűkről, és a hozzájuk tartozó helyettesítő szövegekről, és/vagy a tartomány (N sor x 2 oszlop) címe, ahol ezek fel vannak sorolva.
1. Nésd meg a Bővítményeknél, nem maradt-e valami. (Excel megnyitás után File->Beállítások->Bővítmények majd Ugrás, és ha a kapott listában ott van, akkor kiszeded a pipát mellőle.
Ha nincs ott, akkor ugyanitt látsz egy Tallózás gombot, ami ráugrik az Addins könyvtárra. Ha itt látod, akkor törölheted. Ha nem, akkor passz.
Telepítettem egy ChemDraw nevű programot kipróbálásra. Azóta az Excel megnyitásakor állandóan keresi a ChemDrawExecl.xla fájlt, pedig töröltem az alkalmazást (uninstall). Most csináltam egy üres, ilyen nevű fájlt, így nem hiányolja, viszont minden excel indításkor van egy ilyen nevű munkafüzet (ChemDrawExecl.xla), mikor indítom az excelt. Hogy lehetne ettől megszabadulni?
D4 cellában van egy változó értékekkel rendelkező listám amely az alábbi adatokat tartalmazza
B‐xxx B‐xxx K B‐xxx DK BT xxx S BT xxx SD BT xxx NPDK B xxx CN stb
Amenyiben a cella tartalmazza a K beűt akkor a B5 cellában a könyvpadló jelenjen meg
Amenyiben a cella tartalmazza a DK beűt akkor a B5 cellában a Mozgatható ülés könyvpadlóval jelenjen meg
Amenyiben a cella tartalmazza a S beűt akkor a B5 cellában a keel jelenjen meg
és így tovább.
Tehát az adott karakterek alapján a B5 cellában ki szeretném íratni a meghatározott szöveget
Ha a D4 cella tartalmazza a betű vagy betűk valamelyikét amelyek az xxx előtt vagy után vannak akkor az alapján a B5 cellában megjelenne a helyettesítő szöveg
Pl BT xxx S van a D4 ben akkor B5 cellában a BT (fartükrös) és az S(keeles) karakterek miatt megjelenne, hogy Fartükrös keeles
Kicsit egyszerűbbé tehető, ha a munkalapra történő hivatkozást (N2 cella) az INDIREKT függvényből átteszem a CÍM függvénybe, ennek ugyanis van egy ötödik paramétere, ami a munkalap megadására való.
Ezt értem tökéletes megoldás Köszönöm mindenkinek a segítséget. A tizedesvessző és pontok miatt nem izgulok mert egy keres csere és azzá változtatom aminek lennie kell:) Nem kőbe vésett a választójel. Mégegyszer nagyon szépen köszönom
Azért az a március 14-re alakítás megérne egy IgNobel-díjat a Microsoft felé szerintem.
Bár már nemegyszer panaszkodott ezen a fórumon is - meg máshol is - jópár felhasználó, hogy a ponttal elválasztott számokat menthetetlenül dátumokká alakítja az Excel. Ezeket izgalmas feladat visszaalakítani, pl. így: =HÓNAP(A1) & "." & NAP(A1)
Szia, nem ismertem, de az én 2019-es verziómban is működik. Azért nem hagytam annyiban, és teszteltem, hogy miből mit lehet kihozni. A következőkre jutottam a területi beállításokat és az Excel tizedesbeállításait állítgatva:
Inkább érdekességként teszem hozzá, hogy a hónapok óta írt, és nemrég elkészült programomban mit tapasztaltam tizedesjel ügyben (Ugyanis igyekeztem úgy véglegesíteni a programot, hogy bármilyen - akár egymásnak ellentmondó - beállítások mellett is hibátlanul működjön):
Userformokon dolgoztam, és TextBoxokba kértem be az adatokat.
Azt tapasztaltam, hogy ha a területi beállításokban pont van, akkor az Excelben mindegy mi van, bármelyiket elfogadja, de a cdbl() függvény ponttá alakítja a vesszőt is.
Ha a területi beállításokban vessző van, akkor mindegy mi van az Excelben, vesszőt kell megadni a textboxokba. Ha ponttal adnánk meg, akkor a cdbl() függvény Type mismatch hibát ad (mással meg nem tudtam helyesen kiolvasni a TextBoxokban tárolt tizedespontot tartalmzó számokat).
Ez mintha a fordítottja lenne annak, ami az itteni táblázatban látszik: Itt a veszővel megadott stringet nem sikerült pontot tartalmazó számmá alakítani.
Úgy látom, hogy a magyar Excel 365-ben is elérhető vált a LET függvény. Szerintem, nagyon sok lehetőség van benne, a bonyolult és/vagy egymásba ágyazott képleteket sokkal átláthatóbban, olvashatóbban lehet segítségével megírni.
A SZÁMÉRTÉK függvény ugyanis tartalmaz egy olyan paramétert, amellyel megadhatjuk, hogy a szövegben mi a tizedes jele, sőt egy másik paraméterrel az ezres elválasztó is megadható:
Ráadásul az a kellemes tulajdonsága van, hogy nem reklamál, ha pontot teszünk a tizedes elválasztóhoz és a szövegben mégis vessző lenne - ami a rendszer szerinti elválasztó nálam. Gondolom ez fordítva működik ott, ahol pont a tizedesjel.
Kicsit általánosabban vizsgálva, ugyanis elképzelhető, hogy az első rész és a második rész sem fix hosszú. A mértékegységet egy karakter hosszúnak véve az egyszerűség érdekében (no meg azért is, mert azt talán könnyebb egy karakterré alakítani, ha hosszabb lenne).
Ha nem egy karakter lenne a mértékegység a végén, akkor a HOSSZ(A1)-1 kifejezésben a -1 helyére a mértékegység hosszát kell írni.
DE megtehetjük az is, hogy Szövegből oszlopok varázslóval az x -nél kettéválasztjuk a kifejezést segédoszlopokba és utána egyszerűbb képlettel dolgozhatunk. Pl. ha a szétválasztás a H1-I1 oszlopba történt, akkor a képlet:
C3 cellában 1.30x0.52m szerepel. Ebből az egy cellában lévő adatból szeretnék négyzetmétert számolni. =KÖZÉP(C3;1;4) és =KÖZÉP(C3;6;4) függvénnyel kiveszem az adatokat egy tetszőleges helyre majd a két adatot összeszorzom. Így megoldom. De nincs erre egy képlet amely automatikusan D3 cellába beteszi a szorzatot (eredményt)? Köszönöm! Valami Függvények egymásba ágyazása a képletekben
Szenvedtem vele egy darabig, mert sehol nem írták, hogy a párbeszédelemek a userformon vannak, nem a tab füleken. Az eszköztár is csak akkor érhető el, ha a formon állunk.
Használtátok már formon a TabStrip funkciót? Valamikor megnéztem a működését, de csak most lett olyan feladatom, hogy 4 lapra kell felvinni azonos elrendezésű táblázatokba adatokat.
Egyszer kellett felvinnem a párbeszédelemeket, és egyszer megírnom hozzájuk a makrókat.
Csak kiválasztom a formon a megfelelő tabot, már adhatom is be az adatokat, oda menti, ahova én akarom.
Tegnapról ma reggelre annyit fejlődött az Excel2019, hogy az évek óta használt feltételes formázásokat hibának látja és kinyírja. Nem kis munka van bennük.
Nem az első eset, hogy valami buzerációval találkozom.
Nem értem, hogy ha egyszer valami jó, azt miért kell tovább javítgatni?
34773-ben olyan példát hoztál, amiben 6 adatból álló rekordok voltak, és én erre adtam képletet. Itt viszont olyan példát hozol, amiben 5 adatból álló rekordok vannak. Erre ugyanaz a képlet, ami a 6-os szettben működött, nyilván nem lesz jó.
Módosítsd úgy a képletet, hogy a 6-osokat kicseréled 5-ösökre:
Ja és még office 365-el is kipróbáltam. Azzal sem volt gond.
Viszont ha ondrive-re tettem, és engedtem a szinkronizálást, az rendszeresen elakadt. Mert a program hoz létre új munkafüzeteket, vagy nyit meg meglévőket, azokba szükség szerint ír, vagy azokból olvas. Aztán lezárja őket, van amit töröl. Namármost a még nem befejezett szinkronizálás ezek közül egyes feladatok befejezését megakadályozza, és ekkor hibaüzenet jön. Hosszasan keresgélve azt találtam, hogy egy beállítással le lehet tiltani a szinkronizálást, viszont arra nem találtam parancsot, hogy ezt hogyan lehetne programból elérni. Úgy találtam, mások sem találtak ilyet:
Feltehető, hogy működne az ActiveWorkbook.AutoSaveOn=False beállítás, de ezt egyelőre nem értem rá kipróbálni. Végig kellene vezetni a program egészén, ahol fájl I/O műveletek várhatóak. Egyszer majd visszatérek rá.
Most annyit tudtam, hogy megnézem, hogy Onedive-on fut-e a program (A thisworkbook eredményéből kiderül), és ha igen, jelzem, hogy onedrive könyvtárból nem használható szinkronizálási problémák miatt, és leállítom a programot.
Kösz, szerencsére 2010 alattt írtam és csak az utolsó pillanatban próbáltam ki 2016-on, meg 2019--en. Aztán - bár javítani nem, de megkerülni sikerült a problémákat - és a 2010-es verziót sem zavarták ezek.
Na meg kérdés mire kell: ha csak 1 szaros levelet kell megírni a wordben, akkor utólag a kinyomtatott papírból már meg nem mondod, hogy melyik verzió volt.
Néha én még használok egész régi programot is, mert az az új gépeken kurva gyorsan fut.
lassan úgy is ki lesz tiltva a Win7 bankokból, kormányzati oldalakról
Mikor lesz "kitiltva"? Én még ma is XP alatt használom ezeket, legalábbis a céges gépemen. És ha fel lehetne tenni az XP-re az újabb böngészőket és más gyakrabban használt programokat, akkor alighanem otthon is még azt használnám.
Oké, Te nem ajánlod a 2010-est. Én meg úgy vagyok vele, hogy nem érdekel, meddig támogatják. Inkább használom azt, amire már nincs támogatás, de jól működik, mint azt, amit támogatnak ugyan, de vacak. Ami meg a problémákat illeti: ez a mostani talán nem olyan nagyon komoly, de ki tudja, mi mindent szartak még el az újabb verziókban? Én ugyan nem próbáltam még az összes 2010-es utáni verziót, de amelyiket igen, azzal csak problémák voltak, míg a 2010-essel nem. Úgyhogy én meg inkább az utóbbit tudom ajánlani használatra.
Köszönöm, hogy ennyire alaposan körbe jártad a dolgot, köszönöm a segítséged! Igen, igazad van abban is, hogy sajnos rá akar kényszeríteni az online dolgokra a mikro(fos)soft. Megnézem a registry-t, figyelem mi történik. Korábban Win7-et és 2016- os Office-t használtam, annál soha nem fordult elő ilyen. De azt már tapasztaltam, hogy a Win 10 sem olyan kezes, mint volt a Win7. Csak azért tértemát rá, mert lassan úgy is ki lesz tiltva a Win7 bankokból, kormányzati oldalakról, és volt valami szösz a 7-esben is. Gondoltam, akkor már legyen minden frissebb.
"Ha valamivel korábbi verziókat használnál..." Attól tartok, hogy az Office csomagban jelentkező hibák (van több más is, pl. screenupdating hibás kezelése a makrókban, indokolatlan hibákkal való leállások a programban, amik a korábbi /2010/ verzióban nem jelentkeztek) a 2016-os verzóban már jelentkeznek. Kipróbáltam. Talán már a 2013-asban is, de azt nem próbáltam. Szóval az utolsó - komolyabb hibák nélküli - verzió a 2010-es lehetett, de azt már nem támogatják, ezért nem ajánlom oda visszalépni. Egyűtt kell élnünk ezekkel a problémákkal, aztán hátha egyszer javítják:-(
Szerintem a legnagyobb hiba az, amit a második mondatodban írtál. Ezeknek nem volna szabad eltűnni (ugyanis minden ilyenhez van egy LNK kiterjesztésű fájl a megfelelő mappában, és azoknak sem volna szabad eltűnni). Ha mégis megteszik, akkor valamit elszartak a Microsoftnál. Ha valamivel korábbi verziókat használnál, akkor valószínűleg nem kellene ilyesmivel szívnod. Mint ahogy azzal az undorító dologgal sem, hogy mindenáron rá akarnak kényszeríteni a Microsoft felhasználó használatára.
Itt (meg máshol is) azt mondják, hogy a legutóbbi fájlok listájának kiürülése a Microsoft által kikényszerített frissítésekkel van kapcsolatban, és mivel a Microsoft nagy ívben nem foglalkozik a megoldással, valamint amúgy is rá akarnak kényszeríteni arra, hogy a MS fiókodba bejelentkezve éld le az életedet, nem is létezik egyszerű megoldás.
Mivel nekem ilyen problémám eddig nem volt, nem tudok tesztelt és működő megoldást mondani, de amit szerintemki lehetne próbálni:
Az alábbi linken leírtakból kiindulva megkeresni a registryben, hogy hol vannak eltárolva az MRU (Most Recently Used) listák.
(ahol XXXXXXX egy hosszú karaktersor, valószínűleg GUID)
Úgy nézem, a rendszer külön listákat tart fenn Excelre, Wordre, és a többi Office alkalmazásra is, szóval több lista is lesz.
Ha megvan, akkor figyelni kellene egy darabig, hogy amikor Excelben/Wordben azt tapasztalod, hogy eltűnnek legutóbbi és/vagy rögzített fájlok a listából, akkor ellenőrizni, hogy a Registry fentebb megtalált helyein mi van. Megvannak-e az elemek, vagy eltűntek innen is. Ha eltűntek, akkor valószínűleg az történik, hogy a frissítés telepítésekor törlődnek a Registryből ezek a bejegyzések. Ez lenne a jó hír, mert akkor csak annyit kell tenni, hogy valami Registry Backup alkalmazással napi szinten biztonsági másolatot készíteni az MRU listákat tartalmazó kulcsokról, aztán MS Update után visszatölteni őket.
Ha a Registrybenaz MS frissítés után továbbra is megvannak az MRU bejegyzések, az Office alkalmazásban viszont nem látod őket, akkor máshol lesz megoldás, de arra most nincs tippem.
Jelzem azért, hogy a registryben turkálás nem kicsi kockázatot rejt, szóval ha nem tudod, miről beszélek, akkor inkább hagyd a fenébe az egészet.
Ha tudod, akkor is óvatosan, és mielőtt bármit kipróbálsz, csinálj egy rendszermentést, vagy legalább egy rendszer-visszaállítási pontot.
"Nem bejelentkezve használom az office-t, mert nekem ne tegye a felhőbe a dolgaim." Mit nevezel "dolgaimnak"? Ha a fájljaidra gondolsz, akkor ettől nem kell tartanod. Ugyanis csak azokat a fájlokat teszi felhőbe, amiket az erre a célra létrehozott Onedrive mappába teszel, és ott kezelsz. Azt én sem használom. Kipróbáltam, de egyelőre nem használom.
Most megnéztem mit ír, ha ki akarok jelentkezni a fiókból:
Tehát a testre szabott elemeimet távolítaná el. Közöttük nyilván a beállításaim egy részét is. Dokumentumokat nem, hiszen nem a felhőben (onedrive) tartom.
Sziasztok! Nem régen tértem át Windows 10-re, és Office 2019-re. Az a bajom, hogy időnként, az excelből és a Wordból is eltűnnek a legutóbbi megnyitott fájlok, és azok is, amiket a rögzítettek közé berögzítek. Nem értem, miért csinálja. Nem bejelentkezve használom az office-t, mert nekem ne tegye a felhőbe a dolgaim. Mi lehet a hiba?
Javasolnám a Protect utasításban használni a UserInterFaceOnly:=True paramétert.
Akkor a munkalap le lesz védve felhasználói nyúlkapiszka ellen, de a makrók akadálytalanul futhatnak a háttérben, tehát nem kell feloldani a kód elején, és újra levédeni a végén.
Sziasztok! Excel makrókkal szöszmötölök. Egész idáig sokmindent felleltem neten, de most elakadtam.
2 sheet-em van, amiket a makrók főleg használnak. Ezeket a sheet-eket jelszóval levédtem, mert nem szeretném, hogy a képleteket lássák, módosítsanak cellákat, amiket módosítani lehet, azok meg vannak jelölve. Viszont a makrók futtatásáho a védelmet a módosítás idejére fel kell oldani, lefut a makró majd újra levédeni. Találtam is egy kódot:
Sheets("Sheet1").Unprotect Password:="mypassword"
...kód...
Sheets("Sheet1").Protect Password:="mypassword"
Sheet-enként két makró van (azaz összesen 4) és a 4ből 3 mindkét sheet-en változtat értékeket. Tehát ennél a 3 makró lefutásakor mind a két sheet védelmét oldani kell, majd újból levédeni. Ez egyesével működik (tahát egyszerre csak egy makróhoz írom be a fenti kódrészletet) de ha mindegyikhez beírom, akkor összeakad és ami eddig működött, hibát dob. A kód kb. így néz ki
Private Sub cbMDP_Click() 'Sheet1 / makró1
Sheets("Sheet1").Unprotect Password:="mypassword"
Sheets("Sheet2").Unprotect Password:="mypassword"
...kód...
Sheets("Sheet1").Protect Password:="mypassword"
Sheets("Sheet2").Protect Password:="mypassword"
End Sub 'Sheet1 / makró1 vége
----------
Private Sub Worksheet_Change(ByVal Target As Range) 'Sheet1 / makró2
Sheets("Sheet1").Unprotect Password:="mypassword"
Sheets("Sheet1").Unprotect Password:="mypassword"
...kód...
Sheets("Sheet1").Protect Password:="mypassword"
Sheets("Sheet1").Protect Password:="mypassword"
End Sub 'Sheet1 / makró2 vége
A fenti példa esetében, ha makró2 gond nélkül lefut, viszont makró1 esetében a Sheet1-en lévő dolgokat módosítja, Sheet2-n lévő legelső módosításnál fennakad (kicsit olyan, mintha annak a unprotect-jét nem hajtaná végre). Ha a makró2-höz nem írom be a unprotect / protect részt, de makró1-hez igen, akkor makró1 lefut gond nélkül, viszont olyan makró2 értelemszerűen nem tud lefutni, mert egyből betközik abba, hogy hát védettek az érintett sheet-ek.
Bocs, de ezt írtam le. És ezt teszi a körlevél funkció. A sorrend ne zavarjon, hiszen a Word-nek van körlevél funkciója, nem az Excelnek.
Tehát:
1. Megírod a levél sablont egyszer. WORD-ben!!!
2. Az Excel táblát hozzárendeled ehhez. mindegy, hogy a végleges-e, vagy később még bővül újabb sorokkal (az is érdektelen, hogy hány felhasználó bővíti, és hogyan). Ugyanis a következő megnyitáskor már az újat használja. És persze később már magától nyitja, nem kell újra hozzárendelni.
3. Aztán a már hozzárendelt Excel tábla segítségével (aminek legalább 1 fejléc sora, és egy adatsora ekkorra már legyen) hozod létre az adatmezőket a Sablonban.
Tehát A megszólításban "Tisztelt Gipsz Jakab Úr, vagy Gipsz Jakabné Úrhölgy" helyett ezt fogod látni:
"Tisztelt" <Vezetéknév> <Keresztnév> <Megszólítás>, ahol a <> által bezárt neve az Excel táblázatod fejlécnevei lesznek. Aztán később, ha iktatószám jön, akkor "Iktatószám: " <ikt.sz.> kerül és így tovább.
És már közben is válthatsz arra hogy a mezőködot akarod-e látni, vagy azt, hogy az első levélben hogyan nézne ki.
Aztán ha kész a sablon levél, akkor egyesítést kérsz fájlba (vagy nyomtóra, de szerintem jobb a fájl, mert ha mondjuk elakad a papír nem kell elölről kezdeni), és ha az Excel táblázatodban van 30, vagy 100 sor, akkor ennyi levelet készít a rendszer, mindegyikben az egyes sorokban lévő adatokkal.
Aztán ezt kinyomtatod, vagy kiküldöd.
Csak azt felejtsd el, hogy Excelből akard indítani, mert ez egy Word feladat, ami nagyon jól tudja kezelni az Excel adatokat.
Próbáld ki egy pici mintán. Egy egy, vagy két soros levéllel, és egy 2-3 soros Excel táblával, és meglátod, azt fogja csinálni, amit leírtál.
Egy Excel táblázatba több felhasználó visz be soronként adatokat, majd ezen adatok felhasználásával kellene egy-egy Word sablont megnyitni a makrónak, és a sablon meghatározott helyeire a táblázat meghatározott celláinak tartalmát beírni. Majd ezt a kész Word sablont megfelelő néven elmenteni. Az Excel egy sora egy Word dokumentum, de egyszerre csak egy készül. A cél, hogy a táblázatba már beírt adatokat ne kelljen újból beírni, hanem bizonyos feltételek mentén töltse ki a Word sablont.
Ahogy nézem a körlevelet, az a Wordből indul, nekem pedig az Excelből kellene indítani. No, próbálkozom :-)
" körlevél nem tűnt rossznak, viszont nálam az Excelben soronként bevitt adatok után az Excelből kiválasztva lenne jó egy sablon dokumentum meghatározott pontjaira importálni az Excel meghatározott cellatartalmát."
Ha jól értem a kérdésedet, és importálásnak azt nevezed, hogy az első levélbe az Excel tábla első sorában lévő adatok kerüljenek, a mkövetkezőbe a 2. sor adatai stb, akkor szerintem sem kell hozzá makró, hiszen a körlevél funkció éppen ezt tudja:
Megírod Wordben a sablon körlevelet, hozzákapcsolod az Excel fájlt, majd azokon a helyeken, ahol az egyes címzettek adatait akarod a kész levelekben látni, oda adatmezőket szúrsz be a Word sablonba, és a végén az "Egyesítés" gombbal létrehozhatsz annyi személyre szóló levelet, ahány sorod van az Excel táblázatban. Persze lehet szűkíteni, hogy csak ettől eddig kérsz leveleket. Fájlba kéred, ellenőrzöd, és ha kell kinyomtatod, vagy kiküldöd a címzetteknek.
Szerintem azzal sem engedte volna megnézni. A Google drive a feltöltött linket kétféleképpen engedi eljuttatni.
Alapértelmezésben csak azok nyithatják meg, vagy tölthetik le, akiket email címmel megjelölt a drive tuulajdonosa. A másik az, hogy a link birtokában bárki megtekintheti.
bringas1 barátunk valószínűleg elfelejtkezett az alapértelmezés átállításáról.
Érdeklődöm, hogy van-e arra lehetőség, hogy Excelbe bevitt adatokat Word meghatározott részére importáljak át.
A Wordben tartalomvezérlőkkel már próbáltam játszani, de azokat nem tudom, hogyan lehetne "megcímezni".
A körlevél nem tűnt rossznak, viszont nálam az Excelben soronként bevitt adatok után az Excelből kiválasztva lenne jó egy sablon dokumentum meghatározott pontjaira importálni az Excel meghatározott cellatartalmát.
Igen, nekem is google fiókos bejelentkezést kér, azt meg nem adok neki.
Szóval töltsd fel máshová (pl. data.hu, dropbox, stb.) vagy másképp (ha googledrive-on van olyan megosztás, ami nem akarja a macskád nevét is tudni, mielőtt megadja a hozzáférést a fájlhoz)
Köszönöm válaszod. Word-ben van az adat. Onnan szeretném Excelbe áttenni. Sajnos a nagyobb feltöltési lehetőséget nem találtam meg. A linken látható, hogy mire gondolok.
Eredetileg volt egy normál táblázat 6 oszloppal, és - egy meg nem nevezett transzformáció során - ennek a táblázatnak az összes adata ugyanabba az egy oszlopba került, és azt kellene visszarendezni táblázat formába.
Jól értettem?
Ha igen, akkor az a következő kérdés, lehet-e pontosítani, hogy egy sorban 5 vagy 6 adat van-e.
Ha VAGY 5 adat van egy sorban, VAGY 6, akkor ezt a feladatot képlettel egyszerűen meg lehet oldani.
Figyelem! Ebből a szempontból adatnak számít az üres cella is, tehát ha valahol csak 5 adat van, de ott az üres cella a hatodiknak, akkor az 6 adatnak számít!
Ha viszont egyszer 5 adat van, máskor 6 adat van, és ez véletlenszerűen változik, az nagyban megnehezíti a helyzetet.
Ez esetben csak olyan megoldást tudok elképzelni, ami valamilyen algoritmus segítségével felismeri, hogy hol kezdődik és/vagy végződik egy adatsor. Ez a megoldás valószínűleg makrós lesz.
Az első megoldást (a Split off the filename ... kezdetűt) el kellett vetnem, mivel akkor is beleveszi a onedrive könyvtárat, ha nem onnan indítom, de egyébként létezik a könyvtár.
A második megoldás viszont - aki nem emlékszik, hol találta - hibátlanul működik. Egy apró eltérés, hogy nem a Thisworkbook.Path-al egyenértékű megoldást ad, hanem benne van a fájl neve is a végén, de ezt könnyű orvosolni, ha leveszem belőle a Thisworkbook.Name eredményét
A harmadik megoldást nem értem. Valami olyasmi,hogy ha folyamatban van a szinkronizálás, akkor az URL címet adja, ha befejeződött, akkor a helyit. De ezt honnan tudja a program?
Tegnap letöltöttem a Microsoft 365 ingyenes próbaverzóját, így van rá egy hónapom tesztelni, hogy érdemes-e előfizetnem rá. Ami igazán csábító az az 1TB-os tárhely, amivel nem kell rendszeresen külső adathordozóra menteni azokat a fájlokat, emivel dolgozom.
Sikerült is telepítenem az Office csomagot, amit kipróbáltam, és egyelőre hibátlanul működik. Illetve azonos módon a 2019-es Office-al.
Ma álltam neki, hogy kipróbáljam a szinkronizáló funkciót. Létrehoztam a Onedrive könyvtárat, és áttettem bele néhány könyvtárat, amivel ki akartam próbálni. Ahogy látom, a fájlokat és a könyvtárakat rendben szinkronizálja. Gondoltam, elindítom a programomat.
Nos, a Ctrl+G nem működik, mert belehal... (ahogy szokott)
A makrót lefuttattam (volna), de az sem boldogult vele. Ott legalább nem halt meg az excel (nem ment át Nem válaszol-ba), de fél óra után meguntam, hogy csinál valamit, de semmi eredmény. Utána megpróbáltam még az általam módosított fájlon futtatni, akkor lefutott gyorsan, de nem jött fel semmi ablak, ahol láttam volna, mit talált.
Ja, igen, Ctrl+End-re elugrott a "világ végére", de nem találtam semmit.
Végül az lett, hogy megnéztem a saját tábláimat és egyáltalán nem szerepel benne Drawing könyvtár, úgyhogy kitöröltem az egészet. A tábla megnyitásakor köhögött, hogy sérült a fájl, javítsa-e, igen, erre bedobott egy naplófájlt, hogy 4 rajz törölve. Azóta a tábla villámgyors.
Még annyit láttam, hogy bár a Drawing könyvtárban az Drawing1.xml a rettenetesen nagy, a szintén ott található vmlDrawing1.vml és vmlDrawing2.vml néz úgy ki, hogy valami grafika van benne. De már feladtam, hogy megértsem :), ha tényleg nem szándékosan volt rajz valahol, akkor kész a hölgy óhaja, tudja használni a tábláját. Ha kell a rajz, akkor szenvedek még.
Mivel egyáltalán nem kell képeknek lenniük, a Ctrl+g -vel belépsz az Ugrás menübe, ott Irányított, majd Objektumok. Ez kijelöli a lapon lévő összes objektumot, amiket a Delete billentyűvel egyszerre törölheted.
Volt ilyen eset egy ismerősömnél, aki netről másolt. A képek nem látszottak, mert a szélességük nullára volt állítva. A fenti módszerrel drasztikusan csökkent a fájl mérete, a sebesség pedig drasztikusan megnőtt.
Kösz! Holnap megpróbálom, bár ma délután abszolút használhatatlan volt az Excel, ha megnyitottam a táblát.
Én addig jutottam, hogy ebben a könyvtárban van egy drawing2.xml is, az 2 kB. Azzal felülírtam a drawing1.xml-t (persze maradt a 2-s is), a tábla látszólag jó, villámgyors, de hát fene tudja, ezzel mit is csináltam.
Az az érdekes még, hogy én is rajzra gondoltam név alapján, de a táblázat mezei szöveges, nem lehetne benne kép, ezt elvetettem. De az .xml-be nézelődve valóban shape-eket láttam, ha jól emlékszem.
Sub ListShapes() Dim sh As Shape, ws As Worksheet For Each ws In ThisWorkbook.Worksheets For Each sh In ws.Shapes Debug.Print ws.Name & " - " & sh.Name
'sh.Delete Next Next End Sub
A kód a VB Editor immediate ablakába kilistázza az összes munkalapon lévő összes Shape (tkp. grafikus) objektum nevét. (A drawing ugyanis arra utal, hogy képek/rajzok vannak a munkafüzetben valahol.) Ha olyat shape-nevet látsz, ami nem odavaló, akkor ugyanebben az Immediate ablakban add ki az utasítást:
Szerintem nagyobb a baj, de most meg sem tudom nézni, mert teljesen halott a gép tőle.
De itteni ötletet alapul véve átneveztem. zip-re és azt megtaláltam, mi nőtt meg: xldrawingsdrawing2.xml. Ez lett 27 meg helyett 52 mega. (Mivel 97-98 %-ban tudja tömöríteni, így nőtt kb. 1 megával az xlsx.) Viszont erre nem találok javítást/leírást, csak olyat, mikor hibaüzenet van, itt meg az nincs.
Gyanús, hogy elállítódott a munkalap utolsó cellájának helye. Olvasd el ezt: http://forum.index.hu/Article/viewArticle?a=154594621&t=9009340. Hátha így tudjátok javítani. A lényeg: "Ctrl + End billentyű kombináció a munkalap utolsó használt cellájára ugrik. Ha ez túl van az általad szükségesnek ítélt tartományon, akkor a felesleges oszlopot, sort töröld."
A cégnél van egy tábla, amivel történt valami és használhatatlanul lassú lett. Értsd, 5 perc a megnyílás - vagy nem, de egyszer csak gondolkodni kezd a fenti időre. A használója nem tudja mihez kötni, egyszer csak ilyen lett.
Amit én látok, bő 2000 sor, kb. 10 oszlop, mondjuk ezek nagy részére szűrő van beállítva, de ezek a még jó táblában is ott voltak. Ami látszik, hogy amikor elromlott, akkor a 2 mb-os tábla 3 mb-ra nőtt.
Nincs valami "konzol" vagy valami, ahol konkrétan látszana, mivel szöszöl? Ja, igen, az i5-ös gépemen a processzor-használat 50 % fölötti volt, memória szinte semmi. Utoljára úgy megfogta a gépem, hogy 10 perc után is csak a feladatkezelőből tudtam kilőni az excelt. Azért lenne jó valami konzol (vagy debug), mert amúgy is nehéz megkeresni, mi került bele, de ha közben még gyakorlatilag meg is áll állandóan az excel, sosem jutok a végére.
Mikor Ctrl segítségével kijelölünk egy területet, a terület háttere szürke lesz, ezzel látványosan megmutatja a terület egységét.
Ha a Ctrl+ klikkel ugyanazt jelöljük ki, itt is sötétebb lesz a háttér. Valóságban nem, mint az egyszeres kijelölésnél sem, amit jól mutatnak a színlekérdezés változatlan paraméterei.
Ez a feltételes formázást juttatja eszembe, ahol a formázott háttér paraméterei az eredeti színesésével azonosak.
Feltételesen formáztam pár adatot (hátteret). Itt is sötétebb lett a kiválasztott cella Ctrl+klikkel, a paraméterek az eredeti adatait mutatták. Amint leléptem a celláról, a feltételhez beállított színre változott vissza a háttér.
Úgy tűnik, ez a sötétedés arra való, hogy szemléltesse, a terület már ki volt jelölve.
Lekérdeztem a színkódot a világos hátterű cellánál, majd Ctrl+klikk. Sötétebb lett a háttér, ahogy írtad, de a kódok maradtak. A következő klikknél dettó.
A színeknél a jobb felső halovány zöldet választottam. A lekérdezés szerint a háttér RGB(226,239,218), a színkód 35.
Mostanában úgy írom az Excel programokat, hogy lehetőleg kerülöm a direkt cellaműveleteket ciklusban, helyette beolvasom egy tömbbe az egész érintett cellatartományt, és a tömbben keresgélek. Mindig újra és újra meglepődöm rajta, hogy mennyire gyorsan mennek a számítások és keresési műveletek a memóriában.
Kicsit felturbóztam, mert lassú volt, meg javítottam rajta optikailag.
Sub kombi() Dim Rng As Range, hit As Range Dim ix As Long, Lvl As Long, Cnt As Long, iter As Long Dim LvlAct, LvlSel Dim BaseSum As Double, TestSum As Double Dim Dest As Double, small_ix As Double
Dest = Range("c3") Set Rng = Range("A3:A29") Rng.Interior.ColorIndex = xlNone Cnt = Rng.Cells.Count ReDim LvlAct(1 To Cnt) ReDim LvlSel(1 To Cnt) If Dest > Application.WorksheetFunction.Sum(Rng) Then MsgBox "A célszám nagyobb mint a tételek összege, szóval ennek biztosan nincs megoldása." End End If For ix = 1 To Cnt LvlAct(ix) = ix LvlSel(ix) = 0 Next
Lvl = 1 Do iter = iter + 1 If Right(CStr(iter), 2) = "00" Then Application.StatusBar = iter DoEvents End If small_ix = Application.WorksheetFunction.Small(Rng, LvlAct(Lvl)) TestSum = BaseSum + small_ix If (Round(TestSum, 5) < Round(Dest, 5)) Then If LvlAct(Lvl) < Cnt Then LvlSel(Lvl) = small_ix BaseSum = BaseSum + LvlSel(Lvl) Lvl = Lvl + 1 LvlAct(Lvl) = LvlAct(Lvl - 1) + 1 ElseIf LvlAct(Lvl) = Cnt Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 End If ElseIf (Round(TestSum, 5) > Round(Dest, 5)) Then Lvl = Lvl - 1 BaseSum = BaseSum - LvlSel(Lvl) LvlAct(Lvl) = LvlAct(Lvl) + 1 LvlSel(Lvl) = 0 ElseIf (Round(TestSum, 5) = Round(Dest, 5)) Then MsgBox "heuréka" For ix = 1 To Cnt If LvlSel(ix) = 0 Then Exit For Set hit = Rng.Find(what:=LvlSel(ix), lookat:=xlWhole, LookIn:=xlValues) If hit Is Nothing Then MsgBox "bibi van" Stop Else hit.Interior.ColorIndex = 4 End If Next Set hit = Rng.Find(what:=small_ix, lookat:=xlWhole, LookIn:=xlValues) If hit Is Nothing Then MsgBox "bibi van" Stop Else hit.Interior.ColorIndex = 4 End If Application.StatusBar = False Exit Sub End If Loop End Sub
Van egy változó kb. 40 db számot tartalmazó tartományom és van egy adott számértékem, mely e tartomány egyes számainak összege, de! nem tudom, mely számok összege.
A kérdés: a manuális próbálkozós módszer helyett van-e más módszer pl. mondjuk függvény segítségével megállapítani, hogy mely számokat kell összeadnom.
Szerencsére nem gyakran előforduló problémáról van szó :)
Ennek megfelelőt tettem a personalba, hogy minden füzetben elérhető legyen. Sűrűn használom. Nálam Ctrl+e, mint érték beillesztés, de ez csak részletkérdés.
Az eddigi tartalmakat jelöltem ki (tehát nem az egész oldalt) és tettem át (nem volt egy könyvelői sem köztük) de az alattuk keletkező új sorokban máris ott virítottak az €-k és tsai...
Azt írta, hogy eredetileg csak egyes sorokat akart átmásolni. Ebben az esetben miért "normális, hogy nem sikerült"? Ha se a forrás-, se a célállományban nem voltak így formázva a számok, akkor miért változtatta ezt meg a másolás?
"...a rendelési táblázatból minden lapfül tartalmát egyesével átmásoltam egy új munkafüzetbe..."
Ha jól értelek rámentél a munkalapra (amit lapfülnek nevezel), megnyitottad, kijelöltet az összes sort, vagy oszlopot, és bemásoltad az új munkafüzetbe? Mert akkor normális, hogy nem sikerült.
Ha a teljes munkalapot másolod, akkor megőrződnek a formázási beállítások. De még jobb, ha a teljes munkafüzetet másolod az összes munkalapjával. Aztán átnevezed, ha szükséges.
És ha van feleslegessé vált munkalap akkor azokat a fülre kattintva egér jobb gombbal eltávolítod.
Nem akarom Rád erőltetni, de ha gondolod, kipróbálhatod:
Én a melóhelyen minden reggel meg szoktam nyitni egypár táblázatot, amelyek aztán nyitva vannak a munkaidő végéig. Abban a táblázatban, amit először szoktam megnyitni, létrehoztam egy makrót, ami annyit tesz, hogy a kurzor helyén beilleszti a vágólap tartalmát, de formázás nélkül, azaz értékként. Ehhez hozzárendeltem a Ctrl-Q kombinációt. Ez általában jól működik minden táblázatból táblázatba másolás esetén, amíg a makrót tartalmazó táblázat is meg van nyitva.
Egy munkafüzetből (amelyikben nincs könyvelési cellla) kivágok egy sort és egy másik táblába beillesztem.Ott ez a művelet néhány cellát könyvelésivé tesz (ezen sincs alapvetően egy ilyen sem), azaz pl.: a sima 3 ból 3,00€ lesz.
Ez egy rendelési táblázat ami lezárult azt az archívban tárolom és ez így mindennapos probléma.
Az Office 2016 volt, gondoltam a csere megszünteti ezt a gondot, leváltottuk 2019-re, és a rendelési táblázatból minden lapfül tartalmát egyesével átmásoltam egy új munkafüzetbe, de így is előjött a cumi.
Korábban kértem segítséget, mert a magyar és angol Excelek között nem működött a CELLA/CELL függvény. A hivatkozásokban használni kellett a "col/oszlop" és a "row/sor" kifejezéseket, és emiatt ugyanaz a munkalap a különböző nyelvű Excelekben nem működött.
Most csak egy új tapasztalatot jöttem megosztani: a Microsoft megtanította a magyar Excel 2020-at angolul (az angol továbbra sem tud magyarul), így a magyar már egyformán működik a row és col, illetve a sor és oszlop opciókkal is. Az angol persze nem megy az utóbbival, de legalább már nem kell a nemzetköziesítéssel bajlódni.
Köszönöm. CSak azt nem értem, hogy miért kellett egy eddig jól működö megoldáson változtatni. Amint azt sem, hogy pédául a kitöltés lefelé billentyűkombinációját a magyar verzióban miértl kellett a már megszokott Ctrl + L-ről az angolna megfelelő Ctrl + D-re változtatni. Meg ki tudja még mit. NA jó, ezt legalább néhány hónapon belül újra megszokom.
Azt hiszem, megvan a megoldás. Ha nem kapcsolom vissza a ScreenUpdate-et, akkor nem áll le a program, és szépen visszamegy a menübe. Csak ennek az a következménye, hogy az onnan indított valamennyi menüpontnál ellenőriznem kell, hogy nem szükséges-e visszakapcsolni. Mert az sem mindig jó, ha végég ki van kapcsolva, mert egyes képernyőelemek meg éppen ettől nem jelennek meg.
"Biztosan visszakerül a vezérlés erre a formra a feladatok elvégzése után?"
Szerintem rajta van. Azért tudok a bal szélső képre kattintva visszajutni a menühöz (mart például az nem nyitott "fájl" hanem a Form képe. Csak előzőleg a 2019-es rendszer fennakadt azon a képen, és leállította a vezérlést. Ha viszont ezen a tájékon megállítom a futást, majd továbbengedem, akkor nem akad el, hanem továbbmegy a menüre. Ezért tippeltem elsőre azt, hogy valami timer probléma lehet.
A dühítő, hogy a visszamásolom a programot az adatokkal együtt a másik gépemmre, ahol office 2010-es fut, ott gond nélkül lefut, nem villant a képernyő Excel fejléceket, és amikor a fájlba írja az eredménylistákat, akkor nem kell letiltani a screenupdate-ot, mert akkor sem listázza a képernyőre az éppen fájlba írt adatokat.
Hoppá erről ugrik be valami. Mivel itt, ha engedélyezve van a screenupdate, akkor majdnem abban a formában írja ki képernyőre a fájl tartalmát, ahogy a fájlba íródik. A táblázati adatokat ott bekeretezem, és a k$pernyőn is így jelenik meg. Lehet, hogy ezzel van inkább összefűggésben a leállás. Tehát leáll a fájlba írás, leáll a képernyőn is a továbblépés. Mi okozhatja ezt? Van valami beállítás akár az Excelben, akár a Windows 10-ben, hogy a fájlba írást kövesse a képernyő? Megpróbálok erről az oldalról utánanézni.
Szia! Háát... szép mennyiségű Excel fájl van nyitott állapotban úgy látom. Talán a vezérlés visszaadás körül kellene keresgélni. Biztosan visszakerül a vezérlés erre a formra a feladatok elvégzése után?
Próbáld az adott feladat befejezése után megállítani a futást és utána lépésenként megnézni, mi történik.
Bocs, ezt csak most vettem észre. Szóval nem tudom, hogy be van-e töltve, mindenesetre ott van. Amikor megáll az Excel munalapot mutatva, akkor atálván az Excel gombra kattintva a következők jelennek meg: Először az alsó sor listájának jobb szélső képe jelenik meg nagyban, de maga a menü pedig a lista bal szélén van, és ha arra kettintunk, akkor megjelenik a menü, ahogy a képen most látható. És ezzel lehet folytatni a munkát. És ha csak én dolgoznék vele, akkor ezt akár tudomásul is venném, de nem hagyhatom ennyiben.
Már azt is próbáltam, hogy létrehozok egy másik fájlt is őelőtte, vagy őutána, abba írok is egy adatot, majd lezárom, de ez mindkét esetben ott marad. Pedig nem teszek vele mást, csak valamivel többet írok bele. Különböző fájlok tartamának részeit bekeretezett táblázatokban.
Bocs, lehet hogy nem is ScreenUpdating a probléma. Kitöröltem, és mégsem megy vissza a menu képernyőre, hanem az utoljára létrehozott munkafüzet aktuális munkalapját mutatja.
Egyes feladatoknál kikapcsolom a képernyőfrissítést, mert nagyon ugrál közben a képernyő. És gyakori, hogy amikor visszakapcsolom, akkor felvillantja ugyan a formon a feladot követő menüt, de aztán elkapja, és az egyik munkalap képernyőjét mutatja. Külön rá kel lkattintanom az Excel alsó sorbeli listájában arra, ahol a menü látható.
Próbáltam rákeresni. Találtam olyan javaslatot, hogy az Application.ScreenUpdating=True után tegyek be egy DoEvents parancsot. Nem vált be.
Volt olyan javaslat, hogy használni kell az Application.ScreenRefresh parancsot. Csak ilyen nincs. Állítólag Excel 2003-ban volt.
Van valami megoldás a képernyőfrissítés érvényesítésére? (Megjegyzem, nekem a 2010-es verzió alatt nem jelentkezett ilyen probléma)
Igen, de dátummal együtt. Legalábbis nálam. A date ebből csak a dátumot.
Viszont megnéztem. Nem az Excel a hunyó, hanem a Windows. A Win7-ben a dátum és időbeállításoknál 4 verzióból lehetett választani. A Win10-ben csak kettőből, és mindkettő többlet szóközzel:
Viszont örülök, hogy most sikerült ezt is megtalálni, mert meg tudtam oldani, hogy ettől is független legyen a dátum megfelelő kiolvasása.
Újabb döbbenet. A now eddig úgy nézett ki, hogy éééé.hh.nn, és ezt szívesebben hsználtam mid() függvénnyel fájlnévhez fűzött dátumstring összeállítására, mint a Year/month/day függvényeket (nem kellett vacakolni a hónap és nap vezető nulláinak a hozzáfűzésével).
Erre ma látom, hogy a dátumaim jgy néznek ki: "20. 0.. ". Megnéztem, hát nem módosult ez is: A now most 2020. 08. 10. 19:46:10. Hát ennyit a felülről kompatibilitásról.
Na meg annyit, hogy amikor fájlba készítek listát az adatokról, akkor a 2010-es Excel csöndben megcsinálta, ez meg listázza közben a képernyőre. Nem nagy baj, de zavaró. Szerencsére a screenupdating leállítja. De azért nem értem, hogy adatok fájlba történő kiírása hogy jelenhet meg a képernyőn.
Ha 5-10 éve írtam volna a programot, most ezek mind előjönnének.
az Excel VBA van közvetlenül. Én felvettem a kedvencek közé :)
Bal oldalon kibonthatod amit keresni szeretnél, illetve más office alkalmazások helpjei is elérhetők. Néha egész részletes, néha pedig - ahol nagyon kellene - semmitmondó a szöveg. De ezt már megszoktuk.
Részben megoldódott. Az újratelepítés előtt kipróbáltam office 2016-al. Ott is jelentkezett mindkét hiba.
Eltávolítottam, és feltettem a 2019-est.
A második hiba rejtélyes módon megszűnt. Lehet, hogy az előző telepítéseknél valami nem sikerült rendesen, csak nem vettem észre?
Az első hiba még mindig jelentkezik. Nvezetesen, hogy egy szabályosan beállított textbox (ahol a visible és az enabled egyaránt True, és semmi más rendellenesség nem látszik) nem tudja fogadni a setfocust. Ez nem lenne tragédia, mert olyan művelet után történik ez, amit a felhasználó nagyon ritkán, vagy sosem használ. Csak az a félelmem, hogy vajon nem jön-e elő a jelenség más helyzetben is.
Nálam 2016-os Excelnél most úgy jelenik meg, hogy az objektum tallózónál az MS technikai oldal jön be, ha a sárga kérdőjelre kattintok, ha viszont a menü Help gombra, akkor az éppen kijelölt objektumra vonatkozó szöveg. Próbáld így.
Korábban a sárga kérdőjel vitt az adott objektumhoz.
"Feltételezhetően az a probléma, hogy mire a program odaér, még nem töltődik be rendesen a form."
Ez nem tudom, hogy történhet, hiszen rajta vagyok, a formon fut az initialize részlet, és ez feltölti a rajta lévő textboxokat. Csak nem azt mutatja, hanem az itt elsőként megnyitott munkafüzet munkalapját jeleníti meg.
Akkor most visszateszem a 2019-et.
Ezzel kapcsolatban egy kérdésem van: A régi verzióban a VBA Help-re megjelent egy ablak, ahol be tudtam írni a kérdéses függvény/parancs nevét, és arról kaptam leírást. A 2019-esnél ugyanez megnyit egy Microsoft Docs honlapot, amin egyelőre nem igazodok ki.
Ki lehet kapcsolni ezt a szolgáltatást, és visszaállítani a korábbi Help funkciót?
Feltételezhetően az a probléma, hogy mire a program odaér, még nem töltődik be rendesen a form. A Wait szerintem azért nem jó, mert ebben az esetben a program futása felfüggesztődik, kvázi nem történhet semmi. Esetleg egy megfelelően hosszú üres ciklust próbálj meg.
Off:
Igen, úgy tűnik, hogy számok esetén a VBA az utólagos deklarációt alkalmazza, sőt ez még nem is elég (baj), mert a számokkal való műveletnél a legalacsonyabb "deklarációt" veszi figyelembe. Pl. hiába long az eredmény változó, ha a kiinduló változó integer, a kiinduló változó olyan szorzása esetén, aminél az eredmény túllép az integer határon, túlcsordulási hiba keletkezik. :(
Ha pontot teszel utána, akkor a VBA már Double ill. Single típusnak értékeli ki, ezért nincs túlcsordulás.
Úgy látszik, mindig van új a nap alatt a gyakorlatban (mert egyébként ez nagy eséllyel a kezdetektől így működik.)
Köszönöm. A helyzet az, hogy a második jelenség valami időzítési gond lehet. Ugyanis ha közvetlenül a initialize részlet befejezése előtt beteszek egy breakpoint-ot, majd a megállás után tovább engedem, akkor jó.
Ezért megpróbáltam az Application.Wait parancsot használni, de nem segít. Még ha 1 teljes percre is állítom be, akkor is a továbblépésnél az Initialize részletben elsőként megnyitott munkafüzet munkalapját jeleníti meg a képrnyőn, mikozben a vezérlés a UserFormon van.
Azért most megnézem, mi a helyzet a javaslatoddal a Win10/office 2010 párossal.
Off: A várakoztatás kapcsán találtam egy érdekes furcsaságot, ami még 2010-es verzióban is így van: Ha nem nagy egész számokkal végzek műveleteket, akkor azokat integernek tekinti az Excel úgy programban mint immediate módban (Munkalapon nem). Ezért egy olyan szorzást, hogy 1440*60 owerflow hibának jelez. Ha egy tizedesjegyet beleírok (1440.0 *60), akkor nem.
Sziasztok, teljesen el vagyok keseredve. Az asztali gépemen áttértem a Windows 10-re és ha már lúd, legyen kövér, az Excel 2010-ről átváltottam Excel 2019-re.
Namármost a program, amin hosszabb ideje dolgozom, és Win7/Office2010 alatt a következőket műveli az új rendszeren:
1. Bizonyos körülmények között - reprodukálhatóan - hibát ad az egyik userformon egy textbox.setfocus parancsnál. A különbség az, hogy egy másik userformon módosítom egy textbox értékét. Ha ezután kilépek a programból, a hiba nem jelentkezik, de ha rögtön átmegyek a másik userformra - ahol egyébként nem használom az adott textboxot, akkor hibát jelez. De ez a kisebbik baj, meg tudom kerülni a hibát.
2. A súlyosabb, hogy a program egy adatbeadó userformra egyszerűen nem áll rá, pedig a form kódján vagyok. Amikor meg kellene jelenítenie a formot, akkor az egy pillanatra felvillan, majd továbblép, és megáll az egyik használatban lévő munkalapot mutatva. Persze ott van, ha rákattintok az Excel főképernyőre az alsó soron, akkor előjön, de a felhasználótól ezt nem kérhetem-
Szerencsére van egy laptopom, amin még meghagytam a Win7/Office 2010 párost. Most elindítottam ezen a programot, és a fenti hibák egyike sem jelentkezik. Van tippetek, hogy mi lehet a megoldás? Így nem merem kiadni a kezemből a programot. Pedig két hét múlva kellene. Talán egy másik szoftvert kellett volna választani, de most már késő bánat.
"Íme egy nagyon egyszerű példa: az angolul "Membrane Associated Ring-CH-Type Finger 1" elnevezésű gént egyszerűen csak MARCH1 névre rövidítve emlegették, ami ugye angolul annyit tesz, hogy március 1. A Microsoft Excel pedig van annyira okos, hogy amikor egy dátumot lát az egyik cellában, azt automatikusan formázza nekünk, így a tudományos munkákban a gén neve helyett a dátum angol formája jelent meg: 1-Mar. Ezt viszont, érthető módon, a tudósok nem tudják hova tenni, amikor génekről akarnak diskurálni.
Egy 2016-os tanulmány a genetikai kutatásokról szóló 3597 tudományos munka egyötödében talált Excel által elkövetett hibákat."
Még lenne egy kérdésem. Azt szeretném elérni, hogy minden lapra ugrásnál egy bizonyos cellára ugorjon.
Tehát.
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub Select Case Target.Value Case "Alma" Sheets("Munka2").Activate
Range("I2").Select Case "Körte" Sheets("Munka3").Activate
Range("I3").Select Case "Barack" Sheets("Munka4").Activate
Range("I4").Select End Select End Sub
Ezt próbáltam, de így nem jó. 1004-es hibát ad. Ezt még meg tudnád mondani kérlek, hogy rakjam bele a makróba?
A Munka1 kódlapjára másold be ezt (lapfülön jobb egérgomb - kód megjelenítése):
Private Sub Worksheet_Change(ByVal Target As Range) If Intersect(Target, Range("B2")) Is Nothing Then Exit Sub Select Case Target.Value Case "Alma" Sheets("Munka2").Activate Case "Körte" Sheets("Munka3").Activate Case "Barack" Sheets("Munka4").Activate End Select End Sub
Azt szeretném létrehozni, ami ebben a videóban van, csak click nélkül. Tehát ha a legördülő listából kiválasztom valamelyik értéket, akkor az arra a munkalapra ugorjon rögtön, automatikusan, és ne kelljen külön kattintani. Ez gondolom csak makróval megoldható, de nekem az is jó lenne.
1) Amiben megjelölöd a vásárló nemét. Ezt kézzel ki kell tölteni.
2) Amiben definiálod az időszakot. Ez lehet képlet, ha pl. heti, havi, éves, stb. bontásban szeretnéd látni az adatokat. Esetleg lehet egy oszlop a heti bontásnak, egy a havinak, egy az évesnek, vagy ahogy tetszik.
Ha ezek megvannak, akkor már csak egy pivot táblát kell létrehozni, abban sormezőnek az időszakot, oszlopmezőnek a nemet kijelölni, az adat pedig név/darabszám.
Sziasztok! Tudnátok ebben nekem segíteni? Kellene egy meglévő excel táblázatból készítenem egy kimutatást, hogy milyen arányban vannak a férfiak nők, és ez változott-e esetleg időszakonként vagy kb állandó? megvannak a nevek és a vásárlási dátumok. Hogy kezdjek neki? Van ötletetek? Köszi a segítséget előre is.
Nem ez volt először a felállás. A mostani makró a Munka2 lap A2-be beírja az eszközt, amit a Munka1 lap E24 cellájában kiválasztottál. A B2-be a max kerül, a C2-be a név.
Private Sub Worksheet_Change(ByVal Target As Range)
Dim sor As Long, oszlop As Integer
If Target.Address = "$E$24" Then
sor = Application.Match(Range("E24"), Columns(1), 0)
For oszlop = 2 To 12
If Cells(sor, oszlop) = Application.WorksheetFunction.Max(Range("B" & sor & ":L" & sor)) Then
Illetve egy egyszerűbb módszer, ha ugyanabban a munkafüzetben vannak,
kijelölöd az eredeti és Ctrl -t használva a másolatot is.
Ezután amit az eredetibe írsz, a másolatban is megjelenik (és vica - versa).
A bonyolultabb:
A másolatban hivatkozásokat hozol létre az eredeti munkalapra (pl. a1 cella képlete =eredeti!A1 stb.). Ez használható akkor is, ha a másolat másik munkafüzetbe került, csak akkor a teljes címzést kell használni, amit tartalmazza a munkafüzet nevét is.
Ámde a teljes tartományt át kell hivatkozni celláról-cellára! (illetve a képletek természetesen maradhatnak, azoknak a másolatra kell hivatkozniuk - kivéve ha azt is változtatni akarod - ez sajnos nem megy, csak az értéket veheted át, a képletet nem).
Még bonyolultabb:
Makró, ami a változásokat eseménykezelővel átmásolja a másolatba is. Ez megy azonos és eltérő munkafüzetben is.
Üdv.
Ps. Miért nem jó az, ha a változásokat átvezetve az eredetin, utána ismét csinálsz róla egy új másolatot a régi helyett???
Hogyan tudom megoldani azt, hogy egy munkalapot másolva, az eredeti munkalapon történt módosítás megjelenjen a másolt munkalapon is? Köszönettel Bangyi54
Elnézést kérek mindenkitől ezért az egészért. Az én hülyeségem volt az oka. Abban a tévhitben voltam, hogy a Format és a Numberformat használata során azt a tizedesjelet kell a parancsban használni, ami a gépen be van állítva az adatbeadáshoz. Sok órai felesleges munka és a zaklatásotok után jöttem rá, hogy a kódszövegben a tizedes jelölője fixen a pont. Innen voltak a zavarok, nem a TextBoxokban.
Most épp az ellenkezője a probléma. A 34643-ban írtam, talán kicsit pontatlanul fogalmazva, hogy " Szeretném a programomat hordozhatóvá alakítani, azaz függetlenné tenni az adatok kiírását, beolvasását és editálását attól, hogy milyen tizedesjel van beállítva a gépen."
Azt akartam megfogalmazni, hogy az adott gép beállításait tudja használni a felhasználó.
Annyit már látok, hogy a Registryt békén hagyhatom. Viszont azt is tapasztalom, hogy ha az Excel beállítás tizedesvessző, akkor nem tudom igazán kezelni az adatok számként való kiírását és onnan való visszaolvasását. Éppen azért számként, hogy a munkalapon a beállítás szerinti formában jelenjen meg az adat.
Köszönöm a javaslatot a CStr-re, meg fogom próbálni.
Régen elvesztettem a fonalat, de már az elején is azt gondoltam, hogy kellene írnod egy függvényt, ami a textboxba írt, numerikus jelentéstartalmú szöveget számmá átalakítja, bármilyen tizedesjel is van ott éppen, és akkor tudsz az értékkel tovább dolgozni. Amikor pedig textboxban jelenítesz meg egy numerikus értéket, akkor a CStr függvényt kellene használni.
34628-ban írod: "Jobban szeretem a tizedespontot használni vessző helyett." Nekem úgy tűnik, hogy ez a mondat generálja az egész problémát, és ha jól értelmezem a szavaidat, akkor egységesíteni szeretnéd a tizedesjelet, függetlenül attól, hogy az illető gépén mi az aktuális konfig. Ennek szerintem van egy kockázata. A programod végfelhasználója ugyanis a saját gépén fogja használni, egy olyan gépen és olyan billentyűzettel és olyan területi beállításokkal, amilyet megszokott. Aki magyar beállításokat használ, nem fogja elvárni, hogy pont legyen a tizedesjel, és talán szeretni sem, ha ebbe belekényszeríted.
Visszatérek az adatkiírási és beolvasási problémámhoz. Ugyanis nem tartom jó megoldásnak, amit kínomban alkalmaztam, azaz, hogy a Registry tizedesbeállítást módosítom a futás idejére. Mások fel is hívták a figyelmet arra, hogy ez nem DOS, ahol a program befejezéséig nem tud a felhasználó más feladatba fogni. Itt menet közben elkezdhet mást nézni, és ott bizony zavaró lehet a módosított beállítás.
A Registry, vagy az Excel tizedesjel beállítását a csere erre: melletti boxban lehet módosítani. Beleállva a pont, vagy a vessző (ad abszurdum más karakter) lenyomására azonnal érvényesül a változás, amit aztán befejezéskor vissza lehet állítani, vagy megtartani. Ld. a kétféle befejező gombot.
A lényeg, hogy egy tizedesszám (ponttal, vagy vesszővel egyaránt tesztelhető) beírása után a program kétszer háromféle eredményt ír ki. Az első sorban a format függvénnyel fixen a tizedesponttal "0.00", majd az applikáció (Excel) szerinti tizedesjellel, végül a rendszer szerinti tizedesjellel formázza a TextBox adatát, és írja ki a munkalapra. Ha valamelyik vessző, akkor a formátumkódja: "0,00"
Az alatta lévő sorban a TextBox valorizált értékét írja ki, majd a cellát formázza a Numberformat Property segítségével a fentivel azonos módon.
Érdekes, hogy a legrosszabb eredményt akkor kapom, ha mind a Registry, mind az applikáció szintű tizedesjel vessző. Ekkor nem sikerül használható eredményt kapnom.
Annyit azért már látok, hogy a Registry módosítását elhagyhatom. Ha az Excel tizedesjegyét állítom csak pontra, és a program futtatása során pontot használok tizedesjelként, az jobb híján elfogadható kompromisszum.
De azért kíváncsi vagyok, hogy szerintetek van-e olyan megoldás, amivel még az Excel beállításait sem kell piszkálnom.
Kérdésedre válaszolva: bizonyos dolgokban lehetnek különbségek, például a 32 és 64 bites verziók között, de ebben valószínűleg nincs eltérés. Az egyik kollégámmal most néztük meg egy 32 bites XP-n és egy 64 bites W10-en, és mindkettőben megvolt ott ez a kulcs és változó.
Ezt köszönöm. Ki fogom próbálni. Lesz vele gond így is, mert elég sok boxot érint. Ráadásul a visszaolvasásnál is figyelni kell, hogy a megfelelő számot kapom-e vissza a számításokhoz. Mindenesetre eljátszadozom majd vele. Még azt sem tudom, mi lesz, ha módosítom. Azt hogyan kezeli. De nem látok más megoldást egyelőre.
Bocsánat, most megnéztem a klónozáshoz, és kiderült, hogy elnéztem. Egyetlenegy sincs, amelyik jól működik, ha a tizedesjel nem pont. Csak az egéseknél hozta a 0 értékű tizedest. Erre hittem, hogy jó.
Újabb gond. Szeretném a programomat hordozhatóvá alakítani, azaz függetlenné tenni az adatok kiírását, beolvasását és editálását attól, hogy milyen tizedesjel van beállítva a gépen.
Részben kezd rendben lenni a dolog. Ha váltok pontról vesszőre, vagy vissza, a számként kiírt adatok a megfelelő módon jelennek meg a munkalapokon. (Azzal most nem foglalkozom, hogy a felhasználó más karaktert is használhat, hiszen ilyenkor a kérdés úgy fogalmazódik át, hogy pont, vagy más)
Viszont amikor TextBoxokba olvasom be az adatokat, akkor van némi következetlenség. Van olyan TextBox, amelyik engedelmesen ponttal, vagy vesszővel veszi be az adatokat a beállítástól függően. Viszont van olyan, amelyik ponttal rendben dolgozik, a vesszőt viszont nem hajlandó tudomásul venni. Mindenképp ponttá alakítja.
A forrás adatokat számokként írom ki a munkalapra, ahonnan TextBoxba olvasom. Megpróbáltam nem közvetlenül a munkalapról olvasni, hanem közbeiktattam egy single típusú változót. Abba helyes formátumba olvastam be az adatot. De amint ezt az értéket adtam át a Boxnak, a tizedesjel azonnal visszaváltott pontra.
Keresgélek az interneten, találok hasonló problémát, de megoldást nem. (A javaslatok köz szerepel olyan, hogy az ezres elválasztó ne legyen azonos a tizedessel, de ilyen nálam nincs)
Van esetleg a TextBoxnak valami olyan tulajdonsága, hogy milyen decimális elválasztót használ?
u.i: Most éppen rátaláltam a TextBox.Format Property -re, de az csak Access-re vonatkozik.
Megvan a megoldás. Ismét egy sok évvel ezelőtti hasonló gond ötlött fel. Akkor is Jimmy találta meg a megoldást egy Listbox elhagyási probléma kapcsán. Ott is a KeyPress volr a hiba okozója. És a KeyUp vizsgálata megoldotta a gondot. (http://forum.index.hu/Article/viewArticle?a=128325944&t=9009340)
Itt is ez lett a megoldás. Akár a KeyUp, akár a KeyDown eseményt használom helyette, rendben működik a program.
Egy ListBoxból választok. A doubleclick választással rendben lefut a program, billentyűzetről Entert nyomva a KeyPress eseményt követő End Sub-ra visszaérve Automation Error hibával leáll.
A meghívott cmdKivalaszt részlet lényegében előkészít egy újabb ListBoxot, ahol ki lehet válogathatni néhány egyéb figyelembe veendő tényezőt, majd annak a másik ListBoxnak a setfocus parancsával ér véget, és ide visszatérve kellene megjelennie.
Private Sub lstListatip_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)
If KeyAscii <> 13 Then Exit Sub cmdKivalaszt_Click End Sub ' Itt akad el Automation Error hibával
Private Sub lstListatip_DblClick(ByVal Cancel As MSForms.ReturnBoolean) cmdKivalaszt_Click End Sub
Nem tudom, hogy ennyiből meg lehet-e tippelni a hiba lehetséges okát. A meghívott részlet elég terjedelmes, tartok tőle, hogy nem igazán lenne követhető, ezért nem másoltam be.
3. Szövegformátumra állítsd a cellát (ha már van benne dátum, akkor bele kell enterezni, vagy szövegből oszlopok funkcióval is használható erre tömegesen)
Nálam eleve telepítve van az US angol billentyűzet, és azzal működik a dolog.
Viszont attól tartok, hogy nem fogom tudni használni, mert a programot előbb-utóbb kiadom a kezemből, és nem garantálható, hogy minden gépen, telepítve van az US Angol. Ráadásul nem tudom, megoldható lenne-e a programból csak arra a feladatra átkapcsolni, ahol a számadatok beadása történik, mert egyéb helyeken meg szükség lehet a magyar ékezetes karakterekre.
Tehát mégiscsak meg kell maradnom a change eseményben történő kezelésnél Fferi javaslata nyomán.
Első körben vegyél fel annyi segédoszlopot, amennyi karakterből áll a vonalkódod, és a KÖZÉP függvénnyel bontsd szét őket egyes számjegyekre, majd faék-egyszerűen szorozd össze a konstansokkal (1 és 3) az egyes számokat. A végén, a "mennyi kell a következő 10-eshez" pedig két módon lehet: vagy leosztod maradék nélküli (egészrészre lefelé kerekítve) 10-zel (pl. 89/10=8), ehhez hozzáadsz egyet (8+1=9) és beszorzod 10-zel (9*10=90), majd az eredeti számot kivonod ebből (90-89=1), vagy két egymásba ágyazott HA párossal (HA függvénnyel azt hiszem, 7-et tudsz egymásba ágyazni, úgyhogy két felé kell választanod: praktikusan 5 és annál kisebb, 5-nél nagyobb utolsó számjegy alapján), majd egymásba láncolni őket..
Vagy keresel a neten egy makrót, ami végigszámolja. :)
Segítséget kérek, mert szükségem lenne egy excel fájlra a munkámhoz, ahol EAN13 kódot kellene generálnom, azaz a 12 karakterhez az ellenőrző számot kellene hozzáadni.
Jelenleg egy free weboldalon szoktam elkészíteni, de most olyan feladatot kaptam, hogy 120-130 ilyen számot kellene generálni, amit jó lenne úgy, hogy egy oszlopba beírom az excelben és a mellete lévő oszlopba generálná a kódot.
Persze ehhez előbb telepíteni kell az US angol billentyűzetet. Ha másik fajta angol billentyűzetet telepítesz, annak más lesz a kódja. Azt a kódot megtalálod ezen a linken, a legfrissebb doksiban:
Esetleg, a form aktiválásakor állítsd át a billentyűzetet angolra, és akkor eleve pontot fog írni. Aztán mikor bezárod a formot, állítsd vissza magyarra.
#If Win64 Then Private Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, ByVal Flag As Long) As LongPtr #Else Private Declare Function ActivateKeyboardLayout Lib "user32.dll" (ByVal HKL As Long, Flag As Long) As Long #End If
Private Const ENG = 1033 'English(US) keyboard language layout Private Const HUN = 1038 'Hungarian keyboard language layout
Private Sub UserForm_Initialize() Call ActivateKeyboardLayout(ENG, 0) End Sub
Private Sub UserForm_Terminate() Call ActivateKeyboardLayout(HUN, 0) End Sub
Szerintem a form az egy külön világ (lásd - eseménykezelés letiltás hatástalan).
Sajnos szerintem kénytelen leszel eseménykezelést írni.
Bár kicsit nem értem a kérdést: Ha a textboxba számokat írsz, akkor ott csak a pont lehet tizedesjel, ha vesszőt írsz oda, akkor az utána levő számokat már nem veszi figyelembe.
Szerintem talán egyszerűbb lenne a textboxból kilépéskor átalakítani a vesszőt ponttá.
Esetleg a Textbox Change eseményben átalakítani a vesszőt ponttá és akkor már úgy is jelenik meg. (Textbox1.Text=Replace(Textbox1.Text,",","."))
Egy újabb kérdés. Jobban szeretem a tizedespontot használni vessző helyett. A területi beállításoknál ez az alapértelmezésem, az Excelben is.
Amikor egy cellába adatot írok be, akkor használom a numerikus billentyűn lévő vesszőt, és a cellába pontot ír.
Viszont ugyanez nem történik meg, ha Formon textboxba szeretnék adatot beírni, így nem tudom használni a numerikus billentyűzetet. Asztali gépről van szó, laptopon nem jön szóba nálam az Fn billentyűvel kombinált "numerikus" billentyűzet használata.
Van rá megoldás, hogy automatikusan pontnak tekintse azt a vesszőt is? Elvileg szóba jöhetne a KeyPress esemény használata, de jobban örülnék, valami automatikus megoldásnak. Akkor nem kellene minden textboxhoz külön megírni az eseményt.
Szia! Szerintem a Shift paraméternek akkor van jelentősége, ha nem egész oszlopot vagy sort szúrsz be, hanem csak cellákat. Ebben az esetben arra ad utasítást, hogy a meglevő cellákat lefelé (xlShiftDown) vagy jobbra (xlShiftToRight) tolja el.
Egész soroknál - oszlopoknál egyértelműen mindig az adott sor/oszlop elé szúr be, a Shift paraméter tulajdonképpen nem is szükséges ekkor, ha makrót rögzítesz, ki is hagyja.
Köszönöm, de a megoldás rögtön szült egy kérdést. Milyen esetben lehet a shift megadásának jelentősége?
Én most próbálgattam, és azt látom, hogy akár elhagyom, akár xlDown-ra módosítom, ugyanúgy hátratolja a célsort követő sorokat. Ami logikus is egy sor beszúrásnál.
Megoldódott. A pontos okot nem tudom, mindenesetre kicsit átrendeztem a ListBox elem kiválasztás technikáját.
1. Elhagytam az Afterupdate-et.
2. Létrehoztam egy cmdKivalaszt elnevezésű CommandButtont
3. A doubleclick-et megtartottam. Rejtélyes módon most elfogadja. Sőt csak azt. A Click-re csak rááll a kiválasztott elemre. Ami egyébként is a szándékom volt
4. A doubleclick, vagy a billentyűzetről beadott Enter közvetlenül ugrik a cmdKivalaszt_Click eseményre (Ezt a megoldást Te javasoltad néhány éve, egy másik programban, amikor szintén valami gondom volt a ListBox-al.
Azt, hogy pontosan mitől lett most elfogadható a doubleclick, azt nem tudom, mindenesetre megoldotta a problémát.
Köszönöm, hogy foglalkoztál vele.
Más: A TabStrip control-t nem ismertem, majd megnézem, hogy az én feladatomra alkalmazható-e.
Bocs, hogy nem sikerült teljesen érthetően leírnom a dolgot.
Kezdem azzal, hogy a CommandBox természetesen téves volt, valóban CommandButton a vezérlő, amire esetenként rátéved a vezérlés a második Click után.
A doubleclick eseményt eredetileg nem akartam használni, inkább csak annak az ellenőrzésére tettem be, hogy ha a felhasználó dupla kattintással választ ki egy elemet a ListBoxból, akkor erre ráugrik-e a vezérlés. Kiderült, hogy nem, így erre nem is lesz szükség.
/Egyébként nálam a kurzoros lépegetés nem váltja ki a Click eseményt, csak a listindex-et . Ezt ki is használom arra, hogy a lista alatt megjelenítsek egy egysoros magyarázatot arról, hogy az adott elem választásakor milyen feladatot fog elvégezni a program (itt listák összeállításáról van szó, ami lehet összesítő táblázat, részletes lista, ugyanezek kiegészítve még egy szempont szerinti értékeléssel). Ez az egész persze a problémám lényegét -a Click kezelését - nem érinti/
"Meg ha jól értem, olyan sok control-od van a userformon, hogy hol egyiket, hol másikat kell megjeleníteni, mert egyszerre nem fér el az összes." Nem azért, mert nem fér, hanem egy Formnak a kódja több különböző képernyőt tartalmaz. És ennél csak az adott képernyőhöz tartózó vezérlők kerülnek megjelenítésre.
Valahogy így működik a dolog: Van egy menü CommandButton-okból összerakva, amiben a felhasználó kiválasztja a feladatot (Adatok kitöltése, Adatok listázása, Eredmények értékelése, Kilépés a feladatból stb). Aztán amikor kiválaszt valamit, akkor új képernyő jön. Például az értékelés választásánál az ominózus ListBox az elkészítendő lista típusának kiválasztásával. És ha itt kiválasztotta a kívántat, akkor a program elvégzi a feladatot, majd visszatér a behívó menübe. És ekkor léphet működésbe a második - nem kívánt - Click.
/Megjegyzés: A képernyőkön a választható eszközöket (CommandButton és ListBox) centralizálva helyezem el, mert így elegáns, és függőlegesen is igyekszem arányosan elhelyezni őket, ezért fordulhat elő, hogy két különböző képernyőn azonos helyre kerül két egy-egy vezérlő)
Nem tudom érthetőbb-e, vagy csak rontottam a helyzeten. De csatolok két képet, hátha segít. A második képen látszik, hogy az utolsó két választás a képernyő azonos pontjára esik, mint a bal oldali képen az adatok listázásának választása. És erre is ugrik a felesleges második click. Az első két elem választásakor nem történik semmi.
A lényeg, hogy az nem zárható ki, hogy a felhasználó duplaklikkel akarjon kiválasztani egy listaelemet. Viszont ilyenkor kellene tudni érvényteleníteni a felesleges másodikat az After (vagy before) Update-ban. Ez jelentené a megoldást, amire nincs ötletem.
Pl. nem vágom, hogy mire használod a doubleclick eseményt, ha egyszer az AfterUpdate végzi a user input kiértékelését.
Az Afterupdate lejátszódik sima Click után is, meg a kurzoros lépegetésnél is. Sőt én úgy tapasztalom, hogy a kurzoros lépegetés is kiváltja a Click eseményt, majd BeforeUpdate-et, majd AfterUpdate-et is.
Másrészt, kattintani csak arra tudsz, ami felül van. Ha a listbox a CommandButton tetejébe van rakva, akkor elvileg nem tudsz a buttonra kattintani. (Ugye CommandButtont akartál mondani, nem CommandBox-ot? Mert a commandbox ismeretlen számomra.) A Listbox-ot tehát csak akkor kellene eltüntetni, amikor már nincs több kattintás. Ha a DoubleClick-et a Listbox eltüntetésére akarod használni, akkor a DblClick eseménykezelő végére kell rakni a Listbox.Visible = false dolgot.
Meg ha jól értem, olyan sok control-od van a userformon, hogy hol egyiket, hol másikat kell megjeleníteni, mert egyszerre nem fér el az összes. Ez esetben miért nem használsz inkább TabStrip control-t ?
De nem tudom. Nehéz így, látatlanban, félig sem értve...
Most kipróbáltam. Az általad írt tesztkörnyezetben hasonlóan működik nekem is (annyi kis különbséggel, hogy az aktív elemre (A) kattintva is click+DblClick fut le, de ez itt talán nem érdekes.
Az én programomban annyi az eltérés - talán ez okozza a gondot -, hogy a UserForm_Initialize előkészíti ugyan a Listbox-ot, de előbb egy commandBoxokból álló menüt mutat, és csak ennek egyik elemére kattintva ugrik a program arra az eseményre, ahol a Listboxot működésbe hozom: Visible=true és ListIndex = 0 beállítással, majd az End Sub után megjelenik a lista.
Cursor mozgatásra a listában lépkedni lehet, és a change esemény segítségével aktuális listaelemhez tartozó magyarázat jelenik meg a lista alatt elhelyezett Label.captionban.
Ha választott, akkor az AfterUpdate olvassa ki a listindex értékét, és küldi majd el a megfelelő feladat elvégzésére. Ez egyelőre még nincs kész, ezért kihagyom, és - mintha elvégezte volna a feladatot - küdlöm újra az elejére, a UserForm_Initialize-ra.
Itt jön bizonyos esetekben a gond. AZ ismétlődő Click csak akkor okoz gondot, ha a listbox menü képernyőpontja (ahol választottam) egybeesik az Initialize menü egyik olyan pontjával, ahol éppen egy menüpont helyezkedik el. Mert ekkor a második Click ezt a menüpontot indítja. Ha üres területre juk a második click, akkor nem csinál semmit.
Ez most kicsit bonyolultra sikerült, de remélem érthető. Ha nem, akkor megpróbálok képernyőfotókat készíteni róla.
Kösz, egyelőre annyit tudok, hogy mielőtt írtam, a Doubleclick esemény első sorába tett breakpoint nem állította meg a programot. Most el kell mennem, és este , de lehet, hogy csak holnap újra ellenőrzöm a jelenséget.
Kreáltam egy egyszerű tesztkörnyezetet, ezzel a háttér kóddal:
Private Sub ListBox1_Click() Debug.Print "click" End Sub
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Debug.Print "doubleclick" End Sub
Private Sub UserForm_Initialize() With ListBox1 .AddItem "A" .AddItem "B" .AddItem "C" End With End Sub
És azt tapasztaltam, hogy ha a listában az aktív elemre duplakattintok, akkor simán a DblClick esemény fut le.
Ha viszont nem az aktívra, hanem bármely másikra duplakattintok, akkor előbb egy Click, majd azt követően egy DblClick esemény is lefut, reprodukálhatóan, mindig ebben a sorrendben.
Biztos, hogy esetedben két független Click esemény fut le?
Van egy Listboxom egy Userformon. A rajta lévő elemek kiválasztásakor a DoubleClick-et érthetetlen okból nem veszi be, hanem két egymást követő kattintásnak veszi. Így az első click után végrehajtja a feladatot, majd annak végeztével egy másik menübe kerülve a második click-et végrehajtva elindít egy nem kívánt feladatot.
Hogy tudnám aktiválni a Private Sub lstListatip_DblClick(ByVal Cancel As MSForms.ReturnBoolean) eseményt, vagy hogyan tudnám érvényteleníteni a második Click-et? Utóbbit próbáltam DoEvents-el, Application.Wait beiktatásával, de egyik sem eliminálta a felesleges click-et
Az A1 cella alapján kell generálni a G:H oszlopba olyan intervallumokat, amelyekből az A1 cellában látható negatív intervallumok (D:F) kimaradnak.
Például a 6-8 sorban a 7-8 sor olyan negatív intervallum, amit a 6 sor tartalmaz. Így a D:F oszlopban ezek kihagyásával van meghatározva a tól-ig.
(Közben dolgozom rajta, egész jó játék...)
A megvalósítás formája mindegy, a végeredmény a lényeg. Tehát az intervallumok a negatívot kivonva fedjék le a teljes (a példán az A1) tartományt átfedések nélkül.
Köszönöm a segítséget de béna vagyok és még több info kellene
Feltételes formázáskor melyik szabálytípusnál és azon belül hova kell ezt beírni?
Van még egy nagyon laikus kérdésem is: az excel táblázatban van 12 oldal (minden oldal 1 hónap) szeretném ha az első oldalra beírom, hogy 2020.01.01 akkor az összes oldalon a megfelelő hónap szerint kitöltené a többi napot magától.
Ezt most egy egyszerű fapados megoldással csináltam meg, hogy minden nap hivatkozik az előtte lévőre és hozzáadok plusz 1et.
Most el is megy de idén szökő év van és ha másik évet írok be akkor van olyan hónap napja ami eltolódik a másik hónap elejére.
Dátumformátum beállítható a hét napjára is. Pl. "nnnn".
Ez jól használható a SZÖVEG() függvényben is. Ezzel lehet a feltételes formázást is megszabni, a hét bármely napjára. Pl. Szöveg(dátum, "nnnn") ="vasárnap"
Szeretnék egy havi lebontású jelenléti ívet amiben a szombati és a vasárnapi sorokat beszínezné. Elméletileg a feltételes formázás lenne a megoldás de nem akar összejönni.
Tud valaki segíteni?
Szerintem az lehet a gond, hogy a napokat dátumból generálja és nem szövegként hanem számsorként kezeli és ezért hiába adom meg feltételnek a szombatot és a vasárnapot nem értelmezi.
Lehet, hogy be kell csukni hozzá minden Office programot, vagy talán még a gépet is újra kell indítani. De ha még akkor sem működik, az tényleg fura, hiszen elvileg ezt erre találták ki.
Egy Excel cellára egyet kattintva egy hiperhivatkozás függvénnyel egy a gépemen lévő fájlt nyitok meg. pl. képet vagy videót. Meg tudom nyitni de nem egy lépésből, mert az Office egy ablakot dob fel a következő üzenettel: ********************************************************************************** "néhány fájl vírust tartalmazhat, vagy más módon veszélyeztetheti a számítógépet. Ellenőrizze, hogy a fájl megbízható forrásból származik-e" ********************************************************************************** Mivel a saját gépemen akarom megnyitni a fájlt nem tartok attól, hogy gond lenne ezért szeretném kiiktatni ezt az üzenetet. Próbálkoztam már a beállítások között de nem találom azt, ami ezt megoldaná. Van erre ötlete valakinek?
Igen, áthelyezés, vagy másolás, és természetesen másolatot kértem. Még véletlenül sem akartam elrontani az eredetit.
És mindkettő kiterjesztése xlsm, ráadásul ugyanaz a fájl van mindkét képen. Ezeket ugyanis itt is ott is tartom. Részben biztonsági másolatként, részben azért, hogy ha ez egyikhez nem férek hozzá, akkor a másikon ugyanazokkal a fájlokkal tudjak dolgozni.
Tehát ebből a szempontból sem volt eltérés köztük.
Próbáltam másik Excel munkalapra kérni a másolást, próbáltam új munkafüzetbe. Az eredmény minden esetben változatlan volt. Egyiken jó, másikon nem.
Még egy dolog jut eszembe, ahogy most írok. Holnap megnézem, hogy nem lehet-e az Excel beállításainál találni valami olyan különbséget, ami az eltérést okozhatja. Csak az a beállítás menü annyira kellemetlen. Nem lehet másolni, nyomtatni (legfeljebb képlopóval, de az nehézkes), tehát emlékeznem kell, hogy, mi volt a beállítás egyiken és másikon.
Kösz, nagy nehezen én is rátaláltam a disappers keresőszóra, a másodikat meg is találtam. A Mrexcel-t nem, de tovább fogom náluk is keresni, hátha találok egy használható választ a kérdésre.
De hogy két - lényegében azonos módon beállított - gépen másképp működjön, az igazán rejtélyes. Ha esetleg megtalálom valamikor az okot, azonnal megírom.
Sziasztok, megdöbbentő jelenséggel találkoztam, és fontos lenne kiderítenem az okát.
Van két gépem, mindkettő windows 7 alatt Excel 2010 fut.
Vannak évenként visszatérő azonos feladataim, amelyekben azonos szerkezetű adatsorokból azonos kinézetű diagramokat kell készítenem.
Tavaly jöttem rá, hogy nem kell a diagramokat mindig újból elkészíteni. Elég, ha a meglévő tavalyi munkalapot átmásolom az új fájlba, majd csak az új adatokat írom be a diagram forrását jelentő cellákba, és a diagram frissül.
Akkor ezt a másolást a laptopomon végeztem (éppen vidéken voltam), és természetesnek tartottam, hogy a munkalap másoláskor a rajta lévő diagramot is viszi magával.
Idén itthon vagyok, és az asztali gépemen másoltam a munkalapot, és meglepődtem, hogy a másoláskor csak az adatok kerülnek át, a diagramok nem.
Visszaültem a laptophoz, ott tökéletesen működött a másolás.
Elsőre azt hittem, hogy a sablonok okozzák a zavart, de kiderült, hogy éppen azon a gépen nem voltak sablonok, ahol jól működik a dolog. Akkor megpróbáltam a másik gépről is törölni a sablonokat, de - ahogy várható volt - továbbra sem működött a másolás.
Azért lenne fontos, mert ki tudja, hogy a közelgő verzióváltáskor mi lesz a helyzet. Jó lenne, ha úgy tudnám a gépeket beállítani, hogy működjön a másolás.
Végső soron persze meg fogom tudni kerülni a problémát (Komplett fájl másolása, átnevezése, majd csak az adatok frissítése), de azért nyugtalanít a dolog.
Próbáltam volna interneten rákeresni a jelenségre, de nem tudok igazán jó keresőszavakat találni a hibajelenséghez.
Nagyon hálás lennék, ha valaki rá tudna vezetni a hiba okára.
...basszus figyelmetlen vagyok azért válaszolok több részletben... Windows 10 az op rendszer.
De mivel nagyjából megoldódott a problémám a 2016-os Office-szal ezért nem szeretnék senkit tovább kínozni hacsak passzióból nem tud valami szuper-tutkó-praktikus-rövid megoldást, ami mindent visz. De addig is....most elvagyok azzal, amit eddig javasoltatok. Mindenkinek köszönet. Ha lesz még kérdésem "I'll be back".
Pimre visszajelzését követően kipróbáltam a programot egy Win XP-vel és Office 2003-mal felfegyverzett virtuális gépen, Compatibility Pack telepítés után.
Az eredeti .xlsm fájlt, amit xl2019-ben csináltam, nem tudta megnyitni.
Létrehoztam egy új munkafüzetet, bemásoltam a kódot, tettem bele képeket, elmentettem .xlsm formátumban. A kód elakadt a Set oWIA = CreateObject("WIA.ImageFile") sornál. Ez szerintem annak tudható be, hogy Win XP-ben a WIA másképp működik. De az általad jelzett soron simán átlépett: megcsinálta a zip kitömörítést, beolvasta az XML adatokat, stb.
Ha viszont a fájlt .xls formában mentem, és úgy futtatom a kódot, akkor nem csinálja meg az unzip műveletet, és ott jelez hibát, ahol neked is:
Ez a hibaüzenet nekem nem mond semmit. Max arra tudok gondolni, hogy többkötetes zip fájlt érzékel, ami egyrészt nem valószínű, másrészt biztos nem annál a kódsornál jelentkezne, amit írtál.
Attól tartok, ezt nehéz lesz távgyógyítani...
Milyen Excel verzióval küzdesz? Nem említettem, de ez a kód Excel 2007 alatt biztosan nem fog futni, tekintettel arra, az OpenXML formátumot (xlsx, xlsm és társaik) a 2007-es Office verzióban vezették be.
Nemtom, belefér-e a teljes kód... de mindenesetre ezt kellene átmásolni egy szűz kódmodulra, és futtatni a RestoreCommentPictureSize makrót. Megjegyzések:
- Az Excel munkafüzetet takaró fájl valójában egy zip archivum, amit ki lehet csomagolni, és akkor feltárul a belső xml szerkezet. A kommentek hátteréül szolgáló képek eredeti méretben lesznek kimentve. - A lenti kód másolatot készít az aktuális munkafüzetről, a másolatot kicsomagolja (unzip) egy mappába. E művelet során a munkafüzet 2x is mentésre kerül. Mentéssel a Visszavonás (Undo) opció elvész, tehát a mentés előtti műveleteket nem fogod tudni visszavonni a program futtatása után. - A program a kicsomagolt mappában a különböző xml és egyéb fájlok elemzésével felderíti a kommentek és a képek kapcsolatát, majd a kép eredeti dimenzióit felhasználva átméretezi a komment dobozát. - A munkafüzet mindegyik munkalapján elvégzi az átméretezéseket az érintett kommenteken. - Az xml fájlokban definiált kapcsolatokat nem gyári specifikációkból vettem, hanem magam derítettem fel a szövegfájlok elemzésével, így ebben elképzelhető hiba.
- Én csak 4-5 képes kommenttel teszteltem a programot, de akárhogy rendeztem át a cellákat és akárhogy ziláltam szét előzőleg a komment méreteket, ezekkel teljesen jól működött. - A futás során keletkezik egy zip fájl és egy mappa, amelyeket elvileg a program töröl is, de valamiért ez a törlés nem mindig következik be. Ezért a program indítása előtt mindig győződj meg róla, hogy mind a zip fájl, mind az unzip mappa törölve lett, mert különben a program hibára fog futni. (Bocsi, nem volt már energiám ilyen helyzeteket is kezelni.) - A progam megfelelő működéséhez nem szükséges, hogy a kommentek meg legyenek jelenítve. - Végül, de nem utolsósorban: nincs benne SendKeys :o)
És akkor most sűrű fohászkodás, hogy a fórummotor jól jelenítse meg....
Option Explicit
Type TXMLWorksheet SheetRID As String Name_of_Worksheet As String Name_of_SheetXML As String Name_of_SheetRelations As String Name_of_vmlDrawingVML As String Name_of_vmlDrawingRelations As String Path_to_SheetXML As String Path_to_SheetRelations As String Path_to_CommentsXML As String Path_to_vmlDrawingVML As String Path_to_vmlDrawingRelations As String End Type
Type TImageSize Width As Single Height As Single End Type
Private ZipFolder As String, XL_Folder As String Private Path_WorkbookXML As String, Path_WorkbookXML_Rels As String Private xmlWorksheets() As TXMLWorksheet '
Sub RestoreCommentPictureSize() Copy_UnZip_Workbook Collect_XML_WorksheetData IterateThroughComments On Error GoTo nodelete CreateObject("Scripting.FileSystemObject").DeleteFolder ZipFolder MsgBox "Kommentek átméretezése kész." Exit Sub
nodelete: MsgBox "Hiba történt a " & ZipFolder & " mappa törlése során. Manuálisan kellene törölni." Resume Next End Sub
Private Sub Copy_UnZip_Workbook() Dim myName As String, myShortName As String, myFullPath As String Dim WorkFileXLPath As String, WorkFileZipPath As String Dim oShell As Object
For i = 1 To ThisWorkbook.Worksheets.Count With xmlWorksheets(i) .Name_of_Worksheet = ThisWorkbook.Worksheets(i).Name 'Set .myWorksheet = ThisWorkbook.Worksheets(i)
'sheet relations file elérési útjának összerakása, a fájl megnyitása, belőle további XML elérések kiolvasása .Path_to_SheetRelations = .Path_to_SheetXML & "\_rels" .Name_of_SheetRelations = .Name_of_SheetXML & ".rels" 'Comment.xml elérése TextLine = Get_SpecificLine_From_TextFile(Filepath:=.Path_to_SheetRelations & "\" & .Name_of_SheetRelations, LineMarker:="relationships/comments") If TextLine <> "" Then pos = InStr(TextLine, "Target=") sTemp = Replace(Mid(TextLine, pos + 7), """", "") sTemp = Replace(sTemp, "/", "\") .Path_to_CommentsXML = .Path_to_SheetXML & "\" & sTemp End If 'vmlDrawing.vml elérése TextLine = Get_SpecificLine_From_TextFile(Filepath:=.Path_to_SheetRelations & "\" & .Name_of_SheetRelations, LineMarker:="relationships/vmlDrawing") If TextLine <> "" Then pos = InStr(TextLine, "Target=") sTemp = Replace(Mid(TextLine, pos + 7), """", "") sTemp = Replace(sTemp, "/", "\") pos = InStrRev(sTemp, "\") .Path_to_vmlDrawingVML = .Path_to_SheetXML & "\" & Left(sTemp, pos - 1) .Name_of_vmlDrawingVML = Mid(sTemp, pos + 1) .Path_to_vmlDrawingRelations = .Path_to_vmlDrawingVML & "\_rels" .Name_of_vmlDrawingRelations = .Name_of_vmlDrawingVML & ".rels" End If End With Next End Sub
Private Sub IterateThroughComments() Dim ws As Worksheet, wsXML As TXMLWorksheet, cmt As Comment, sh As Shape Dim iCol As Long, iRow As Long, PicRelsID As String, Path_to_Image As String Dim i As Long, sTemp As String, pos As Long, ImgSize As TImageSize
For Each ws In ThisWorkbook.Worksheets For i = 1 To UBound(xmlWorksheets) If ws.Name = xmlWorksheets(i).Name_of_Worksheet Then Exit For Next wsXML = xmlWorksheets(i) For Each cmt In ws.Comments iCol = cmt.Parent.Column - 1 iRow = cmt.Parent.Row - 1 Application.StatusBar = wsXML.Name_of_Worksheet & "(" & iRow & "," & iCol & ")" PicRelsID = Get_CommentPicID_From_vmlDrawing(vmlFilePath:=wsXML.Path_to_vmlDrawingVML & "\" & wsXML.Name_of_vmlDrawingVML, iColumn:=iCol, iRow:=iRow) If Not PicRelsID = "" Then sTemp = Get_SpecificLine_From_TextFile(Filepath:=wsXML.Path_to_vmlDrawingRelations & "\" & wsXML.Name_of_vmlDrawingRelations, LineMarker:="Relationship Id=""" & PicRelsID) pos = InStr(sTemp, "Target=") sTemp = Mid(sTemp, pos + 8) sTemp = Replace(sTemp, """", "") sTemp = Replace(sTemp, "/", "\") Path_to_Image = wsXML.Path_to_SheetXML & "\" & sTemp ImgSize = Get_ImageSize(Path_to_Image) With cmt.Shape .LockAspectRatio = msoFalse .Width = ImgSize.Width .Height = ImgSize.Height End With End If Next Next Application.StatusBar = False End Sub
'XML szövegfájlban megkeres egy bizonyos sort (az elsőt, ami tartalmazza a LineMarker stringet), és azt adja vissza Private Function Get_SpecificLine_From_TextFile(Filepath As String, LineMarker As String) As String Dim iFileNum As Long, TextFileContent As String, TextLines() As String, i As Long, Result As String
If Dir(Filepath) = "" Then Exit Function iFileNum = FreeFile Open Filepath For Input As iFileNum TextFileContent = Input(LOF(iFileNum), iFileNum) Close iFileNum
TextFileContent = Replace(TextFileContent, "><", ">[|]<") TextLines = Split(TextFileContent, "[|]") For i = 0 To UBound(TextLines) If InStr(TextLines(i), LineMarker) > 0 Then Result = TextLines(i) Exit For End If Next Result = Replace(Result, "<", "") Result = Replace(Result, "/>", "") Get_SpecificLine_From_TextFile = Result End Function
'Comment hátteréül szolgáló kép elérési útvonalát határozza meg az unzippelt Excel munkafüzet mapparendszerében Private Function Get_CommentPicID_From_vmlDrawing(vmlFilePath As String, iColumn As Long, iRow As Long) Dim iFileNum As Long, TextFileContent As String, TextLines() As String Dim i As Long, Result As String, sTemp As String, pos As String
iFileNum = FreeFile Open vmlFilePath For Input As iFileNum TextFileContent = Input(LOF(iFileNum), iFileNum) Close iFileNum
TextFileContent = Replace(TextFileContent, "<v:shape", "[|]<v:shape") TextLines = Split(TextFileContent, "[|]") For i = 0 To UBound(TextLines) If (InStr(TextLines(i), "<x:Row>" & iRow & "</x:Row>") > 0) And (InStr(TextLines(i), "<x:Column>" & iColumn & "</x:Column>") > 0) Then Exit For End If Next If i > UBound(TextLines) Then Exit Function
sTemp = TextLines(i) pos = InStr(sTemp, "<v:fill o:relid=") If pos = 0 Then Exit Function
sTemp = Mid(sTemp, pos) Result = Split(sTemp, """")(1)
Get_CommentPicID_From_vmlDrawing = Result End Function
'a megadott útvonalon található kép méreteit adja vissza pixelben Private Function Get_ImageSize(ImagePath As String) As TImageSize Dim oWIA As Object, Result As TImageSize
Set oWIA = CreateObject("WIA.ImageFile") oWIA.LoadFile ImagePath Result.Height = oWIA.Height Result.Width = oWIA.Width Get_ImageSize = Result End Function
Azt látom, hogy valamiért nem szereti így a megjegyzések kigyűjtését. Ezért előbb a cellákat kell megnézni, van-e megjegyzése, ha igen akkor lehet ráengedni a méretezési részt:
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long, cl As Range For i = 1 To 2 For Each cl In Selection.Cells '<<<< ez a sor lett csak kicserélve! If Not cl.Comment Is Nothing Then Set cm = cl.Comment cm.Visible = True Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" cm.Visible = False End If Next Next End Sub
Ennyi, szerintem így már mennie kell. Kipróbáltam.
Nem azért, hanem azért, mert a tantárgyaknak nincs egységesített országos nevezéktana. Persze, lehet, hogy nem is kellene, de ez nehézzé teszi az azonos tartalmú, de eltérő elnevezésű tantárgyak értékelését. Ráadásul az középiskolák ezt készen kapják az Oktatási Hivataltól. Azok meg az általános iskoláktól gyűjtik be, szóval az egységesítés szinte megoldhatatlan. Hacsak a Hivatal egyszer ki nem dolgoz valami kódrendszert, amivel egységes formára hozza az azonos tartalmú tárgyakat. Onnantól már megoldhatnák az általad javasolt find/replace műveletet.
Csak együttérezni lehet azokkal a tanárokkal, akiknek felvételiztetéskor ezekből az alapadatokból kell összesíteniük a tanulók hozott érdemjegyeit.
Nem értem miért pedig ez még nekem is logikusnak és helyesnek tűnik.
Látsz valami hibát? Mit ronthattam el?
Sub Megjegyzem() Dim sh As Shape, cm As Comment, i As Long For i = 1 To 2 For Each cm In Selection.Comments <<<< ez a sor lett csak kicserélve! cm.Visible = True Set sh = cm.Shape sh.Select DoEvents Application.SendKeys "^1" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" Application.SendKeys "{TAB}" Application.SendKeys "{ENTER}" cm.Visible = False Next Next End Sub
Úgy sejtem, azért lett ez ennyire összekuszálva, mert a szövegből -> oszlopok bontásban a szóköz lett határolónak kiválasztva.
Ha így van, akkor szerintem (hasonló esetben legközelebb) először az eredeti szöveget kell megtisztítani, a tantárgyak nevét egyszerű find/replace művelettel egységes formába hozni.
Nem ilyen egyszerű. Nekünk a neve mindegy lett volna, csak a helye nem, és ez okozta a gondot. A súlyozás nem jött szóba, mert ugyanazt fedték a nevek, így szerencsére csak az egyik név alatt jöttek adatok.
Egy diáknak a történelem jegyét az egyik néven adják meg, amihez a hozott osztályzatát mondjuk az AU,AV oszlopokban találom, a másikét a az eltérő név miatt a BB,BC oszlopokban, a harmadikét a CC,CD oszlopokban. Ezért aztán ilyen szörnyszüleményeket kellett létrehozni:
=(AM4+AN4+AQ4+AR4)/2+BC4+BD4+BK4+BL4+AY4+AZ4+AU4+AV4+CU4+CV4, ahol a zárójeles részt - más okból - valóban átlagolni kellett, viszont a BC-BD az egyik neve a tantárgynak, a BK-BL a másik, de ugyanezigaz az AY-AZ és AU-AV párosra. Még szerencse, hogy egy tanulónál csak az egyik párban volt adat, így nyugodtan lehetett összegezni őket.
És ráadásul több táblázatban kellett ezt megcsinálni, és azokban külön-külön összehozni a fenti képletet, mert más iskolákból, más elnevezésű tantárgyakkal más oszlopokban voltak az osztályzatok.
Érdekes, amit írsz, valóban néha úgy kell kezdeni, hogy egyenszilárdságúra hozza az ember. :(
Amit a törivel kapcsolatban írsz: van jelentősége a tárgy nevének? Úgy értem, ha 5 tárgyat kell átlagolni, ott az az öt és kész. Mert ha a három töri tárgynak eltérő a neve, akkor - véleményem szerint - tartalmában is el kell térnie, tehát az átlagolásban csak súlyozás után használhatóak fel.
Sziasztok.Adott egy lista 1-100 ig,amelyikbe be szeretnék írni egyszeruen számokat,ugy ,hogy en csak annyit kelljen irjak egyik négyzetbe ,hogy 3,a másikba azt hogy 21 ,és ezt automatikusan megjeleniti a listában.Ezt kellene tudja csinálni folytatolagosan.Például
5 db 21
2 db 25
3 db 30
4 db 24
es nekem a listaban igy jelenjen meg,ennyi gepeles utan
Az a baj, hogy valószínűleg nem ők jelölik így az osztályzatokat. Volt szerencsém segíteni ismerősömnek egy gimnáziumi felvételi értékelésében. Az oktatási hivataltól kapnak egy több száz oszlopos táblázatot, amely többek között a gyerekek általános iskolából hozott érdemjegyeit tartalmazza. És ott szerepelnek ilyen elképesztően szerencsétlen megoldások is. Szerencsére nem volt túl sok, így kézzel át tudtuk javítgatni őket. Lehetett volna a bal() függvényt használni, de az még nehézkesebbé tette volna a képlet létrehozását, mivel soronként más-más oszlopokból kellett kinyerni az osztályzatokat. Ennek oka a következő:
Borzalmasan nehezen kezelhető a táblázat, mert attól függően, hogy a gyerek melyik iskolából jött, más és más ugyanannak a tantárgynak a neve. Például a történelem az egyik iskolában történelem és állampolgári ismeretek, a másikban történelem, társadalmi és állampolgári ismeretek, a harmadikban történelem néven szerepelt, ezért az egyes tanulók osztályzatait vagy egyik, vagy a másik, vagy a harmadik helyről kell összeszedni. És persze öt tantárgy adatait kellett a fentiek figyelembevételével összegezni és átlagolni.
Elég komoly függvényeket kellett összehoznom, sőt makrót is be kellett vetni ahhoz, hogy a szükséges képletet létrehozzam, ahhoz, hogy a közel ezer felvételiző adatait összehasonlítható formában megkapjuk.
Segítséget szeretnék kérni. Valamilyen szinten használom az Excelt, de amire most kellene ahhoz nincs ötletem. Átlagot szeretnék számoltatni, de olyan módon, hogy nem csak számok vannak a cellákban, hanem szám betűvel együtt és én csak azt szeretném, hogy csak a számot vegye figyelembe. Tantárgyi átlagokhoz kellene a táblázat és abba 5D-vel jelöljük a dicséretes 5-öst. Alapból ezeket kiveszi az átlagból a függvény. Van valamilyen lehetőség arra, hogy akár összetett függvénnyel figyelembe vegye?
Mindenkinek köszönet a fáradozásáért. Kipróbáltam 2016-os Excelen és ott tényleg működik szóval lehet, hogy áttérek erre a 2003-as helyett, mert nem szeretnék tovább fárasztani senkit a feladattal. Esetleg kérhetnék még annyit, hogy milyen sort és hová kellene beilleszteni ahhoz, hogyha pl. csak az "A" oszlopban szeretném lefuttatni vagy csak a kijelölt cellákban?
Ezek a kimutatások .xls fájlokban vannak. Eddig hibátlanul működtek. Lehet, hogy most ez az egy dolog útban lett a Mikrofostnak. Áttettem .xlsm-be, és működik. Csakhogy ezzel két bajom is van. Egyrészt ez a rendszer 14 géppel van megosztva, közöttük mindenféle konfiguráció. A másik meg az, hogy rengeteg hivatkozást kell átírni. Az .xls egy jól bevált közös minimum volt.
Sajnos nem segít. Nekem is pontosan így van, és ahogy mondtam, régebben szerkesztettem utoljára a fájlt, mint ahogy ez a jelenség fellépett. Valami Win, vagy Office frissítésre gyanakszom.
Nézd meg, hogy más fájloknál jelentkezik-e ilyen probléma. (Ha ilyen jellegű fájlod, akkor csinálj hasonlót, nézd meg működik-e az automatikus frissítés.)
Hát igen. De milyen beállításokat nézzek? A fájlokat én csináltam, és DropBoxon keresztül küldtem nekik is. Pár éve használjuk. Most nálam nem megy. Milyen beállítás ment el, és hol keressem?
A kézi frissítés működik, de megnyitáskor frissülnie kellene! Van olyan kollégám, akinél működik. Nem kaphattam (be) valami frissítést? Amíg nem frissítem, addig a részleteket kibontó és összecsukó makrók se mennek.
Run-time error'1004':
Range osztály ShowDetail tulajdonsága nem állítható be.