- 6 év biztonsági támogatást ígér a Motorola
- Xiaomi 14 - párátlanul jó lehetne
- Apple iPhone 16 Pro - rutinvizsga
- iPhone topik
- Mi nincs, grafén akku van: itt a Xiaomi 11T és 11T Pro
- Garmin Forerunner 970 - fogd a pénzt, és fuss!
- Huawei Watch Fit 3 - zöldalma
- Xiaomi 14T Pro - teljes a család?
- Samsung Galaxy A54 - türelemjáték
- Honor Magic6 Pro - kör közepén számok
-
Mobilarena
A Microsoft Excel topic célja segítséget kérni és nyújtani Excellel kapcsolatos problémákra.
Kérdés felvetése előtt olvasd el, ha még nem tetted.
Új hozzászólás Aktív témák
-
ulrik19
tag
Valahogy nem egészen így kellene kinéznie...
A táblázat "belsejébe" (magjába, ahol összesíteni szeretnél) csak olyan mezőket tegyél be, amik összegezhetők. (mennyiség és érték)
Majd úgy kell formázni, hogy vízszintesen tegye egymás mellé őket, ne függőlegesen egymás alá...
Amit a képen látok, az valami részösszegzésesnek tűnik. Ezzel is megoldható mondjuk, ha az azonos termékbejegyzések mindig egymás után jönnek (pl. ABC-rendezve az oszlop), viszont nincs beállítva minden összegzendő mező. (Adatok/Részösszegek... menü)
-
ulrik19
tag
Csak azért, hogy mások számára is hasznos legyen a téma
Csináltam egy bővített vlookup() függvényt...
Használata pl:
=multivlookup($E$1:$N$100;3;0;1;A1;4;B1/2;10;"Béla")
ahol:
$E$1:$N$100 a keresés helye (mint vlookup)
3, azaz a tábla 3. oszlopában lévő adatot adja vissza
0, azaz ha nem talál semmit, 0-t adjon vissza. (lehet "" is akkor üresen marad, de bármi más szintén mehet ide)
ez a három kötelező paraméter
ez után lehet megadni a feltételeket az alábbi módon (a fenti példát követve)
párosával kell nézni a paramétereket:
1;A1 azaz a tábla 1. oszlopában A1-gyel egyenlő érték legyen (természetesen nem csak hivatkozás lehet itt)
4;B1/2 azaz a tábla 4. oszlopában a B1 cella értékének felét keresse
10;"Béla" azaz a tábla 10. oszlopában a "Béla" szöveg legyen
lehet 1, de akár több feltételt is belerakni, rugalmasan kezeli
Ha több sor is megfelelne a feltételnek, akkor az első találatot adja vissza
(a paraméterek között ÉS kapcsolat van, tehát mindnek meg kell felelni)Public Function multivlookup(HolKeressen As Range, MelyikOszlopAdatatAdjaVissza As Byte, HaNincsTalalat As Variant, ParamArray OszlopInformaciok() As Variant) As Variant
'Ha nem páros számú az OszlopInformaciok argumentum (az UBound elemszám-1 értéket ad vissza ilyenkor)
If (UBound(OszlopInformaciok) + 1) Mod 2 = 1 Then
'adjon vissza hibát
multivlookup = CVErr(1)
Exit Function
End If
Dim i As Integer, j As Integer, ok As Boolean
For i = 1 To HolKeressen.Rows.Count
ok = True
For j = 0 To UBound(OszlopInformaciok) Step 2
'ha nagyobb oszlopszám a hivatkozás, mint ahány oszlop egyáltalán van...
If HolKeressen.Columns.Count < OszlopInformaciok(j) Then
'adjon vissza hibát
multivlookup = CVErr(2)
Exit Function
End If
'ha nem felel meg a feltételnek, akkor ok = False (ne is vizsgálja ezt az adatsort tovább...)
If HolKeressen.Cells(i, OszlopInformaciok(j)) <> OszlopInformaciok(j + 1) Then
ok = False
Exit For
End If
Next j
'ha van találat, akkor ok = True (ne is menjen tovább, mert az első találot adatom vissza)
If ok Then
multivlookup = HolKeressen.Cells(i, MelyikOszlopAdatatAdjaVissza)
Exit Function
End If
Next i
'ha volt találat, akkor már kiléptünk a függvényből... ha nincs, akkor:
multivlookup = HaNincsTalalat
End Function -
ulrik19
tag
a minta kimenet H4-es cellájában a 4 mit jelent? Mármint hogyan jött ki a táblából?
Ha pl. ugyanabban az idősávban több azonos pass van (station is azonos), akkor mi kerül a célcellába? Az összes megfelelő darabszáma, vagy egy itt nem látható oszlop (talán az említett G) értékösszege? Ha tudsz küldeni egy minta file-t, szerintem nem túl bonyolult megcsinálni.
Egy olyan spec függvényt kell írni rá, ami egyszerre több cella értékét is vizsgálja többféle bevitt paraméter szerint.
-
ulrik19
tag
válasz
ulrik19 #5833 üzenetére
hmmm, egy picit módosítanom kellett:
Public Sub ktgelosztas()
Dim osszeg As Double, i, strAr, strAr2
osszeg = Int(Val(InputBox("Felosztandó összeg a kijelölt cellák között:")))
strAr = Split(Selection.Value, ";")
For i = 0 To UBound(strAr)
strAr2 = Split(strAr(i), "=")
Range(Trim(strAr2(0))).Value = Val(Range(Trim(strAr2(0))).Value) + Int(osszeg * Val(strAr2(1)) / 100)
Next i
End SubHa nem egész százalékra van szükséged, akkor tizedespontot kell használni. Pl. harmadoláshoz: 33.3333
-
ulrik19
tag
megoldható ez is.
Ez némileg másképp működik. Meg kell adni egy cellában, hogy melyik cellákba kell szétosztani, és milyen arányban. Gondolom, ez előre rögzíthető, vagyis általában ugyanazt a dolgot ugyanabban az arányban ugyanazokra a ktghelyekre osztasz szét.
Pl. legyen egy cella tartalma ez: N12=20;N16=30;N21=10;N26=40
Itt százalékban van megadva, hogy melyik cellára mekkora rész menjen. Nem vizsgálja a program, hogy az összeg 100%-e! Persze azt is bele lehet szőni... Fontos az egyenlőségjel, és az is, hogy ;-vel kell elválasztani az elemeket.Állj rá erre az egy cellára. Majd indítsd a makrót:
Public Sub ktgelosztas2()
Dim osszeg As Integer, i, strAr, strAr2
osszeg = Int(Val(InputBox("Felosztandó összeg:")))
strAr = Split(Selection.Value, ";")
For i = 0 To UBound(strAr)
strAr2 = Split(strAr(i), "=")
Range(Trim(strAr2(0))).Value = Val(Range(Trim(strAr2(0))).Value) + osszeg * Val(strAr2(1)) / 100
Next i
End SubEzzel a módszerrel egyébként több költségallokációs módot tudsz tárolni. De azon a sheet-en kell tárolni, ahol az adatok vannak.
-
ulrik19
tag
Én így csinálnám. Ehhez a makróhoz célszerű hozzárendelni egy billentyű-kombinációt is.
Public Sub ktgelosztas()
Dim cella As Object, osszeg As Integer
osszeg = Int(Val(InputBox("Felosztandó összeg a kijelölt cellák között:") / Selection.Count))
For Each cella In Selection
cella.Value = Val(cella.Value) + osszeg
Next
End SubHasználata:
kijelölöd azokat a cellákat, amikre szét akarod osztani az értéket. (a ctrl nyomva tartva az egérrel ugye tudsz egymástól független cellákat sorban kijelölni, ahányat csak szeretnél)Majd indítod a makrót (pl. a hozzárendelt billentyűkombinációval).
A progi bekéri a számot, amit szétoszt annyi részre, ahány cellát kijelöltél, és a kijelölt cellák értékét növeli a rá jutó résszel. (ha valamelyik kijelölt cellában szöveg volt, akkor azt nullának értelmezi, ha szöveget adsz be a felugró ablakban, akkor nullát ad mindenhova, vagyis nem változik az érték. Ha valamelyik kijelölt cellában képlet van, akkor az felül fog íródni a konkrét értékkel)
hajrá!
-
ulrik19
tag
Így van, ahogy Delila írta, meg kell fordítani a gondolatot. Ugyanis a next automatikusan megtörténik, amint a ciklusmag végére ér a folyamat. Vagyis, ha az elágazásod arról szól, hogy mikor nem egyezik meg a sheet neve a vizsgálandóval, akkor ha egyeznek, nem történik semmi a cikluson belül.
For Each lap In Workbooks(valtozo).Worksheets
If lap.Name <> el Then
... ide jön amit végeztetni akarsz ...
End If
Next -
ulrik19
tag
válasz
ulrik19 #5802 üzenetére
Ez pedig egy elegánsabb megoldás:
'végigmegy az összes munkalapon, és amelyik nem a kijelölt terület munkalapja,
'összeadja az azonos elhelyezkedésű cellák értékét
Public Function SubTotal(cRange As Range)
Dim lap As Worksheet, Sum As Double
Sum = 0
For Each lap In Worksheets
If Not lap.Name = cRange.Worksheet.Name Then Sum = Sum + lap.Cells(cRange.Row, cRange.Column)
Next
SubTotal = Sum
End FunctionEnnek használata pedig:
=SubTotal(L154)Persze, lehet más cella is az argumentumban. Azt a cellát kell belerakni ebbe a képletbe, amiket szeretnénk az összes többi sheeten összegezni. Mivel cellahivatkozás, másolható máshová, tehát "átírja" a hivatkozást, mint bármilyen más függvény használatakor.
(Bár a Sum = 0 sor nem lenne kötelező, javaslom, hogy minden hasonló helyzetben adjátok meg a kezdőértéket. Néha előfordulnak cifra dolgok ennek elhagyása esetén
)
-
ulrik19
tag
válasz
Delila_1 #5792 üzenetére
Én nem eseményhez kötném a lefutást, hanem így oldanám meg:
Public Function SubTotal(xRow As Integer, xCol As Integer)
Dim lap As Byte, Sum As Double
Sum = 0
For lap = 2 To Worksheets.Count
Sum = Sum + Sheets(lap).Cells(xRow, xCol)
Next
SubTotal = Sum
End FunctionAztán az Összesítő sheet 3 megfelelő cellájába mehet ez a képlet (magyar excelnél a , helyett ; kell természetesen
):
=SubTotal(154, 12)
=SubTotal(155, 12)
=SubTotal(156, 12)Vagyis ez egy összeadó függvény, ami a megadott sor- és oszlopszámú cellákat összeadja valamennyi munkalapon (kivéve az összesítőt). Jelen esetben L154-es, L155-ös és L156-os cellák összegét.
-
ulrik19
tag
sub akármi() ekvivalens a public sub akármi() használatával
vagyis "kintről" elérhető.ugyanakkor: private sub akármi() esetében a hatókör nem engedi, hogy máshonnan meghívják, ezért a makróindításnál sem látszik. DE, a 3 sub-nak egy modulban kell lenniük.
egyébként szerintem mindig célszerű kitenni a private/public kulcsszót, hogy totál egyértelmű legyen.
Új hozzászólás Aktív témák
Hirdetés
- Adobe Előfizetések - Adobe Creative Cloud All Apps - 12 Hónap - NYÁRI AKCIÓ!
- Antivírus szoftverek, VPN
- Bitdefender Total Security 3év/3eszköz! - Tökéletes védelem, Most kedvező áron!
- Windows, Office licencek kedvező áron, egyenesen a Microsoft-tól - Automata kézbesítés utalással is!
- Assassin's Creed Shadows Collector's Edition PC
- Lenovo Thinkpad P16 G2 - i9-13980HX, 64GB, 1TB SSD, 16" WQUXGA (3840 2400), RTX 4090 (ELKELT)
- Konzol felvásárlás!! Nintendo Switch
- ÁRGARANCIA!Épített KomPhone i5 13400F 16/32/64GB RAM RX 7700 XT 12GB GAMER PC termékbeszámítással
- REFURBISHED és ÚJ - HP USB-C Dock G5 docking station (5TW10AA) - 3x4K felbontás, 120Hz képfrissítés
- Beszámítás! Sony PlayStation 5 825GB SSD digital konzol garanciával, hibátlan működéssel
Állásajánlatok
Cég: Promenade Publishing House Kft.
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged