- Elkészült és telepíthető az Android 16
- Nem várt platformon a OnePlus Nord 5
- Samsung Galaxy S25 Ultra - titán keret, acélos teljesítmény
- Honor 400 Pro - gép a képben
- Samsung Galaxy Watch7 - kötelező kör
- Milyen okostelefont vegyek?
- Nothing Phone (3a) és (3a) Pro - az ügyes meg sasszemű
- Redmi Note 13 Pro 5G - nem százas, kétszázas!
- Samsung Galaxy S23 Ultra - non plus ultra
- Samsung Galaxy Watch5 Pro - kerek, de nem tekerek
-
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
-
föccer
nagyúr
Igazándiból haladjunk a korral jeligére tegnap-tegnapelőtt regisztráltam rá, hamár a csapból is ez folyik. Egy már régebben megoldott feladatomnak egy kis részét írtam le neki próbából. A legelkeserítőbb az volt, hogy a legenerált xlsm fájlja nem volt megnyitható és néhány a végén még mindig maradt benne egy olyan hiba, hogy nem azt adta eredményül, amit kellett volna. Szóval kb ugyan arra a következtetésre jutottam, mint te. Az biztos, hogy a mélyszakmai elemzéseket nem fogom rá bízni.
A mostani feladatot kb sorrol sorra megfoglamaztam neki, a teljes szemantikát leírtam, lépésről lépésre. És így sem jött neki össze elsőre. De mókának jó volt, illetve a lehetőséget felmérni.
-
Mutt
senior tag
Szia,
Szerintem itt fontos tisztázni azt, hogy amit a Personal.xlsb "Workbook_Open" eseményébe teszel, akkor az csak egyszer fog lefutni, amikor az Excel indulásakor az egyéni makrófüzet a háttérben megnyílik.
Azt akarod, hogy minden Excel fájl megnyitásakor legyen vmi ellenőrzés és azt ahogy tetted egy Class Module-al lehet megtenni.
Próbáld ki:
1. Personal.xlsb-ben legyen egy class module, a neve fontos clsApp legyen (ha más akkor a másik modulban kell módosítani). A tartalma pedig ez:Public WithEvents AppEvents As Application
Private Sub AppEvents_WorkbookOpen(ByVal wb As Excel.Workbook)
Call OpenEvent(wb)
End Sub
Private Sub AppEvents_WorkbookBeforeClose(ByVal wb As Workbook, Cancel As Boolean)
Call BeforeClose(wb, Cancel)
End Sub
Ahogy látható két workbook eventhez (open és a beforeclose) rendeljük a saját kódunkat.
2. A Personal.xlsb-ben legyen egy normál modul amibe az alábbi kódok kellenek:
Dim AppObject As New clsApp
Sub Init()
'ezt az egyéni makrófüzet Open eseményében fogjuk meghívni
Set AppObject.AppEvents = Application
End Sub
Sub OpenEvent(wb As Workbook)
'ez az egyéni Workbook_Open eseményünk ahova tesszük a saját kódot
'a megnyitott fájl ellenőrzése (a példában ha M-el kezdődik a neve)
If wb.Name Like "M*" Then
'hozzáadjuk a kedvenc makrónkat az eszköztárhoz
Call AddNewMenuItem
End If
End Sub
3. A Personal.xlsb ThisWorkbook eseményeibe pedig tegyük ezt be:
Private Sub Workbook_Open()
Call Init
End Sub
Private Sub Workbook_BeforeClose(Cancel As Boolean)
Call DeleteControls(True)
End Sub
Vagyis amikor elindítjuk az Excel-t, akkor az "Init" kódban megadott sor lefut, ami annyit tesz, hogy egy objektumot hoz létre ami tartalmazza az Excelben megnyitott fájlokat.
A másik pedig ha bezártuk az Excel-t teljesen, akkor előtte töröljük a saját menűt.4. Az egyéni parancs eszköztárra (QAT) kihelyezése.
Gyorselérési eszköztárra nem raktam még kóddal ki gombot, de a https://jkp-ads.com/rdb/win/s2/win004.htm oldalon találtam egy hasznos add-int, aminek a kódja szerint ez könnyen megy, de nekem nem jött össze. Az addin ettől még szuper, ha van sok saját makród, akkor ezzel tudod rendszerezni és elérni QAT-ról.Ami ment az egy új menű az eszköztáron. Én régen ezt használtam, MS365-ben most is megy.
Szóval van a normál modulban még 2 program, ami felteszi illetve leveszi a saját makródat.
Ami felteszi az így néz ki:
Private Sub AddNewMenuItem()
'töröljük az esetleg létező saját menűt
DeleteControls
Dim CmdBar As CommandBar
Dim CmdBarMenuItem As CommandBarControl
Set CmdBar = Application.CommandBars("Worksheet Menu Bar")
'Add a new menu item
Set CmdBarMenuItem = CmdBar.Controls(CmdBar.Controls.Count - 1).Controls.Add
'Set the properties for the new control
With CmdBarMenuItem
.Caption = "Saját Makró1"
.OnAction = "'" & ThisWorkbook.Name & "'!Kedvencem"
.Tag = C_TAG
End With
End Sub
Ehhez van egy C_TAG állandó a modul elején definiálva:
Private Const C_TAG = "Makrocska" 'C_TAG legyen egyedi név
Illetve fent a kódban az OnAction végén van a makró neve (esetemben "Kedvencem"),
ami ennyit tartalmaz csak:Sub Kedvencem()
MsgBox "Palacsinta", vbOKOnly
End Sub
Ami leveszi az pedig ez:
Sub DeleteControls(Optional tuti As Boolean = False)
Dim Ctrl As CommandBarControl
On Error Resume Next
Set Ctrl = Application.CommandBars.FindControl(Tag:=C_TAG)
Do Until Ctrl Is Nothing
Ctrl.Delete
Set Ctrl = Application.CommandBars.FindControl(Tag:=C_TAG)
Loop
End Sub
A fenti kódokkal el tudtam érni, amit szerettél volna:
1. Akár jelszavas fájlok esetén is (csak a megfelelő jelszó ismeretében) fut le az open esemény...
2. ami a kritériumoknak megfelelően (a példámban csak az nézem hogy a fájl neve M-el kezdődik-e vagy sem) kirak egy makrót az eszköztárra...
3. az Excel bezárásakor pedig leveszi a dolgokat.Próbáld ki, ha még kell.
A kódok alapja a Walkenbach VBA könyve (17-es fejezet). Régi (az újabbak sem hinném hogy rosszabbak), de még mindig nagyon jó. Én csak ajánlani tudom angolul tudóknak.Két fontos dolog:
1) Saját makrók esetén fontos tudni jól használni a Thisworkbook és Activeworkbook-ot.
2) Én inkább fixen kiraknám a makrót a QAT-ra és a makrót készíteném fel arra, hogy ha a fájl nem felel meg a feltételeknek akkor ne csináljon vele semmit.üdv
-
Fferi50
Topikgazda
Szia!
Épp Pakliman fórumtárs is hasonló problémát vetett fel, dinamikusan létrehozott vezérlőkhöz külön osztállyal lehet eseményeket rendelni. Ez viszont úgy látom, makróból nem indíthatóak valami miatt. (Nem volt időm még, hogy teljesen utánajárjak a természetének.)
Viszont, amennyiben meghatározható, hány darab textboxod lehet maximálisan, akkor megoldható úgy, hogy a userformon létrehozod az ennek megfelelő számú textboxot, majd csak annyit teszel láthatóvá, ahányra szükséged van. Makróból a userform mérete és a vezérlők elhelyezkedése és láthatósága szabályozható.
A validáláshoz létrehozott szabályokat egy "külön" eljárásba teszed és minden textbox BeforeUpdate eseményét ide irányítod. A validáló makrót pedig csináld paraméteresen, amit úgy hívsz meg, hogy átadod az adott textbox nevét: pl. validal activecontrol.name.
Üdv. -
Pá
addikt
Lehet, hogy kicsit kuszán írtam mit szeretnék.
Szóval a lényeg és, ami fontos, hogy a Personal.xlsb-m ThisWorkbook részébe tennék egy Workbook_Open subot, aminek az lenne a célja, hogy bizonyos szempontból automatikusan megvizsgáljon mindegy egyes excel-t, amit megnyitok.
Az a problémám, hogy az excelek egy része jelszóval védett, amiket megnyitok. És úgy kéne ezt a subot beállítani, hogy a jelszóval védett exceleknél várja meg, amíg megadom a jelszót, mielőtt lefut.
Igazából nem tudom, hogy excelben van-e bármi jele, hogy megkapta a jelszót a file és ehhez tudnám kötni a macro futását.
MsgBox-szal tesztelgettem a workbook open-t de jellemzően már azelőtt elkezdte dobálni a MsgBoxot, mielőtt egyáltalán feljött a jelszó kérő ablak, szóval valahogy késleltetni kéne a macrot addig.
-
Mutt
senior tag
Szia,
...azt kéne elérni, hogy a visible sorok legyenek szép zebra mintásak...
Látom közben VBA-n indultál el, ahol használod a SUBTOTAL (RÉSZÖSSZEG) függvényt ami a megoldás kulcsa.
Itt van az én VBA és Excel tábla nélküli, feltételes formázást használó megoldásom:
A képlet pedig:=MOD(SUBTOTAL(3;$A$5:$A5);2)
Magyar Exelben:=MARADÉK(RÉSZÖSSZEG(3;$A$5:$A5);2)
A lényeg, hogy a SUBTOTAL-ban egy alulról nyitott tartomány (csak a kezdő cella van rögzítve, a vége növekszik, ahogy másolódik a képlet) van megadva.
üdv
-
föccer
nagyúr
Vagy táblázattá kell formázni, vagy feltételes formázást beállítani. Megcsinálod a táblázat alap színét, amit a páratlan sorokra akarsz használni, majd a feltételes formázásnál a képlet valami olyasmi lesz, hogy "MARADÉK(SOR();2)=0" Ez megadja a páros sorokat, amire berakod azt a formátumot, amit a páros sorokra akarsz.
kitöröltem egy sort.
-
föccer
nagyúr
Hát, azt biztos meg lehet csinálni, hogy makróból a cella módosítás esetén visszaállítod a formátumot arra, aminek lennie kell. Kicsit fapados, de működik, ha megvan, hogy milyen feltételek szerint kell a formázást megcsinálni. Egyes cellákat lehet tiltani a lapvédelemmel. Ha jól emlékszem, akkor az egész munkafüzetet le kell védeni, ami védelem alól ki lehet venni egyes cellákat. Ha nem akarsz jelszavakkal szórakozni, akkor a beviteli munkalapról is kell csinálni egy árnyékmásolatot ami veryhidden és cella módosulásnál azt is vissza kell írni. Utóbbira ha nincs nagyon sok cella és nem a szándékos károkozást kell kivédeni, csak a véletlen felülírást, akkor lehet cella érték érvényesítésnél is beállítani, hogy csak arra az egy értékre legyen érvényes a cella. Ilyenkor bármi más adatot akarnak bevinni, az excel nem fogja engedni.
-
Delila_1
veterán
Na és ez?
Az A1-ben szerepelhetne érvényesítésként a 15 pénznem.
Akkor át lehetne írni a makrót (csak a címét), hogy ne a lapaktiválására induljon, hanem az A1 módosítására.
A kezdősor Private Sub Worksheet_Change(ByVal Target As Range), és a feltétel
If target.address="$A$1" -
Fferi50
Topikgazda
Szia!
Akkor a feltételes formázás lesz a barátod!
Kijelölöd a táblázat lehetséges tartományát.
Kezdőlap - Feltételes formázás - új szabály - a formázandó cellák kijelölése képlettel - Értékek formázása, ha ez a képlet igaz, a képlet
=$A$1="HUF"
Formátum: Szám fül - Pénznem - itt beállíthatod a tizedest ha kell, ill. a pénznem hárombetűs kódok (ami a felsorolás vége felé van) közül kiválasztod a HUF értéket.
Majd OK, OK gombok.
Ezt feltételes formázás beállítást - ugyanazon a munkalapon - beállítod az összes előfordulható pénznemre - egymás után, ugyanarra a tartományra, a képletben a megfelelő kódot beírva és a formátumban kiválasztva.
Ezután a munkalapon mindig olyan számformátum jelenik meg, amilyen kódot az A1 cellába írtál.
Így talán megfelelő lehet.
Üdv. -
-
Delila_1
veterán
Na még egy próba.
Mikor a lapra lépsz, akkor indul. A makró a B oszlopot formázza, B2-től az utolsó adatig.
A laphoz kell rendelni.
Megjegyzem, továbbra is a címsorba írnám, nem a teljes oszlopba.Private Sub Worksheet_Activate()
Dim ter As Range
Set ter = Range("B2:B" & Range("B2").End(xlDown).Row)
ter.NumberFormat = "#,##0 [$" & Range("A1").Text & "]"
End Sub
-
Fferi50
Topikgazda
Szia!
Makró nélkül:
Kijelölöd a számokat tartalmazó táblázatot(tartományt). Jobb egérgomb - Cellaformázás - Számfül - Pénznem - kiválasztod az A1-ben szereplő pénznemet és a megfelelő tizedesjegyet, majd OK és lőn.
Ha ez nincs ínyedre, akkor nem fog makró nélkül menni.
Egy lehetséges makró:Sub penznem()
Selection.NumberFormat = "#,##0 [$" & Range("A1").Text & "]"
End Sub
Kiválasztod a tartományt, utána elindítod a makrót, rendelhetsz hozzá gyorsbillentyűt is.
Üdv. -
Delila_1
veterán
-
föccer
nagyúr
Én az ilyet úgy csinálnám meg, hogy kiválasztható szöveg részleket, cikkeket egy kezelőfelületen beállítnánk, utána egyszerűen összefűzném a megfelelő sorrendben, esetleg makróval, vagy függvénnyel a feladat bonyolultságától függően. Csináltam már ilyen formanyomtatvány kezelőt, nem annyira nagy kunszt. Viszont ezt nem nagyon lehet "látatlanba" megírni, mindenképpen látni kell hozzá a sablon formátumát, hogy mihez igazítom
üdv, föccer
-
Fferi50
Topikgazda
Szia!
Használd a Word körlevél funkcióját. Elkészíted a körlevél alapját (template), majd a vele összekapcsolt Excelből beépíted a megfelelő mezőket.
Majd a Word körlevél menüben az egyesítéssel megkapod a kitöltött formátumot, amit nyomtathatsz is akár.
A fentiek elkészítése után az Excelből is lehet egy rövid makrót indítani az egyesítésre, bár szerintem egyszerűbb az Excelben kitölteni minden adatot és utána a Wordben indítani az egyesítést.
Arra figyelj, hogy a körlevélhez egy Excel sor tartozik, minden bele kerülő adatnak egy sorban kell lennie.
Üdv. -
Fferi50
Topikgazda
Szia!
"a gépen dupla katt-al megnyitom az excel filet és amikor felugrik a password ablak, akkor VBA ismerje fel, hogy most egy "olyan" file-t nyitottam meg "
Én úgy gondolom, ez nem fog így menni. A fájlt makróból lehet jelszóval megnyitni, de ahhoz ismerni kell a fájl nevét:
Workbooks.Open Filename:=fájlnév,Password:=jelszó
A fájlnévnek az aktulális könyvtár esetén elegendő a név.kiterjesztés, másik könyvtár esetén a teljes elérési út szöveg formában (idézőjelek között). A jelszó szintén idézőjelek között, mert az is szöveg (akkor is ha szám!).
Tehát a makróból való megnyitáshoz ismerni kell a fájl nevét.
Ezt a DIR() parancs tudja szolgáltatni:
fájlnév=DIR("*.xls*") az első xls-el kezdődő kiterjesztésű fájl nevét adja vissza.
Ebben az Instr függvénnyel megnézheted, hogy szerepel-e a kívánt szövegrészlet.
A következő fájlnevet pedig a paraméter nélkül kiadott parancs adja vissza:
fájlnév=DIR()
Addig az első feltétel szerint keres, amíg meg nem változtatod a keresés feltételét.
Ha nem talál olyan fájlt, ami a keresési feltételnek megfelel, akkor üres lesz a fájlnév változó. [Itt találsz a DIR parancshoz helpet]
Üdv. -
Fferi50
Topikgazda
-
Mutt
senior tag
Szia,
Feri kódja nem nézi, hogy az ellenőrzés után van-e újabb timestamp. Nem tudom, hogy ez a valós adaton gondot okoz-e vagy sem. Ahhoz hogy helyben cserélhesd az adatokat másik makró kell, amit billentyűparanccsal vagy külön gombbal tudsz indítani. Vigyázz mert nem lehet visszavonni a makró módosításait!
Sub ellenor2()
Dim rngAdatok As Range
Dim adat As Range, adatSzoveg As String
Dim posEllenorzes As Long, posHatar As Long, posKovetkezoHatar As Long
Const ell = "ellenőrzés", hatar = "|"
Set rngAdatok = Selection.CurrentRegion 'kijelölt cellát tartalmazó tartomány használata
For Each adat In rngAdatok
posEllenorzes = InStr(1, adat, ell)
adatSzoveg = ""
'ha van benne "ellenőrzés" szöveg akkor nézzük át
If posEllenorzes > 0 Then
posHatar = InStrRev(adat, hatar, posEllenorzes) 'ellenőrzes előtti határjel helye
posKovetkezoHatar = InStr(posHatar + 1, adat, hatar) 'ellenőrzés utáni első határjel helye
If posKovetkezoHatar > posEllenorzes Then
adatSzoveg = Mid(adat, posHatar, posKovetkezoHatar - posHatar - 1)
End If
End If
adat = adatSzoveg
Next adat
End SubPower Query (PQ)-ben pedig több lépéses a dolog.
Az én mintám így néz ki:Bal oldalt az adatsor, jobb oldalt pedig egy munkafázis ahol lehet módosítani hogy mire keressen.
1. Első lépésként mindkét táblát betöltöm PQ-be. A jobb oldalinak adtam egy ilyen nevet "tblMunkafazis".
2. Megkeressük hogy van-e "ellenőrzés" az adatsorban. Ehhez egy új oszlopot szúrunk be, neve nálam "Ellenorzes". A képlete pedig:
=Text.PositionOf([Adatok], tblMunkafazis[Munkafázis]{0})
3. Az ehhez tartozó pipe-ot is megkeressük. Az oszlop neve: "Határ", képlete:
=Text.PositionOf(Text.Start([Adatok],[Ellenorzes]),"|",Occurrence.Last)
4. Az ezutáni pipe helyének a képlete:
=Text.PositionOf(Text.Middle([Adatok],[Hatar]+1),"|")+[Hatar]
5. Minket csak azok érdekelnek ahol van ellenőrzés szöveg és ahol a két pipe eltér. Új oszlopba pedig kirakjuk az eredeti szöveg pipeok közötti részét. A képlet:
=if [Ellenorzes]>0 and [Kovetkezo hatar] > [Hatar] then Text.Middle([Adatok],[Hatar],[Kovetkezo hatar]-[Hatar]-1) else null
6. Azok a sorok ahol null van nem kellenek és a többi oszlopot is eltávolítjuk.
7. Eredményt Excel-be visszatöltjük.A teljes M-kód:
let
Forrás = Excel.CurrentWorkbook(){[Name="Táblázat1"]}[Content],
#"Típus módosítva" = Table.TransformColumnTypes(Forrás,{{"Adatok", type text}}),
#"Egyéni oszlop hozzáadva" = Table.AddColumn(#"Típus módosítva", "Ellenorzes", each Text.PositionOf([Adatok], tblMunkafazis[Munkafázis]{0}), Int64.Type),
#"Egyéni oszlop hozzáadva1" = Table.AddColumn(#"Egyéni oszlop hozzáadva", "Hatar", each Text.PositionOf(Text.Start([Adatok],[Ellenorzes]),"|",Occurrence.Last), Int64.Type
),
#"Egyéni oszlop hozzáadva2" = Table.AddColumn(#"Egyéni oszlop hozzáadva1", "Kovetkezo hatar", each Text.PositionOf(Text.Middle([Adatok],[Hatar]+1),"|")+[Hatar], Int64.Type),
#"Egyéni oszlop hozzáadva3" = Table.AddColumn(#"Egyéni oszlop hozzáadva2", "Eredmeny", each if [Ellenorzes]>0 and [Kovetkezo hatar] > [Hatar] then Text.Middle([Adatok],[Hatar],[Kovetkezo hatar]-[Hatar]-1) else null, type text),
#"Sorok szűrve" = Table.SelectRows(#"Egyéni oszlop hozzáadva3", each ([Eredmeny] <> null)),
#"Többi oszlop eltávolítva" = Table.SelectColumns(#"Sorok szűrve",{"Eredmeny"})
in
#"Többi oszlop eltávolítva"üdv
-
ny.janos
tag
Persze a makrós megoldás is tetszés szerint bővíthető, de azért is tettem ki végül a megoldásomat, mert azzal akár az összes dolgozó, összes munkafázisban történő részvétele összeszámolható egyetlen függvénnyel megfelelő előkészítés mellett.
Ha megengeded, hogy őszinte legyek, elsőre úgy gondoltam közzé sem teszem a megoldást, mert a - nem szándékosan, hanem rosszul megfogalmazott - struktúra miatt úgy éreztem, hogy feleslegesen akarok segíteni és nem hiányzik nekem, hogy tovább gondolkodjak a megoldáson, mert majd újra kiderül valami, ami nem úgy van, ahogy elsőre tűnt.Aztán meggondoltam magam, mert bármelyikünk hibázhat és a megoldások sokszínűsége segíthet egy későbbi probléma megoldásában másnak is, illetve én azokból tanultam sok mindent, amit itt a fórumon olvastam.
A PQ-t mindig azért tartom nagyszerű megoldásnak, mert olyan dolgokat lehet vele viszonylag könnyedén megoldani sok esetben, melyhez vagy nagyon bonyolult, sokszorosan egybeágyazott függvények kellenének, vagy makrót kellene segítségül hívni. Mivel én utóbbihoz még annyi ismerettel sem rendelkezem, hogy egy kapott kódot hova kellene másolni (azt tudom, hogy az összefoglalóban meg tudnám nézni, de magamtól tényleg nem tudom), ezért mindig örülök, ha létezik programozási ismeret nélküli megoldás a PQ segítségével.
A te esetedre visszatérve: ha az általam javasolt megoldást úgy módosítod, hogy PQ-ben a beolvasás után felveszel egy indexoszlopot, majd a darabolást követően szűrsz azokra a sorokra, amelyek tartalmazzák az ellenőrzés kódot, akkor betöltés után ebből a táblából az index sorszám alapján az eredeti adataid mellé egy külön oszlopba ugyanúgy hozzá tudod olvasni a kinyert részletét az adatodnak (a módszert - PQ, index-hol.van, fkeres-sor függvények pedig tetszőlegesen megválaszthatod)
-
ny.janos
tag
Kijelölöd az adataidat, majd az adatok menü adatok beolvasását táblázatból vagy tartományból pontot választod (PQ). PQ-ben a kezdőlapon az oszlop felosztását választod
A betöltés után a nevekből és a munkafázisból csinálsz egy táblázatot, majd aSZORZATÖSSZEG((SZÁM(SZÖVEG.KERES([NÉV];[PQ által létrehozott tartomány]))*(SZÁM(SZÖVEG.KERES([munkafázis];[PQ által létrehozott tartomány])))))
függvénnyel megkeresed mi mennyiszer fordul elő (ha egy sorban ugyanaz a név ugyanahhoz a munkafázishoz többször szerepelne, akkor azt duplán fogja számolni az összesítésben).A PQ betöltés munkalapját elrejted, ha neked szeretnéd látni.
-
Fferi50
Topikgazda
Szia!
"2. Keresse meg a kulcsszótól jobbra és balra eső első | jelet. És a két | jel közötti szöveget vágja ki és tegye át a szomszédos cellába."
Az alábbi felhasználói függvény megteszi ezt:Function ellenor(crange As Range) As String
Const ell = "ellenőrzés", hatar = "|"
Dim a, b
ellenor = ""
a = crange.Value
If InStr(a, ell) = 0 Then Exit Function
b = Split(a, hatar)
For Each a In b
If InStr(a, ell) > 0 Then ellenor = a: Exit Function
Next
End Function
Másold egy modulba vagy az adott munkalap kódlapjára. (Ez utóbbi esetben nem tudod másik munkalapon használni.)
Ugyanúgy kell használni, mint a beépített függvényeket, pl. =ellenor(A1) és húzható is.
Ha a forrás cellában szerepel az ellenőrzés szó, akkor a határoló jelek közötti értéket írja a cél cellába, ha nem, akkor üres szöveg kerül bele.
Ha nem működne, akkor a határolójelet másold a hatar konstansba az egyik cellából (előfordulhat, hogy más a karakterkészleted).
Ha más kulcsszóra szeretnél keresni, akkor az ell konstansba írd azt a szót.
A munkafüzetet makróbarátként vagy binárisként kell mentened.
Remélem, sikerül.
Üdv. -
ny.janos
tag
Még egy kérdés: az
[időbélyeg] - [munkafázis] - [név] - [pozició]
struktúra minden eleme mindig megjelenik a cellában, vagy előfordulhat olyan, hogy valamelyik adat hiányzik?
Azaz lehet olyan, hogy a következő időbélyeg előtt ennyi áll?[időbélyeg] - [név] - [pozició]
Ha utóbbi előfordulhat, akkor munkafázis pozíció teljesen hiányzik, vagy a szögletes zárójel megvan, de nem tartalmaz adatot? -
ny.janos
tag
Szia!
Az ellenőrzés munkafázis egy sorban egyszer fordulhat elő, vagy többször? Függvénnyel arra lehet megoldást találni, ha csak egyszer szerepel, mert ez esetben ismert, hogy meddig (következő | jel) kell a nevet keresni. Ha viszont többször is lehet ellenőrzés munkafázis cellán belül, akkor úgy gondolom, hogy mindenképpen darabolni kellene a cellákat (kivéve persze a makrós megoldást - amihez én nem értek).
Jól értem, hogy adott személyhez az összes sort szeretnéd vizsgálni egyszerre, hogy melyekben szerepel az ellenőrzés munkafázisnál az ő neve és ezek darabszámára vagy kíváncsi az összes sorból? Ha igen, akkor Power Query irányába is el lehet indulni szerintem. -
Mutt
senior tag
Szia,
Ha jól értelmezem a feladatot, akkor ez az UDF tud segíten a 2-es problémán.
Function Munkafazis(adat As Range, nev As String, munka As String) As Long
Dim fSplit
Dim r As Long, c As Long
Dim TimeStamp As Boolean
Dim m As Long
Munkafazis = 0
m = 0
For r = 1 To adat.Rows.Count
fSplit = Split(adat.Rows(r), " - ")
TimeStamp = False
If UBound(fSplit) > 1 Then
'menjünk végig a listán
For c = 0 To UBound(fSplit)
'ha a név egyezik akkor nézzük meg a munkafázist és a timestampet
If fSplit(c) = nev Then
'ha a munkafázis egyezik és már volt timestamp akkor számolhatjuk az elvégzett munkát
If TimeStamp Then
m = m + 1
Exit For
End If
If fSplit(c - 1) = munka Then
If Not TimeStamp Then TimeStamp = True
End If
End If
Next c
End If
Next r
Munkafazis = m
End Functionüdv
-
Pá
addikt
Igazából egy olyan logikára lenne szükségem, ha megoldható, hogy
1. Megnézi, hogy a cellában megtalálható-e az adott kulcsszó. ("ellenőrzés")
2. Ha nincs, akkor az eredmény nulla.
3. Ha megtalálható, akkor onnan jobbra elkezdi keresni az adott ember nevét és az időbélyeget. Ha először az időbélyeghez ér, akkor az eredmény szintén nulla. Ha az időbélyeg előtt megtalája a nevet, akkor az eredmény 1.Annyi könnyebbség, hogy rájöttem, hogy minden időbélyeg előtt van egy | jel. Szóval elég a " | " jelet keresni.
Ugye a Szöveg.Keres függvény megadja, hogy hányadik karakternél van a kulcsszó. Annyit kéne megnézni, hogy utána hamarabb jön-e az adott név, mint a | jel.
A nehézség pedig az, hogy | jelből jó sok van a cellában, mivel minden munkafázis azzal kezdődik, illetve az adott név is többször szerepelhet, ha több munkafázisban részt vett az emberke.
De minket csak a kulcsszó utáni első név vagy " | " jel érdekel. -
Fferi50
Topikgazda
Szia!
Próbáld meg ezt a TÖMBKÉPLETET:=SZUM(HAHIBA((SZÖVEG.KERES("név";$A$1:$A$6)>0)*(SZÖVEG.KERES("ellenőrzés";$A$1:$A$6)>0);0))
A tömbképletet Shift+Ctrl+Enter billentyű kombóval kell lezárni, az Excel kapcsos zárójelbe teszi.
A tartományt igazítsd a listádhoz. A "név" helyére és az "ellenőrzés" helyére természetesen írhatsz olyan cella címet, amelyik a szükséges értéket tartalmazza.
Üdv. -
Fferi50
Topikgazda
Szia!
Nézz körül légy szíves a képletek között, van(nak)-e olyanok, amelyek egész sorra/oszlopra vonatkoznak: Pl.Fkeres(A1;B:D;2;0)
Ez lassítja a futást és növeli a területet is.
A feltételes formázásokat is érdemes átnézni, mert előszeretettel szakítja meg a területeket pl. beszúrás vagy törlés esetén, így többlet formázások jönnek létre az egybefüggő helyett.
Üdv. -
Delila_1
veterán
-
Fferi50
Topikgazda
Szia!
A sok Select és Activate utasítás bizony nem szerencsés. A másolást egy lépésben is meg lehet csinálni így:
Range(forrás).Copy Destination:=Range(cél)
Nem kell hozzá semmilyen ciklus!
Esetedben a javaslat:Sub masolo()
With Range("CO1:CR97")
.Copy Destination:=Range("D1").Resize(.Rows.Count, Application.WorksheetFunction.Max(Range("CG:CG")) * .Columns.Count)
End With
End Sub
A D1 cella helyett írd be annak a cellának a címét, ahova kezdődjön a másolat elhelyzése.
Továbbá javaslom, hogy teljes CG oszlop helyett egy meghatározott tartományt vegyél fel a MAX függvényhez - olyan nagyságút, amit nagy biztonsággal nem lépnek át az adataid - ne kelljen mindig milliós cellaszámot figyelni.
Még egy megjegyzés: A másolás paraméterei úgy vannak összeállítva, hogy más tartomány esetén is megfelelő sort és oszlopot másol át, a kívánt mennyiségben.
Üdv. -
Pá
addikt
Ilyen kerülő úton meg tudom csinálni, hogy ez oszlop mellett egy másik oszlopban felismerem a nem nulla értékéket és megszámolom a közöttük lévő cellákat és megnézem, hogy ezek a számok egyformák-e mind. Szóval ilyen módon megvan.
Most arra keresnék módot, hogy lehetséges-e ezt frappánsan belesüríteni csak 1 cellába.
-
Fferi50
Topikgazda
Szia!
Makró nélkül szerintem csak akkor megy, ha egy harmadik lapon csinálod az adatbevitelt és ahhoz kötöd a két másik lapot - egyiket függőlegesen, másikat vízszintesen.
Egy oszlop transzponálása sorrá és vissza, itt a két makró:Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A3:A62")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Sheets("Munka2").Range("C84:BJ84").Value = Application.Transpose(Range("A3:A62").Value)
Application.EnableEvents = True
End Sub
Illetve:Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C84:BJ84")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Sheets("Munka1").Range("A3:A62").Value = Application.Transpose(Range("C84:BJ84").Value)
Application.EnableEvents = True
End Sub
Ez minden alkalommal egy az egyben átteszi az egész területet.
Az éppen módosított cella értékét a következőképpen lehet áttenni:
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("A3:A62")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Sheets("Munka2").Range("C84:BJ84").Cells(Target.Row - 2).Value = Target.Value
Application.EnableEvents = True
End Sub
és
Private Sub Worksheet_Change(ByVal Target As Range)
If Intersect(Target, Range("C84:BJ84")) Is Nothing Then Exit Sub
Application.EnableEvents = False
Sheets("Munka1").Range("A3:A62").Cells(Target.Column - 2).Value = Target.Value
Application.EnableEvents = True
End Sub
Üdv.
-
Fferi50
Topikgazda
Szia!
Eseménykezelő makróval megoldható.
Mindkét munkalapra kell eseménykezelő, amit az adott munkalap kódlapjára kell bemásolnod:
A Munka1 munkalapra:Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$A$1" Then
Application.EnableEvents = False
Sheets("Munka2").Range("C1").Value = Target.Value
Application.EnableEvents = True
End If
End Sub
A Munka2 munkalapra:Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address = "$C$1" Then
Application.EnableEvents = False
Sheets("Munka1").Range("A1").Value = Target.Value
Application.EnableEvents = True
End If
End Sub
Ez a Munka1 A1 cellája és a Munka2 C1 cellája között teremt azonosságot.
A munkalap nevét és a cella címét írd át a sajátodra.
A munkafüzetet makróbarátként (vagy binárisként) kell mentened.
Természetesen tartományt is meg lehet határozni, amin belül a változás egy másik munkalap megfelelő tartományában eltérő helyre másolódik.
Üdv. -
Pá
addikt
Közben meg is lett a megoldás, hasonló esetre. Akit érdekel.
=OFFSET($A$1,0,0,COUNTA($A:$A),1)
Ezzel egy dinamikus range-t lehet létrehozni, ami pont olyan hosszú(annyi sor van benne), ahány eleme van az oszlopnak. Elvileg "Defined Name"-ként is működik, szóval elnevezheted, aztán lehet rá hivatkozni bárhol.
-
Fferi50
Topikgazda
Szia!
A sok képletezett cella "természetesen" hatással van a teljesítményre. Ha nem egész sorok/oszlopok szerepelnek a képletekben, akkor azért talán nem kellene nagyon aggódni emiatt. Kérdés viszont, hogy hova hivatkoznak a képletek: másik munkalapra vagy másik/külső fájlra, továbbá milyen gyakran kell újraszámolni azokat.
A legfőbb kérdés igazából az, hogy miért Excelben kell ezt csinálni, ha pedig mégis, akkor miért képletekkel, miért nem lehet pl. lekérdezéssel (ahol feltételeket is lehet megadni).
Tehát jó lenne a feladat jellegét ismernünk, hátha többet (is) tudnánk segíteni.
Üdv. -
lappy
őstag
Sub Open_workbook_example2()
Dim Myfile_Name As Variant
Dim Myfile_Name_ex As Variant
Myfile_Name = Application.GetOpenFilename(FileFilter:="Excel Files(*.xl*),*.xl*)")
If Myfile_Name <> False Then
Workbooks.Open FileName:=Myfile_Name
End If
Myfile_Name = CreateObject("Scripting.FileSystemObject").GetBaseName(ActiveWorkbook.Name)
Myfile_Name_ex = CreateObject("Scripting.FileSystemObject").GetExtensionName(ActiveWorkbook.Name)
ThisWorkbook.Sheets("Munka1").Range("A1") = Myfile_Name & "." & Myfile_Name_ex
End Sub
A Munka1 és A1 helyére mehet a saját munkafüzet neve és cella azonosítója -
Delila_1
veterán
A lenti 3 makrót másold be egy modulba. Az elsőt indítod, az meghívja a másik kettőt.
Törli a Store lapot, majd feldob egy fájlválasztó ablakot.
Indítás előtt a harmadik makróban a Munka2 nevet írd át az Update füzeted másolandó lapja nevére.
Nem kell képletekkel "beszívni" az adatokat, mert az Update füzetből a teljes lapot másoljuk az Original-ba, majd az esetleges képletek helyére értékeket illesztünk be. Ez így gyorsabb, de az összevont cellák miatt mindenféle hiba állna elő nélküle.Option Explicit
Public WB
Sub Store_lap_torlese()
Dim FN
Application.DisplayAlerts = False
On Error Resume Next
Set FN = Sheets("Store")
If Err.Number = 0 Then Sheets("Store").Delete
On Error GoTo 0
Application.DisplayAlerts = True
Fajl_Valasztas
End Sub
Sub Fajl_Valasztas()
Dim b As Integer
Set WB = Application.FileDialog(3)
With WB
.AllowMultiSelect = False
.Show
If .SelectedItems.Count = 0 Then
MsgBox "Nem választottál fájlt, befejezzük.", vbInformation, "Értesítés"
Exit Sub
Else
WB = .SelectedItems(1)
End If
End With
For b = Len(WB) To 1 Step -1
If Mid(WB, b, 1) = "\" Then
WB = Mid(WB, b + 1, 50)
Exit For
End If
Next
Sheets("Name").Cells(1) = WB
Workbooks.Open WB
Lapmasolas WB
End Sub
Sub Lapmasolas(WB)
Sheets("Munka2").Copy After:=Workbooks("Original.xlsm").Sheets(2)
Sheets("Munka2").Name = "Store"
Columns("A:Z").Copy
Range("A1").PasteSpecial xlPasteValues
Application.DisplayAlerts = False
Workbooks(WB).Close False
Application.DisplayAlerts = True
Sheets("Store").Cells(1).Select
End Sub -
lappy
őstag
Sub Get_Data_From_File()
Dim FileToOpen As Variant
Dim OpenBook As Workbook
Application.ScreenUpdating = False
FileToOpen = Application.GetOpenFilename(Title:="Browse for your File & Import Range", FileFilter:="Excel Files (*.xls*),*xls*")
If FileToOpen <> False Then
Set OpenBook = Application.Workbooks.Open(FileToOpen)
OpenBook.Sheets(1).Range("A1:Z200").Copy
ThisWorkbook.Worksheets("SelectFile").Range("A1").PasteSpecial xlPasteValues
OpenBook.Close False
End If
Application.ScreenUpdating = True
End Sub
A Sheet(1) -nél az 1 helyére adhatod meg hogy hányadik munkafüzet legyen
Még azt nem sikerült megcsinálnom hogy a munkafüzetek közül is lehessen választani
ezzel bemásolod az adatokat és innen veszed át az indirekt függvényekkel ami kell -
Pá
addikt
Igazából arra jutottam, hogy a jelenlegi INDIRECT-es megoldásom minden szempontból jó begyűjteni az adatokat, szóval megtartanám. (és elég macerás lenne felsetupolni egy új rendszert)
Az egyetlen hátránya, hogy minden adatot elvesztek, ahogy bezárom azt a file-t, ahonnan veszem az adatokat. Ezt úgy hidalnám át, hogy klónozom azt a sheetet ami begyűjti az adatokat.
Az eredeti lenne a Feed sheet. Továbbra is szépen beszippantaná az adatokat a megnyitott file-ból. A klón lenne a Store sheet, ide csak "Value"-ként tenném át az adatokat egy az egyben a Feed sheetről. Innentől a fileomban minden további cella csak a Store sheetre hivatkozna, ahol megmaradnának az adatok, egészen addig, amíg újra meg nem nyitom a másik file-t, ami a Feed sheeten keresztül beupdatelné a Store sheetemet.Viszont ehhez macro-t kéne használnom, amihez sajnos csak nagyon minimálisan értek, szóval ehhez kéne a segítségetek. Leírom, mi lenne a legideálisabb működés számomra, aztán max egyszerűsítünk rajta, ha valamelyik rész túl problémás.
Macro - Gombnyomásra indul
1. Felugrik a file megnyitás dialog box és user kiválasztja és megnyitja a másik file-t, amiből átszívjuk az adatokat. Innentől nevezzük Update.xls-nek. (A valóságban ennek a neve teljesen random módon változik, a kiterjesztése pedig lehet bármilyen excel formátum, szóval xls, xlsx, xlsm stb)2. Az újonnan megnyitott file nevét kiterjesztéssel együtt be kéne írni egy cellába az én fileomba, hogy táplálja az INDIRECT függvényeket a Feed sheeten. Szóval abba, a fileba ahonnan a macro-t indítottuk. Legyen mostantól Original.xlsx. Írja mondjuk a Sheet1!A1-be.
(Ezt a lépést nem tudtam megoldani egyáltalán, de remélem van rá valami okos mód. Azt talán ki lehet használni, hogy gondolom az Update.xls lesz az active.workbook, mivel épp most nyitottuk meg. De sajnos annyira nem értek vba-hoz, hogy ezt ki tudjam használni és át tudjam lopni a nevét a macrot futtató workbookomba. Legjobb lenne a file nevet kiterjesztéssel együtt, de elérési útvonal nélkül beírni. Ha nagyon nem megy másképp, akkor lehet kiterjesztés nélkül is. Egyébként az én fileom neve sem fix, de arra talán lehet hivatkozni úgy, hogy ahonnan fut a macro. Nehezítés, hogy a usereknek ezeken kívül még számos másik excele is lehet nyitva, amik nem kéne bezavarjanak)3. Ide esetleg be lehet tenni 1mp delay-t, hogy biztos frissüljön be minden adat a Feed sheeten. Nem tudom ez szükséges-e. Viszont mindenképp jó lenne egy check, hogy bármelyik formula errorra futott-e a Feed sheeten(elég az A1:Z200 range-t nézni). Ha igen, akkor le is állhat a macro egy hibaüzenettel.
4. Ha nincs error, akkor Feed!A1:Z200 range-ben a formulák eredményeit kéne áttenni valueként a Store!A1:Z200-ba. (nem tudom számít-e, de ebben a range-ben van néhány merged cella is. Illetve nem kizárólag formulák vannak, hanem néhány szöveges cella is, leginkább a táblázat headerjei)
5. Kész is, sikeres message box-szal zárulhat az update.
-
ny.janos
tag
Szia!
Akkor kezdem előröl az előbbi elveszett hozzászólás után.
A dátum átalakításához (a kérdésed alapján végzett) kísérletezgetésem alapján megfelelő megoldás lehet a szövegből oszlopok átalakítás, ha az utolsó lépésben megadod a dátum formátumát. Ha a dátumaid több formátumban vannak (ahogy írtad), akkor többször egymás után kell az átalakítást elvégezned. Az átalakítás a dátum formátumú cellákat nem fogja elrontani, a nem dátum formátumúakat ellenben megfelelő formátumra fogja alakítani. Az egyetlen (általam azonosított) probléma, ha a dátumok között NHÉ és HNÉ formátum egyaránt szerepel. Ez esetben összetettebb megoldást kellene keresni. Az átalakítás mikéntjéről Horváth Imre ebben a bejegyzésben írt részletesen.
Alkalmas lehet az átalakításra a Power Query is, de míg a szövegből oszlopok átalakítás a 202212.10 hibás formátummal is megbirkózik, addig előbbivel ezt nekem nem sikerült kezelnem (biztos lehet, csak az általam nem ismert megoldást igényelne).A megelőző hozzászólásod kapcsán (főként az alapján, hogy a bemeneti adataid több fájl több munkalapján találhatóak, de a struktúra azonos) szintén a Power Query alkalmazását javasom. A betöltés történhet akár az általad készített fájlba (ez esetben nem kell a bemeneti adatokat tartalmazó fájlokat megnyitnod) és azt is be tudod állatíni, hogy az adatfrissítés megtörténjen automatikusan, mikor a fájlodat megnyitod. A megoldásról itt találsz egy részletes, könnyen érthető, képernyőképekkel illusztrált leírást.
Sok sikert!
-
Fferi50
Topikgazda
Szia!
Talán indirekt függvénnyel megoldható lenne...
A munkalapok neveit felírod az első (vagy a 100. sorba) ebben a formában:'12th July ''06'!
Az aposztrófok azért kellenek, hogy a nevet értelmezni tudja a képletben.
Ezután a képlet, ha pl. a B oszlopban kezdődnek a munkalap nevek:=INDIREKT(B$1 & "B5")
Ezt végig lehet húzni a soron jobbra és így az első sorban levő munkalapról a B5 cella értéke kerül bele.
Ezt még lehetne kombinálni pl. azzal, hogy a második sorban x-eket teszel abban az oszlopban, amelyik adatra szükséged van.
Akkor a képlet (nyilván legalább a harmadik sortól):=HA(B2="x";INDIREKT(B$1 & "B5");"")
Vagyis csak akkor lesz benne értékes adat, ha x van a B2 cellában. Ez a képlet is húzható jobbra.
A plusz munka - ami szerintem megéri, hogy a munkalapok neveit ki kell gyűjtened egyszer.
Erre egy kis makró:Sub nevkigyujto()
Dim sh As Worksheet, x As Long
x = 2
For Each sh In Sheets
If sh.Name <> ActiveSheet.Name Then
If InStr(sh.Name, "'") > 0 Then
Cells(1, x).Value = "'" & Replace(sh.Name, "'", "''") & "'!"
Else
Cells(1, x).Value = "'" & sh.Name & "'!"
x = x + 1
End If
End If
Next
End Sub
Ez abban a formában gyűjti ki az első sorba a munkalap neveket, hogy az INDIREKT függvényben használni lehessen.
Szúrd be az üres munkalapot a többiek elé és futtasd le a makrót. Ha utána már nincs rá szükséged, akkor mentésnél hagyd figyelmen kívül a makrós figyelmeztetést - egyébként makróbarátként vagy bináris fájlként (xlsm ill. xlsb) kell mentened.
A makrót Alt+F11 után Insert Module részbe kell bevinned.Üdv.
-
Delila_1
veterán
Abszolút próba nélkül!
Vegyél fel egy üres lapot, aminek add a Gyűjtőlap nevet. Legyen ez az utolsó lap, hogy ne zavarja meg a makrót a lapok sorrendjében.
A makrót modulba másold (a Téma összefoglaló szerint), és indulhat.Sub Kigyujtes()
Dim lap As Integer, sor As Integer
Sheets("Gyűjtőlap").Select
sor = 2
For lap = 65 To 122
Cells(sor, 1) = Sheets(lap).Range("B5")
Cells(sor, 2) = Sheets(lap).Range("B8")
Cells(sor, 3) = Sheets(lap).Range("B12")
sor = sor + 1
Next
End Sub -
Fferi50
Topikgazda
Szia!
(Azok a tab-ok Munkalap (Sheet) névre hallgatnak.)
"egy új üres tabon egymás mellé vagy egymás alá kigyűjteni"
Tehát nem összeadni. Gondolom kellene az is, hogy melyik érték melyik munkalapról való.
Ez úgy gondolom, mindenképpen makró lesz. Előtte azonban nem ártana mégis nekidurálni magad valami szabályszerűséget vinni az elnevezésbe, mert így egyszerűen nem lehet automatizálni a dolgot.
A munkalap sorszáma (indexe a munkalapon belül) lehetne egyedi hivatkozás, azonban vedd figyelembe, hogy egy munkalap beszúrása vagy a lapok átrendezése megváltoztatja ezeket a sorszámokat! Tehát csak feltételesen használható, addig amíg a munkalapokat nem mozgatod.
Egy makróban meg lehet oldani, hogy bekérje pl. a kezdő és végső munkalap sorszámát /vagy nevét (ha az már egyértelmű), a cellák címét és ez alapján végrehajthatja a szükséges kigyűjtést.
De ehhez az előzőeket figyelembe kell venned.Üdv.
-
sztanozs
veterán
SendKeys "{End}"
se működik?Esetleg ez lehe a probléma:
SendKeys Not Working From Shortcut
If you try to run a macro with a keyboard shortcut, and that macro uses the SendKeys method, the SendKeys method might not work. To solve the problem, you can add a 1 second (or slightly longer) Wait line in the macro, before the SendKeys:Application.Wait (Now() + TimeValue("00:00:01"))
-
Mutt
senior tag
Szia,
Hívatkoz a másik lapon a cellákra így:
=INDEX(Munka1!$A:$AZ;;)
Ahol Munka1 az első munkalapod, és $A:$AZ az a tartomány ahol van adatod a lapon.
Alapból az INDEX függvénynek meg kellene adni, hogy melyik sorban (és melyik oszlopban) lévő adatot akarjuk kiíratni, de lehetünk lusták is és ekkor egy érdekes dolgot kapunk, aminek az "implicit intersection" (magyarul talán az egyértelmű metszet?) az angol elnevezése. Az Excel megpróbálja visszaadni a másik tartományban annak a sornak és oszlopnak az értékét, ahol éppen vagyunk.
üdv
-
sztanozs
veterán
Kellene az összes, így (A - értékek, B - max helyek, C - max értékek)?
B oszlopba a függvények (B2, majd lehúzni) - B2 feletti mezőt üresen kell hagyni!):
=IFERROR(MATCH(MAX($A$2:$A$23),OFFSET($A$2,B1,0,COUNTA($A$2:$A$23)-B1),0)+B1,"")
C oszlopba a függvények (C2):
=IFERROR(INDEX($A$2:$A$23,B2,1),"")
Ha a B oszlop fölé kötelező fejléc, akkor
B2:=MATCH(MAX($A$2:$A$18),$A$2:$A$18,0)
B3 (és ezt lehúzni az aljáig):
=IFERROR(MATCH(MAX($A$2:$A$23),OFFSET($A$2,B2,0,COUNTA($A$2:$A$23)-B2),0)+B2,"")
Megjegyzés - a B oszlopban a tömbben a relatív helyet adja vissza a függvény, nem a tényleges sort.
-
0P1
aktív tag
Igen, ez általában memory allocation hiba. (kifutsz a rendelkezésre álló RAM-ból)
Igen, az esetek 90%-ban lehet optimalizálni, ehhez persze látni kéne a problémás file-jaidat.Főleg a 32 bites excelt sújtja ez a probléma, 64-bittel általában orvosolható (vagyis enyhíthető -még akkor is, ha amúgy nem bővíted a RAM-ot)
A 32 bites excel ugyanis max 2 GB memóriát tud lekezelni (virtuális memóriával együtt), de valójában, már 1 Giga RAM használat alatt is elszállhat, 64 bitesen nincs ilyen korlát. Így még akkor is segíthet a 64 bit, ha amúgy kevés a RAM-od, még ha lassan is, de végrehajtja a dolgot, legalább nem fagy bele, mint a 32 bites.
De a legegészségesebb persze az lenne, ha optimalizálnál is, RAM-ot is bővítenél, és áttérnél 64 bitre
-
Pá
addikt
Jólvan, közben rájöttem, hogy solverrel meg tudom csinálni.
Ha esetleg van valakinek egyszerűbb vagy elegánsabb megoldása, azért kíváncsi vagyok.
szerk: viszont jó lenne, ha solverben be tudnám állítani, hogy csak X tizedesjeggyel dolgozzon, mert az is fontos lenne. Erre van esetleg mód? Globálisan excelben nem szeretném átállítani, csak ezen az egy dolgon kéne lekorlátozni.
-
sztanozs
veterán
Nem lehet közvetlenül HTTP Request-tel feltölteni?
-
Grodd
tag
Nem biztos, hogy nem lehet vele mit csinálni. Ez az enter nyomogatósdi eléggé röhejes
A legtöbb normális third party applikációnak (akár szerver, akár kliensoldali) van normális API-ja, kívülről elérhető programkönyvtárai, (library), amiknek az osztályai általában közvetlenül elérhetőek VBA-ból is. Bekapcsolni ezeket VBA--ban Tools menu -> References-ben tudod. Ha ez megvan, akkor simán meghívhatod VBA-ból az osztályok eljárásait (methods) , tulajdonságait (property), eseményeit (event),
Persze itt a támogatás kulcsfontosságú, hiába van meg az osztálykönyvtár, ha a support és a dokumentáció csapnivaló (nem egyszer futtottam bele ilyen problémába), és olyan az egész, mintha nem is létezne (sőt!!) , mert dokumentáció és support hiányában több mérnökórát kell beleölni az API "kitapasztalásába", mintha magunk lefejlesztenénk az egész API-t.
-
sztanozs
veterán
Ha sokat dolgozol cellákkal, akkor célszerű, ha nem közvetlenül Sheet.Cell vagy Sheet.Range-et piszkálod, hanem kimásolod az adatokat egy tömbbe, dolgozol rajtuk és a végén (ha változtattás rajta) visszamásolod.
Ezzel nagyságrendekkel gyorsíthatók a cella hozzáférést igénylő makrók (fél óra helyett akár fél perc alatt is lefut, tapasztalatból).Pl.
'értékek másolása cellákból tömbbe
'tömb címzés (1 to max_sor, 1 to max_oszlop)
Dim ertekek As Variant
ertekek = Sheet1.UsedRange.Value2
Dim sor As Long, oszlop As Long
For sor = 1 To UBound(ertekek, 1)
For oszlop = 1 To UBound(ertekek, 2)
'művelet az összes értéken
Next
Next
'visszaírás az eredeti területre
Sheet1.UsedRange.Value2 = ertekek -
Delila_1
veterán
Egyenként kell megadnod a feltételes formázást a különféle nagyságrendekhez, de ezt elég 1× bevinned a tartományra.
100-as nagyságrendnél nagyobbhoz a feltétel =A2>999, a forma ##0 " ezer" (a 0 után 1 db szóköz)
100 000-esnél nagyobbhoz =A2>999999, a forma ### ##0 " millió" (a 0 után 2 db szóköz)Figyeld meg, hogy a számfora utolsó tagja, a 0 után annyi szóköz van, ahányszor 1-1 hármas egység szerepel az eredeti értékben. Az idézőjelen belülre is tettem egy kezdő szóközt, az csak annyit csinál, hogy
123ezer helyett 123 ezer lesz a kiírás képe, nem írja rá a számra a nagyságrendet.
Új hozzászólás Aktív témák
Hirdetés
- HiFi műszaki szemmel - sztereó hangrendszerek
- Folyószámla, bankszámla, bankváltás, külföldi kártyahasználat
- Motoros topic
- Milyen videókártyát?
- Autós topik
- PlayStation 5
- Milyen asztali (teljes vagy fél-) gépet vegyek?
- Synology NAS
- Okos Otthon / Smart Home
- Elkészült és telepíthető az Android 16
- További aktív témák...
- BESZÁMÍTÁS! ASRock B85M Pro4 B85 chipset alaplap garanciával hibátlan működéssel
- AKCIÓ! ASUS B650M R5 7600X 64GB DDR5 1TB SSD RTX 3080Ti 12GB Be Quiet! Pure Base 500FX ASUS 1000W
- Konzol felvásárlás!! Nintendo Switch
- Asus Rog Strix G16
- LG 55B4 - 55" OLED - 4K 120Hz 1ms - NVIDIA G-Sync - FreeSync Premium - HDMI 2.1 - PS5 és Xbox Ready
Állásajánlatok
Cég: CAMERA-PRO Hungary Kft
Város: Budapest
Cég: PC Trade Systems Kft.
Város: Szeged