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.
Nem akarom elvenni pimre elől sem a lehetőséget, de van a makrónál egyszerűbb dolog is, ha "az egyes tulajdonság között szóközgondolatjelszóköz van:" ez a rész valóban megállja a helyét.
Viszont a példa fájlban a 4. sorban ki van hagyva egy szóköz a gondolatjel után. Ha ez most emberi hiba miatt került bele így a példa fájlba és a program szabályosan generálja ezt a részét, akkor nincs baj, mert akkor az alábbi képlet megadja az utolsó csoportot:
"...ha kettőnél több al-tulajdonság van felsorolva, akkor az első al-tulajdonságból kell a két nagybetűs kód és a az első al-tulajdonság számkódja, illetve mindig az utolsó al-tulajdonság dupla nagybetűs kódja és számkódja."
Értem, de a programnak akkor is végig kell mennie az egészen, hogy kiderüljön, melyik az utolsó.
Majd hétvégén átgondolom az egészet, és jelentkezem.
Meg nekem, ha kettőnél több al-tulajdonság van felsorolva, akkor az első al-tulajdonságból kell a két nagybetűs kód és a az első al-tulajdonság számkódja, illetve mindig az utolsó al-tulajdonság dupla nagybetűs kódja és számkódja.
A köztes tulajdonságok adataira nincs szükségem. Az megoldható?
Szia, még nem tudom küldeni, mert jött egy újdonság. A mintáidból azt hittem, hogy nem lesznek benne ékezetes magyar karakterek. Viszont az é betűk magzavarták a 7. 8. stb. sorokban lévő adatokat. Így most egy képet küldök a futtatás eredményéről, aztán holnap utánanézek, mit tudok tenni.
Szia, kezdem azzal, hogy borzasztóan nehéz ennyire következetlen adatbevitellel kezdeni valamit.
Én mindenesetre megpróbálkoztam az általad írt minta alapján úgy szétszedni az adataidat, hogy lehessen kezdeni valamit.
Nem vacakoltam azzal, hogy az eredményt összefűzzem, és + jeleket tegyek az egyes részek közé. Csak annyit tettem, hogy a 10. (J) oszloptól kezdődően külön oszlopokban tegyem az egyes adatrészeket.
Feltételeztem továbbá, hogy van fejléc, ezért a 2. sortól indítottam a keresést. És mivel kevés példa volt, csak 3 mintával foglalkoztam:
If Asc(UCase(Left(forrasstring, 1))) > 64 And Asc(UCase(Left(forrasstring, 1))) < 91 Then
ws.Cells(sor, celoszlop) = Left(forrasstring, 2) ' Ha az első karakter betű, akkor úgy veszem, hogy a második is az. Enélkül túl bonyolult lenne
forrasstring = Mid(forrasstring, 3)
End If
celoszlop = celoszlop + 1 ' Ha betű volt, akkor jó, egyébként a céloszlop üresen marad, és jön a következő
If Not karkeres(forrasstring) Then Exit Do
If Asc(Left(forrasstring, 1)) > 47 And Asc(Left(forrasstring, 1)) < 58 Then ' Ha szám
adatstring = Left(forrasstring, 1)
i = 2
While Asc(Mid(forrasstring, i, 1)) > 47 And Asc(Mid(forrasstring, i, 2)) < 58 ' Amíg folyamatosan számok jönnek
adatstring = adatstring & Mid(forrasstring, i, 1)
i = i + 1
If i > Len(forrasstring) Then forrasstring = forrasstring & " " ' Hogy ne akadjon ki
Wend
ws.Cells(sor, celoszlop) = adatstring
forrasstring = Mid(forrasstring, i)
End If
celoszlop = celoszlop + 1
If Not karkeres(forrasstring) Then Exit Do
If Asc(UCase(Left(forrasstring, 1))) > 64 And Asc(UCase(Left(forrasstring, 1))) < 91 Then ' Ha karakter
adatstring = Left(forrasstring, 1)
i = 2
While Asc(UCase(Mid(forrasstring, i, 1))) > 64 And Asc(UCase(Mid(forrasstring, i, 1))) < 91 ' Amíg folyamatosan betűk jönnek
adatstring = adatstring & Mid(forrasstring, i, 1)
i = i + 1
If i > Len(forrasstring) Then forrasstring = forrasstring & " " ' Hogy ne akadjon ki
Wend
ws.Cells(sor, celoszlop) = adatstring
forrasstring = Mid(forrasstring, i)
End If
celoszlop = celoszlop + 1
Loop Until Len(forrasstring) = 0
' Wend ' azután az egész kezdődik előlről, amíg van újabb tétel a sorban
Next sor
End Sub
Function karkeres(forrasstring) As Boolean
karkeres = True
While Not (Asc(UCase(Left(forrasstring, 1))) > 64 And Asc(UCase(Left(forrasstring, 1))) < 91 Or Asc(Left(forrasstring, 1)) > 47 And Asc(Left(forrasstring, 1)) < 58)
forrasstring = Mid(forrasstring, 2) ' Ha nem karakter és nem szám, akkor töröljük
Ez pedig, ha nem Excelben van eltárolva a kép, hanem mappából kell beilleszteni:
If Len(Dir(mappa + CStr(Cells(i, kepNevekOszlopa)) + ".jpg")) = 0 Then
'Ide kell jönnie egy hiba kezelésnek, hogy mi legyen akkor, ha nem létezik a kép
Else On Error Resume Next Set kep = ActiveSheet.Shapes(CStr(Cells(i, kepNevekOszlopa))).Delete On Error GoTo 0 ActiveSheet.Shapes.AddPicture _ (Filename:=mappa + CStr(Cells(i, kepNevekOszlopa)) + ".jpg", _ linktofile:=msoFalse, savewithdocument:=msoCTrue, _ Left:=x + x1, Top:=y + y1, Width:=meret, Height:=meret).Name = Cells(i, kepNevekOszlopa) End If
"mappa": az a változó, amiben a mappa elérési útvonalát tárolom, sima string
"i": long típusú változó, ebben az esetben a sornak a sorszámát jelöli.
"kepNevekOszlopa": szintén string. Ebben tárolom, hogy melyik oszlopban vannak a képek nevei. (Kiterjesztés nélkül, mert a ".jpg" kiterjesztés később kerül hozzáadásra)
"x": horizontális irányú eltolás az adott oszlopig
"x1": a kép méretéből adódó eltolás, hogy az oszlop közepére kerüljön a kép
"y": vertikális irányú eltolás az adott sorig
"y1": a kép méretéből adódó eltolás, hogy a sor közepére kerüljön a kép
Azaz az x, x1, y és y1 változóknak köszönhetően pontosan a cella közepére fog kerülni a beillesztendő képem.
"meret": a cella magasságából és szélességéből kalkulált érték. Mivel nálam 1:1 arányú képeket kell beilleszteni, így csak ellenőrzöm, hogy melyik méret a kisebb és az lesz egyenlő a mérettel.
Nálam az "x" értékét cikluson kívül határozom meg, mert fentről lefelé haladva illesztem be a képeket.
"x1", "y1" és a "meret" változó cikluson belül kalkulálódik minden egyes sornál. Bár törekszem az egységes táblázat formátumra, így gyakorlatilag mindig ugyan azt az értéket veszi fel egy-egy táblázat esetén.
"y" értékét pedig minden egyes ciklus végén növelem az adott sor magasságának megfelelően. "i" értékét is növelem a ciklus végén, hogy a következő sorra ugorjunk a kép beillesztéssel
Ebben a makró részletben egy másik munkalapról másolok át képet:
Dim MyPicture As Object Dim MyTop As Double Dim BottomRightCell As Range Dim aktivcella As String Dim i As Long Dim kepnev As String Dim kep As Shape aktivcella = ActiveCell.Address
...
Variables.Shapes(kepnev).Copy
Range("L1:M2").Select ActiveSheet.Paste Variables.Range("C1") = Variables.Range("B1") Range(aktivcella).Activate With ActiveWindow.VisibleRange r = .Rows.Count Set BottomRightCell = .Cells(r, 12) End With Set MyPicture = ActiveSheet.Pictures(1) MyTop = BottomRightCell.Top - MyPicture.Height - 5 With MyPicture .Top = MyTop .Left = 760 End With
"Variables": munkalap kódneve, amin a képeket tárolom
"kepnev": nagyon kreatívan azon változó, amiben a képnek a nevét tárolom. Esetemben generálom egy százalékos kifejezésből.
Makróval meg lehet oldani, de azt vagy manuálisan kell lefuttatni vagy lehet automatizálni is a futtatását. Viszont ha sok a kép és automatizálva van a futtatás, akkor nagyon belassulhat az Excel.
A munkahelyi programba egy mondjuk termékhez, többféle adatsort, tulajdonságot, al-tulajdonságot, adatot, paramétert stb rögzítünk be.
Amikor kérünk egy lekérdezést, azt excelbe átimportálva hozza le.
Az egyik jellemző tulajdonsághoz több al-tulajodnág is tartozik, amiket a lekérdezésnél nem külön oszlopba hoz le, hanem egy cellába hozza őket, "-" jellel elválasztva.
Alapvetően egy tulajdonság így néz ki: GK-8201 Bgkfdez = azaz két nagybetű + számsor + betűsor (első nagybetűvel kezdve)
ha egy tulajdonságához, több al-tulajdonság is tartozik, akkor azokat, ahogyan fent írtam egy cellába hozza, köztük gondolatjellel elválasztva: pl: 2 tulajdonság lett berögzítve: GK-8201 Bgkfdez - BZ-88888 Jobtagj
A feladatom az lenne hogy ezekből az adatokból nyerjem ki az első nagybetűs kódot, aztán az első számsort, aztán az utolsó nagybetűs kódot és az utolsó számsort. Azaz: GK-8201 Bgkfdez - BZ-88888 Jobtagj = > GK + 8201 + BZ + 88888 vagy: GK-8201 Bgkfdez - BZ-88888 Jobtagj -UU-87896 Hjulohdt => GK + 8201 + UU + 87896
A helyzetet tovább bonyolítja, hogy ezen tulajdonságok berögzítésénél pontatlanságok vannak: van olyan, hogy lemarad a dupla nagybetűs kód:
van olyan, hogy a nagybatűs kód és a számsor között nincs "-" jel: pl: GK8201 Bgkfdez - BZ-88888 Jobtagj -UU87896 Hjulohdt
van olyan, hogy a nagybetűs betűkód és az azt követő számsor között szóköz van a "-" jel helyett:
pl: GK-8201 Bgkfdez - BZ 88888
A számsorok hossza változó 4-től kb 10 karakterig lehet bármilyen hossz A számsor lehet, h nullával kezdődik, itt fontos, hogy maradjon meg a nulla is
A dupla negybetűs kódok kb 30 féle verzióban fordulnak elő, azokat segédtáblán fel tudom sorolni, ha kell 2 tulajdonság a minimum (mint: GK-8201 Bgkfdez - BZ-88888 Jobtagj ), de ez elmehet akár egészen 8-ig, 10-ig is akár, amit ugye min egy cellába tesz össze a lekérdezés, az egyes tulajdonság között szóközgondolatjelszóköz van: pl: GK8201 Bgkfdez - BZ-88888 Jobtagj - UU87896 - BZ-88888 Jobtagj - UU87896 - GK-8201 Bgkfdez - BZ 88888
az eredményül kapott 4 adatsor (első dupla nagybetűs kód + első számsor + utolsó dupla nagybetűs kód + utolsó számsor) külön cellában szerepeljen Ha valahol kimarad a dupla nagybetűs kód ott, mondjuk vagy üres maradjon az eredmény cella, vagy mondjuk tegye be, hogy "hiányzik"
Amúgy a formátumnál alapértelmezetten a pozitív, negatív és a nulla esetén megjelenő formátumokat is megadjuk.
Viszont ha eltérő formátumot szeretnénk mondjuk a negatív számok esetén, akkor azt az első pontosvessző után kell megadni.
Ha pedig nulla érték esetén szeretnénk más formátumot, akkor azt a második pontosvessző után kell megadni.
Nálad az volt a trükk, hogy ha negatív lett az eredmény, akkor a pontosvessző után nem adtunk meg formátumot. Így azt üresnek veszi és nem jelenít meg semmit sem negatív eredmény esetén.
Ha azt szeretnéd, hogy az órákat is mindig két számjegyesen jelenítse meg, akkor "ó" helyett "óó"-t írj.
E2 és F2 formátumnál fontos, hogy az "ó:pp" után még kerüljön egy pontos vessző is.
Szerintem te rosszul számoltad a mínusz és a plusz időket. Számomra az a logikus, hogy ha a 2. sort vesszük alapul, akkor az emberünk bent volt 7 óra 30 percet és közben kivett egy fél órás ebédszünetet. Azaz 7 órát dolgozott a valós 8 helyett, így a mínusz oszlopba "1:00" kifejezésnek kellene kerülnie.
Mellékelek egy táblázatot ami Zöldel jelölt cellákat én töltöm ki ,és a kiszámolja a C oszlopba a eltöltött időt ,ez nem bonyi. Aztán a D oszlopba ha „x”-elem akkor a 8 órából lesz 8 óra 30 perc (ledolgozzuk az ebédet),a különbözetet két oszlopra osztottam (de lehet meg lehet csinálni egy oszlopba is) ami kiírja hogy menny a plusz óra vagy mínusz óra . Itt csak egy adatnak kéne megjelennie vagy a mínusz vagy a plusz „G” oszlopba viszont percet szeretnék megyjeleniteni ,de úgy ha minuszos akkor mínusz elöjellel írja ki . sokmindent probáltam már Mesterséges inteligenciával ,de értetlen és nem is müködtek pontosan ,de lehet én voltam béna ,gondolom fontos a cella formátum is Ebben kérnék segítséget Vagyis csak a A B és a oszloba irok adatot ,a többi függvény Köszönöm
Ez gyakorlatilag A2=1;2;3;4;5 értékre működik. Jobbra és lefelé is húzható.
Eddig egyszerű volt a dolog, mert csak számokat kellett összeadni :)
Ezután jött a nem teljesen tiszta rész.
Az oké, hogy B4-be (nálam, hogy inkább elkülönüljön B5-be) kerül az aktuális készlet. És ebből szépen kivonogatom a B1-ben lévő cella értékét egészen addig, amíg nullát nem kapok. Csak azt nem értem, hogy ennek mégis mi köze van a B2:H3 tartományban lévő számokhoz. Mert én úgy értelmeztem, hogy B1-ben van egy féle termék heti rendelése, C1-ben pedig egy másik termék heti fogyása, stb. Így nem értem, hogy mégis mit számolunk B2-ben, mármint mi köze van az egyik terméknek a másikhoz.
Nem túl elegáns, de makró nélkül csak erre futja. Amikor 10-et ír ki eredménynek, akkor bármilyen 9-nél nagyobb szám lehetne ott, de tovább már nincs vizsgálva.
Azt szeretném kérdezni, hogy képlettel meg lehet-e oldani, hogy a barack színű cellákban a következő eredmény jelenjen meg a kép alatt részletezett logika szerint
Az első sor egy adott számsor.
A2-ben egy megadott szám szerepel - esetünkben 2 , és azt szeretném, hogy B2-ben adja össze B1-et és C1-et (2 cellát), C2-ben C1-et és D1-et, stb.
A harmadik sorban B3-ban már 3 számot szeretnék összeadni, B1-et, C1-et és D1-et.
A felső sor egy cikkre vonatkozó vevő megrendelési/előrejelzési sor lenne, és alapvetően azt szeretném megoldani, hogy a táblázatom megjelenítse, hogy
- ha mondjuk 2 vagy 3 heti biztonsági készletet szeretnék tartani, az darabban mit jelentene, úgy, hogy ugye a heti igény nem állandó, ill. cikkenként eltérhet az elvárt biztonsági készletszint, amit közben lehet növelni vagy csökkenteni is.
Azt is szerezném tudni, hogy ha mondjuk nekem B4-ben lenne mondjuk egy 16000-es készletem, ki tudnám-e számoltatni képlettel, makró nélkül, hogy ez meddig fedezné az igényt/hány heti igényt fedezne - magyarul ha ebből elkezdeném kivonni az első sor értékeit, hányadik cellánál menne át negatívba.
Szerintem képlettel nem lehet megoldani, de ha mégis, még nem jöttem rá hogyan.