Hirdetés
- Fűzzük össze a szavakat :)
- Airfryer XL XXL forrólevegős sütő gyakorlati tanácsok, ötletek, receptek
- eBay-es kütyük kis pénzért
- Asszociációs játék. :)
- Nagy "hülyétkapokazapróktól" topik
- Euro Truck Simulator 2 & American Truck Simulator 1 (esetleg 2 majd, ha lesz) :)
- Milyen mosógépet vegyek?
- Android másképp: Lineage OS és társai
- JBL Xtreme 4 vélemény (vs. BOSE)
- Szólánc.
-
LOGOUT.hu
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
-
Fferi50
Topikgazda
Szia!
Szerintem ezt csak a "külső" (valóban Excelen kívüli?) program ismeretében lehetne megválaszolni neked. Ha nem lehet publikussá tenni - az érzékeny adatok nélkül - akkor próbáld meg priviben átküldeni pár itteni fórumozónak (pl. Delila, Mutt, Lappy).
Továbbá érdemes lenne megkeresni a "külső" program fejlesztőjét és tőle kérni segítséget, hiszen ő tudja, mit hogyan fogad a programja.
Üdv, -
Fferi50
Topikgazda
Szia!
"Futás közben nem szabad a géphez nyúlni (semmihez!!!). mert ettől is begyorsul <alt> módjára és lőttek az eredményeknek."
Ez teljesen megdöbbentett, mert ilyet még nem tapasztaltam. (Gondolom van a programban DoEvents utasítás, ami ezt kiválthatja.)
Ami az eltérő eredményeket illeti: Nagy valószínűséggel a "többszintű" képletezés idézi elő.
Szerintem úgy lenne érdemes szervezni a programot, hogy egy-egy szint kiszámítása után folytatódjon a következő szint. Ezt a Calculation tulajdonsággal tudod szabályozni, nem automatikusra állítva, hanem kérésre és azután megfelelő időben a Calculate utasítást kiadva.
Aztán az sem mindegy futásidőt illetően, hogy vannak-e Volatile tulajdonságú függvények, mert ezek minden változáskor lefutnak - akkor is, ha nem a saját paramétereikben a változás! - tehát időt vesznek el a többi kárára.
Érdemes tehát a használt függvényeket is átmazsolázni.
Bővebbet és hasznosabbat csak a tényleges program ismeretében lehetne mondani. Nem érzékeny adatokkal felteszel egy mintát és ránézünk.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
Szia!
Az Alt billentyűről azért nem írtam, mert arról sem tudom elképzelni, hogy begyorsulást okozzon. (lehet, csak a képzelőerőm földszintes.....)
Többszintű képletezés alatt azt értem, hogy egyes képletek más képletek eredményeit használják fel - nem körkörös hivatkozásként, mert arra figyelmeztetne az Excel -, hanem bemenő adat egy képletnél egy másik képlet eredménye, emiatt nem tud normálisan kiszámítódni. Ezt meg lehet "kerülni", ha a képleteket egymásba építjük.
Egyébként természetes, hogy nagyméretű fájloknál időbe telik a képletek kiszámítása.
Elképzelhető, hogy amikor a gyorsítás miatt eltérő eredményeket kapsz, talán meg kellene próbálni a futás végén egy újabb számolást elindítani és utána megnézni a végeredményt.
Üdv. -
Fferi50
Topikgazda
Szia!
Sajnos látatlanban ennél többet nem nagyon tudunk segíteni.
A képleteknél előfordulhat, hogy az egyik képlet eredménye még nem számolódik ki, ezért a második képlet a régi - helytelen - bemenő adattal számol. Ezért lenne fontos a végére még legalább egy számolási utasítást beilleszteni szerintem.
Az Alt billentyű ilyen funkcióját még nem volt alkalmam tapasztalni - igaz nem is igen kerestem, a "gyorsításokat" más módon oldottam meg, ha szükséges volt.
Továbbra is azt javaslom, hogy mintát tegyél fel, amit elemezni tudunk, mivel itt nemcsak a makróra kell ránézni, hanem a képletezésre is jó lenne egy pillantást vetni. Az adatok akár maradhatnak is benne, csak a fejléceket és egyéb "árulkodó" megnevezéseket kellene átírni.
Ha nem szeretnéd nyilvánossá tenni, akkor elküldheted privátba, gondolom Delila is szívesen megkukkantaná, mert elég izgalmasak ezek a problémák.
Üdv. -
Fferi50
Topikgazda
Szia!
Amit ide írsz, az publikus, mindenki látja. De van Privát levelezési lehetőség is, azt csak a két fél látja. (Hozzászólás fejléc jobb oldali végén lenyílóban találod.)
Ha ilyen bonyolultságú a fájl, akkor azt privátban kell megoldani. Eskü, hogy vállalati titkokat nem adunk tovább - de ha kell írásos titoktartási nyilatkozatot is tudunk adni. De azt tudnod kell, hogy ilyen mélységű probléma megoldása csak a fájl ismeretében lehetséges.
Üdv. -
Fferi50
Topikgazda
-
Fferi50
Topikgazda
Szia!
Van némi gond azzal, amit leírtál. Először:
a függvényFunction CountCcolor(range_data As Range, CellaSzín1 As Range)
Azaz az első paraméter a vizsgálandó terület, a második a mintaszín cellája.
A hívásnál pedig ezt írod:CountCcolor(CellaSzín1;range_data)
azaz fordítva adod meg a paramétereket!
Másodszor:
Magába a függvénybe bekerült ez a sor:Set range_data = Application.Range("Munka1!O3183:S3284")
Ez tehát minden alkalommal felülír(ná) az általad megadott területet. A vizsgálandó terület ott van az első paraméterben, ez a sor káros. (Azért írtam feltételes módban, mert a hívásnál rosszul adod meg a paramétereket.)
Harmadszor:
Feltételes formázás esetén a cella interior.color színe marad az eredeti és nem a formázott. Ebben az esetben a Range.DisplayFormat tulajdonságát kell használni.If cel.DisplayFormat.Interior.Colorindex=xcolor
Negyedszer:
Mit értesz táblafüggvény alatt? A felhasználói függvény szintén VBA-ban íródik és ha jól látom akkor For Each -..... -Next ciklus van ebben is (ez is kell bele). Ez mitől is gyorsabb mint a VBA ciklus...
Üdv. -
Fferi50
Topikgazda
Szia!
"azt hittem mindegy a sorrend, hisz a VBA nevek szerint tudja azonosítani öket"
Ez igaz, de akkor másként kell meghívni a függvényt és csak VBA-ban működik, pl.CountCcolor CellaSzín1:=Range("A1"), range_data:=Range("X2:Z13")
Munkalapon nem lehet így meghívni. Ha nevet szeretnél használni, akkor a Képletek - Névkezelő menüpontban kell hozzárendelni neveket a kívánt tartományokhoz.
Ekkor viszont csak azokkal a tartományokkal fog működni - ha más tartományt szeretnél használni, akkor a nevet kell módosítani.
"ha pl. átlagot akarok számolni VBA-ban For-Next ciklussal nagyon-nagyon lassabb mint a beépített ÁTLAG() függvény"
Ez természetes, hiszen a beépített függvények gépi kódban futnak. Ezért is indokolt és célszerű az Excel beépített eszközeit használni, amikor csak lehetséges - VBA-ból is meghívva azokat.
"a Set sor azért került bele, mert később, sok-sok futás után VBA szinten módosítani (növelni) akarom a terület nagyságát. Ez gondolom felülírja az induláskor Excel táblán manuálisan beállított értékeket"
Igen, felülírja a meghíváskor megadott értéket - de mindig fixen arra, amit beírtál a makróba. A terület nagyság változtatását a makróhoz való hozzányúlás nélkül, a paraméter változtatásával tudod megoldani. (A terület paraméterhez pl.X2 : Y7 helyett X2 : AA72 kerül a meghíváskor.)
Azért vannak a paraméterek, hogy ne a (makró)függvényt kelljen módosítani, ha mást is szeretnél vele számoltatni.
Üdv.
Ps. Unokához gratula.[ Szerkesztve ]
-
Fferi50
Topikgazda
Szia!
Nemrég volt egy hasonló "házi" problémám, most "emlékeztettél" rá.
Sajnos úgy néz ki, hogy függvénnyel nem lehet megoldani a problémát, mert a DisplayFormat tulajdonságot ebben a formában nem tudja "megemészteni" a VBA.
Normál eljárással (SUB) megy, de akkor meg kell oldani a paraméter átadást.
Már későre jár, ezért inkább holnap folytatnám.
Üdv. -
Delila_1
veterán
Szerintem a feltételt kellene megadnod a ciklusban, ami színezi a cellákat.
Function FeltetelesDarabszam(Tartomany As Range)
Dim CV As Range, db As Integer
Application.Volatile
db = 0
For Each CV In Tartomany
If CV > 40 Then db = db + 1
Next CV
FeltetelesDarabszam = db
End FunctionProgramozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
Fferi50
Topikgazda
Szia!
Ha nem munkalap függvényként szeretnéd használni, akkor meg lehet oldani a megszámolást anélkül, hogy az eredeti feltételeket figyelni kellene.
Ahogy korábban írtam, ki kell jelölni a területet és a minta színt, ezután kell elindítani egy makrót.Sub CountCcolor1()
Dim cel As Range, cminta As Range, cter As Range,countcl As Long
Dim xcolor As Long
If Selection.Areas.Count <> 2 Then MsgBox "Nem megfelelő a terület kijelölése", vbCritical: Exit Sub
If Selection.Areas(1).Cells.Count = 1 Then
Set cminta = Selection.Areas(1): Set cter = Selection.Areas(2)
Else
Set cminta = Selection.Areas(2): Set cter = Selection.Areas(1)
End If
countcl = 0
xcolor = cminta.Interior.ColorIndex
For Each cel In cter.Cells
If cel.DisplayFormat.Interior.ColorIndex = xcolor Then
countcl = countcl + 1
End If
Next cel
MsgBox countcl
End Sub
Hogyan használható? Ki kell jelölnöd azt az összefüggő területet, ahol szeretnéd a színt összeszámolni. Ezután a CTRL nyomva tartásával ki kell hozzá jelölni a minta színt tartalmazó cellát - ami ne legyen a megszámolandó területen.
Ezután a Fejlesztőeszközök - Makrók menüpontban kiválasztod a CountColor1 -et és elindítod. Egy üzenetben kiírja a mintacella színének megfelelő cellák darabszámát.
Természetesen azt is meg lehet adni, hogy melyik cellába írja ki. Akkor az Msgbox sor helyett a Range("X3").Value=countcl sort kell beírnod - X3 helyett azt a címet, ahová szeretnéd az eredményt megkapni.
Megoldható továbbá az is, hogy egy vagy két cellába (ami mindig fix) beírjuk a vizsgálandó terület és a minta szín címét a makró futtatása előtt -- persze ahhoz módosítani kell a fenti makrót, de ez nem nagy probléma.
Amit Delila írt, az is megoldás, egy olyan makrót is lehet írni, ami megnézi, hogy a feltételes formázás feltételeinek melyik szín felel meg és azt a feltételt vizsgálja cellánként.
Erre még visszatérnék, csak azért írtam viszonylag gyorsan, hogy ne menjen el a kedved az egyébként hasznos feltételes formázás használatától.
Üdv. -
Fferi50
Topikgazda
Szia!
Ez a makró azt tudja, hogy az M1,N1 cellákba beírt címek alapján megszámolja a színek számát és kiírja az O1 cellába.Sub CountCcolor1()
Dim cel As Range, cminta As Range, cter As Range, countcl As Long
Dim xcolor As Long
Set cter = Range(Range("M1").Value)
If cter.Cells.Count = 1 Then
Set cminta = cter: Set cter = Range(Range("N1").Value)
Else
Set cminta = Range(Range("N1").Value)
End If
countcl = 0
xcolor = cminta.DisplayFormat.Interior.ColorIndex
For Each cel In cter.Cells
If cel.DisplayFormat.Interior.ColorIndex = xcolor Then
countcl = countcl + 1
End If
Next cel
Range("O1").Value = countcl
End Sub
Az M1-be kell a vizsgálandó terület címe (Pl. A1 : D5), az N1-be kell a mintacella címe (pl.K4), vagy fordítva, fontos, hogy a mintacella egy cella legyen.7
Természetesen mindhárom cella címét (M1, N1, O1) átírhatod a neked megfelelőre. Fontos még, hogy ezek a cellák azon a munkalapon legyenek, ahol számoltatni szeretnél és onnan indítsd a makrót - amit természetesen akár egy gombhoz is hozzárendelhetsz.
Üdv.
Üdv.[ Szerkesztve ]
-
Delila_1
veterán
A CV>40 csak egy példa a feltételre, amivel színezed a tartomány elemeit. Nyilván a saját feltételedet kell beírni helyette.
Az Application.Volatile sor eredménye, hogy ha a területen belül megváltoztatod egy cella értékét úgy, hogy feleljen (vagy ne feleljen) meg a feltételnek, akkor az eredmény is automatikusan módosuljon az új értékre.Programozó: hibás programok megírására és kijavítására kiképzett szakember. Többet ésszel, mint ész nélkül.
-
Fferi50
Topikgazda
Szia!
Mutatom a </> gombot:
És az eredménye:Function Poisson2(Feltétel2 As Range) As Long
Call kep_ki
Application.Volatile ’Prohardver Delila_1 nyomán
k = 0
Kezd = Cells(8, 7) 'Feltétel kezdete oszlop
Kezd5 = Kezd + 5 'Javasolt számok terület előtti oszlop száma
Kezd22 = Kezd + 22 'Feltételek a javaslat válogatásához
a = Cells(12, Kezd) 'A munkatábla kezdő előtti oszlop száma
Előford = Kezd + a 'K(i) táblázat kezdő előtti oszlop száma
Valószín = Előford + 90 'P(x=1) táblázat kezdő előtti oszlop száma
Várak = Valószín + 90 'n(i) táblázat kezdő előtti oszlop száma
Us = Cells(4, 7) + Cells(2, 7) 'Táblázat utolsó sora
Cikl = Cells(5, Előford + 1) 'A számolás kezdete sor
Cells(6, Előford + 1) = Cikl 'Ez lesz a Ciklusváltozó kezdete
Range(Cells(Cikl + 1, Kezd + 1), Cells(Us, Kezd + 15)).ClearContents 'számítása sorok törlése
Range(Cells(Cikl, Előford + 1), Cells(Us, Valószín)).ClearContents 'K(i) táblázat törlése
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'Feltételek
Range("AF11:AJ11").Value = Range("AF4:AJ4").Value 'Manuális számítás
'Calculate 'A munkalapfüggvények számolása
For Cikl = Cells(6, Előford + 1) To Us 'Az utolsó + 1-ig
'1. : 'Az n(i-1) és az előző ciklusban kitörölt képletek újrafelépítése a Tartalék raktárcellából BF14
Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value = _
Range(Cells(Cikl - 1, Várak + 1), Cells(Cikl - 1, Várak + 90)).Value 'Az n(i-1) sor feltöltése
Cells(14, Előford + 1).Formula = Cells(14, Kezd + 49).Formula 'Képlet
Cells(14, Előford + 1).Select 'Kijelölés kitöltéshez
Selection.AutoFill Destination:=Range(Cells(14, Előford + 1), Cells(14, Valószín)), Type:=xlFillDefault
'[P(x=1) 13-dik sor]
For i = 1 To 5
For j = 1 To 90
Calculate 'A munkalapfüggvények kiszámolják a 14-dik
If Cells(13, Előford + j) <= Cells(11, Kezd22 + i) _
And Cells(14, Előford + j) Then
For k = 1 To 5
If Cells(14, Előford + j) = Cells(Cikl, Kezd5 + k) Then GoTo Köv
Next k
Cells(Cikl, Kezd5 + Cells(17, Kezd5 + i)) = Cells(14, Előford + j)
Cells(Cikl, Kezd + 10 + Cells(17, Kezd5 + i)) = Cells(13, Előford + j)
Cells(14, Előford + j) = ""
j = 90
End If
Köv: Next j
Next i
'2.
Cells(6, Előford + 1) = Cikl
'Calculate 'A munkalapfüggvények számolása
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Kezd + j) = Cells(12, Előford + Cells(Cikl, 3 + j))
Next j
Else
End If
'Calculate 'A munkalapfüggvények számolása
Range(Cells(Cikl, Előford + 1), Cells(Cikl, Valószín)).Value _
= Range(Cells(Cikl - 1, Előford + 1), Cells(Cikl - 1, Valószín)).Value
For j = 1 To 90
Cells(8, Előford + j) = Cells(8, Előford + j) + 1 'n(i) cellasor munkatáblában(i) cellasor
Next j
If Cells(Cikl, 4) Then
For j = 1 To 5
Cells(Cikl, Előford + Cells(Cikl, 3 + j)) _
= Cells(Cikl, Előford + Cells(Cikl, 3 + j)) + 1
Cells(8, Előford + Cells(Cikl, 3 + j)) = 0 'n(i) cellasor
Next j
End If
'Calculate
Range(Cells(Cikl, Valószín + 1), Cells(Cikl, Várak)).Value _
= Range(Cells(12, Előford + 1), Cells(12, Valószín)).Value
Range(Cells(Cikl, Várak + 1), Cells(Cikl, Várak + 90)).Value _
= Range(Cells(8, Előford + 1), Cells(8, Valószín)).Value
Next Cikl
Call CountCcolor 'Prohardver nyomám Színes cellák számolása**** Modul3 lapon
Poisson2 = WorksheetFunction.Sum(Range("O14:S14")) 'Solver Célcella
Call kep_be
End Function
Amint látod, sokkal olvashatóbb.
Érdekes lenne még az a munkalap, amin futtatod ezt a makrót. Legalább egy kép a használt területről.
Üdv.[ Szerkesztve ]
-
Fferi50
Topikgazda
Szia!
mi az a privi?
Privát üzenet - amit csak te látsz a belépés után a levél ikonra kattintva.
Tehát NEM tudja végrehajtani a cellába írást?
Nem feltétlenül ott van a hiba, amit nem hajt végre. Máshol is lehet.
Nézd meg a privát üzeneted légy szíves.
Üdv.
Ps. Bocs, de itt általában tegeződünk... kortól és nemtől függetlenül. És ez nem a tiszteletlenség jele, sőt. -
Mutt
senior tag
Szia,
A kód elején a Kezd = Cells(8, 7) rész azt mondja, hogy a G8-as cellában lévő érték legyen a Kezd változó induló értéke, de ahogy a minta képből kivehető az a cella üres, így a Kezd-nek nem lesz értéke és ez el kihat a többi változóra is.
Kell egy ellenőrzés hogy üres/nem számot tartalmazó esetben mi történjen.
pl.If IsEmpty(Kezd) Or Not IsNumeric(Kezd) Then Kezd = 1
üdv.
Ps.
Furcsa, hogy az UDF-ben megadsz egy vizsgálandó tartományt (Feltétel2) de azt nem használod fel sehol.A tanácsaimat ingyen adom. Ha nem tetszik, akkor kérlek ne kritizáld! / https://github.com/viszi/codes/tree/master/Excel
-
Fferi50
Topikgazda
Szia!
Annyi minden van azon a munkalapon a kép alapján, hogy (számomra legalábbis) lehetetlen reprodukálni, hiszen nem látszanak, hogy itt-ott milyen függvények vannak még, stb.
Ezért kértem, hogy tegyél elérhetővé egy mintafájlt, ne várd el, hogy kitaláljuk, hova - mit helyeztél el.
Mivel leginkább számok vannak, talán még hadititkot sem sértesz a közreadással.
A megnevezések stb. megadhatóak "álnévvel" is. Csak a számítások megértéséhez szükségesek legyenek jók.
Üdv -
Fferi50
Topikgazda
Szia!
Még valami jutott eszembe:
AzApplication.Volatile
utasítás az elején. Azt jelenti, hogy valahányszor változik egy cella értéke, a függvény újraszámol(ná) az értékét. Ez okozhat gondokat, hiszen elég sok helyen változtatsz cellaértékeket.
Én kivenném ezt az utasítást az elejéről.
Üdv.[ Szerkesztve ]
-
Pakliman
tag
Szia!
Csak a kérdés elkerülésére van tippem (a CSV-vel nem foglalkoztam):
sFileName = "C:\...\Vesszővel tagolt" & sz & Cikl & ".csv"
If Dir(sFileName) <> "" Then Kill sFileName
ActiveWorkbook.SaveAs Filename:=sFileName, FileFormat:=xlCSVUTF8, CreateBackup:=False[ Szerkesztve ]
-
Fferi50
Topikgazda
Szia!
Tapasztalatom alapján a következőt javaslom:
Nem kell az adatokat az A oszlopba összevonni! A makróval csv-be mentés "magától" megcsinálja a vesszővel tagolt fájlt. Így megspórolhatod az összemásolás műveletét.
Elég, ha az adott munkalapot átmásolod egy új munkafüzetbe és mented az újat, majd bezárod.
A rákérdezést az
Application.DisplayAlerts=False
sorral tudod elkerülni.
Vagyis nagyjából így nézhetne ki a makród ezen része:Sheets("… Adatsor").Copy '(az eredeti, oszlopokban adatot tartalmazó munkalap másolása új munkafüzetbe - ezután ez a munkafüzet lesz az aktív.
Application.DisplayAlerts=False
ActiveWorkbook.SaveAs Filename:= _
"C:\...\Vesszővel tagolt" & sz & Cikl & ".csv", FileFormat:=xlCSVUTF8, CreateBackup:=False
ActiveWorkbook.Close False ' további mentés nélkül bezárjuk az új munkafüzetet, ismét az eredeti lesz aktív
Application.DisplayAlerts=True ' ha a figyelmeztetéseket látni szeretnédÜdv.
Ps. persze a mentéshez szükséges változóknak értéket kell adnod itt is előzetesen. -
Fferi50
Topikgazda
Szia!
A hibaüzenet kimaradt a bejegyzésedből.
A leírásból azt látom, hogy továbbra is ragaszkodsz az A oszlopba gyűjtéshez. Ezt el kellene felejteni szerintem.
Egyébiránt jó lenne, ha a teljes makrót láthatnánk, esetleg egy példafájlt (nem érzékeny adatokkal), amiben megjelölnéd, hogy mi legyen a CSV fájlban.
Üdv. -
Fferi50
Topikgazda
Szia!
Bocs, nem vettem észre az oszl+6 paramétert. (Csőlátás )
A tartományok (Range) kijelölésénél pontosan kell meghivatkozni a munkalapot. Ezért az alábbi formát javaslom:With Sheets("Adatsor")
Range(Cells(1, 1), Cells(1, 6)).Value = _
.Range(.Cells(1, oszl + 1), .Cells(1, oszl + 6)).Value
End With
Ha egymás utáni sorokban vannak az adatok, akkor azt egyben is másolhatod.
"Fontos, hogy az adatok tagolása ne pontosvessző legyen, hanem sima vessző, "
A CSV fájl azt fogja csinálni.
Üdv.
Új hozzászólás Aktív témák
Hirdetés
Állásajánlatok
Cég: HC Pointer Kft.
Város: Pécs
Cég: PCMENTOR SZERVIZ KFT.
Város: Budapest