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.
Nekem sehogy sem akar sikerülni ez a makrós dolog. Már feladtam. Esetleg ha valaki tud segítsen! Egy cellára a kódom a következő:
Sub Szamol() ' ' Szamol Makró ' ' SolverOk SetCell:="$H$8", MaxMinVal:=2, ValueOf:="0", ByChange:="$G$8" SolverDelete CellRef:="$G$8", Relation:=3, FormulaText:="0,000001" SolverAdd CellRef:="$G$8", Relation:=3, FormulaText:="0,000001" SolverOk SetCell:="$H$8", MaxMinVal:=2, ValueOf:="0", ByChange:="$G$8" SolverSolve End Sub
A képlet amivel számol a H8 cellában van és a következő: ABS(1/GYÖK(G8)+2*LOG10(2,51/(C8*GYÖK(G8))+($B$3/$B$2)/3,71)) A H8 cella a célcella, a módosuló cella a G8, a korlátozó feltétel pedig, hogy G8>=0,00001. A számolás a 8. sortól a 61. sorig kellene elvégezni. A C oszlop értéke mindig az aktuális sorhoz tartozó értékek. Vagy, ha valakinek könnyebb akkor a file- t is elküldhetem.
Általánosságban a feladatod az optimumszámítás egyik szép alapfeladata az ún. hátizsák-probléma módosított változata.
Legyen az a vektor a számsorozatod, k a kívánt összeg, egy olyan x vektort kell keresned, ahol az xi-k 1 vagy 0 értéket vehetnek fel (attól függően, hogy az ai-t kiválasztjuk-e az összegzésben vagy nem), ekkor ax=k (a és x skaláris szorzata=k) egyenletet kell megoldanod.
Ha ezen még tovább kell finomítanod, akkor x vektorra további feltételeket kell megadnod pl.:
a. a legtöbb egymás utáni szám legyen kiválasztva
b. legkevesebb szám kiválasztásával érjed el a megoldást.
Erre pedig tökéletes a Solver.
Az ábrán sárga a számsorozat, zöld az x (ahol a megoldást kapod), a világoskék mező egy segédoszlop, amiben az van, ha egymás utániak vannak kiválasztva az aktuális érték eggyel nő, ha nem, lenullázódik). A szükséges képletek az ábráról leolvashatóak (a kívánt összeg 5).
"Note If you do not see Solver.xls in the Available References list, click Browse. In the Add Reference dialog box, locate and select the Solver.xla file, and then click Open. The Solver.xla file is typically found in the C:Program FilesMicrosoft OfficeOfficeLibrarySolver subfolder."
"A feljövő Vb ablakban a Tools references-ben solver.xls bejelölése szükséges lehet a makróhoz" Mondjátok meg nekem, vaksi vagyok, hogy ebben a listában nem látom a solver.xls szöveget, vagy nincs talán a gépemen telepítve?
Melyik lehet a hozzá tartozó fájl?
Segítsetek, szeretném kipróbálni, buherálni ezt a solver futtrató makrót.
Hát, ezt a módszeredet sikerült tovább vinnem, hogy kilistázza a számsorozatot is, amelyek összeadásra kerültek. OFSZET, INDIREKT, CÍM, HOL.VAN függvények összeágyazásával...
Csak hármat lehet. Legalábbis eddig nekem csak ennyit sikerült. :) No meg a megoldás is csak szomszédos értékekre működik. Csak gondoltam, mutatok egy másfélét. Bár egy kis továbbkombinálással még jó is lehet.
Persz, működik azok nélkül is, csak azért került bele, hogy ha kifut a SZUM intervallumma, akkor ez az üres " " cellákkal látható legyen, illetve ne zavarjon be az "összképbe"
Egy másik megoldás: Mondjuk az A1 cella tartalmazza a keresett összeget. Az A oszlop többi cellája pedig a sorozatot. Feltételes formázással az első (A2) cellára ki kell adni, hogy a függyvény (az első választó rubrika, ahol alapban a cella értéke található) legyen (A2+A1)=$A$1 és a formázásnál mondjuk a háttérszín legyen kék. Majd második feltételként pedig ugyanígy a függvény legyen (A2+A3)=$A$1 a háttérszín pegi akár ugyan az, mint az előbb. Ezután az ecsettel csak le kell másolni végig a cella formátumát addig, amíg a sorozat tart. Amennyiben két egymás utáni szám értéke megegyezik az A1 tartalmával, zöld háttéren lesznek láthatóak. Remélem, érthető.
Megtaláltam a neten: How to use the Microsoft Excel Solver functions in a VBA macro http://support.microsoft.com/kb/843304 A "Compile Error: Sub or Function not defined." megoldására:
Eszközök -Makró -Visual basic A Visal basic szerkesztőben Tools - References A listában a solver.xls-t kipipálni.
Igazából már a feladat számításos része megoldódott. Köszönet a sok segítségért mindenkinek. A problémám már csak a makró rögzítésével és megírásával van. A 4499-es hozzászólásomban már írtam gogy mi is a probléma. Azóta sem sikerül futtatható makrót gyártanom. Esetleg valaki otthon van a makrók terén?
Jobb mint az enyém. Mert nekem valszeg nem jutott volna eszembe az összeghossz DARAB függvényes beállítása. Még tán akkor sem, ha 200 hosszúságú sorozatot kellene elemeznem. Bár valszeg ez esetben valami komplikált vezérlést azért kieszeltem volna. Az INDEX függvényes kijelölést például, vagy a SOR-függvényest.
Itt már elhangzott a módszer. Először rögzíteni a kézzel végzett solverezést, majd a kapott makro kódot átszerkeszteni ( ciklusossá tenni, hogy ismételje meg egy egész oszlop mezőire, venni soron következő sort,y értéket ebből, átmásolni a makro eredeti y cellájáb aelvégezni a solverezést, átmásolni a kapott z értéket... Ezt kéne kódolni. A kézi solverezésnél tapasztalétam, hogy amikor átírtam kézzel az y-t, akkor egyből átíródott a z értéke, is pedig még nem indult el a szolverezés, (perzse helytelen z érték lett), ezzel csak az volt a probléma, hogy ha ez nem pozitív értékre íródott át, akkor képlethiba lépett fel és nem indult a solverezést, hát ilyenekre is figyelni kell, beírni egy pozitví értéket a z-re a solverezés előtt.
Szerinted én nem "többfutamosan" csináltam meg? :) De. Gagyinak gagyi de hibátlanul működik.A. oszlopban a számsorozat. B. oszloptól pedig SZUM-ok, ahol a számsorozat első két tagja van összeadva relatívan. =HA(DARAB(A2:A3)=B$1;SZUM(A2:A3);" ")Ezek oszlopcímeiben az a darabszám van megadva (a képletben a B$1), ami a az összeadott számok db-számát adja meg.Na. és ez a képlet van lehúzva. Következő "C" oszlopban meg már 3 számot ad össze - és így tovább egészen tíz számig.Ja persze csináltam egy kiemelt cellát, amibe a megkeresendő számot kell beírni - és feltételes formázással az imént leírt táblázatban az ezzel egyező értékek piros cellásak lesznek.ennyi.
Elküldtem a közelítő formulás megoldást a Re (y) = 1000 - 1e6 tartományra. Lehet persze más tartományokra is kiszámolni ilyen spline-os közelítést. Itt a ha() formula több cellára lett bontva, és az első oszlop,a küldött munkalapon a H-adja a z értékeket. A munkalapodon a z oszlopa mellé be kell szúrni annyi oszlopoit, amennyit a küldött képlet oszlopai igényelnek, id ebemáűsolni a képlet oszlopait, és utána el lehet rejteni annak oszlopait kivéve az elsőt. Ez a megoldás elég pontos, min. kb 3 tizedesig, ha jól emlékszem.
A solveres makrozás is egy lehetséges megoldás, de lehet hogy vannak buktatói. Megírni még nem olyan nehéz, de nem tudom milyen gyorsan futna sok értékre, meg lehetnek egyéb okok miatti leállások, amit a kézi solverezésnél tapasztaltam. De kiváncsi vagyok, ha valaki megírja, mert nekem az itthoni gépemen nincs telepítve a solver, és nincs cd-m.
Én úgy értettem a talált előadás anyagból , hogy van a tapasztalati(mérések alapján felvett) Moody diagram és ezt közelítgetik ilyen-olyan képlettet. Az egyik ilyen képletet próbáljuk itt tovább közelíteni, mert nem explicit alakú. Eleve ezek a képletek is hibát visznek be, és ennek közelítésével mi még további hibákat viszünk be. Az is egy lehetséges megoldás lenne, hogy egy ilyen diagramot digitalizálni, és közvetlenül erre pl. spline-os görbeillesztést számolni a számítógéppel.. Ilyesmit már láttam más területen, ott a digitlaizálás okozta hiba (görbevastagság...) nagyságrenddel kisebb volt mint magából a mérésből adódó hiba.
Nem előnyösebb. Én értelmeztem először félre a problémát, s ezért ajánlgattam. De már látom (megkaptam a táblát) a szolveres-egycellás értékszámítás a fő probléma. Sajna arra viszont én sem látok megoldást, hogyan lehet automatizálni a többi cellára annak a futását. De ha valaki tud megoldást -s bármire is- ne tartsa magába, ossza meg velem/velünk, mert ennek a topiknak abban látom az értelmét.
Írok pár szót erről a csőszrlódásról, hogy világosabb legyen. Először is van lamináris és turbulens áramlás. Az áramlás jellemzésére a Reynolds számot (Re) használják, ha Re<2320 akkor az áramlás lamináris. Lamináris áramlással a gyakorlatban nemigen foglalkozunk. A turbulens áramlásnál megkülönböztetünk olyat ahol a csövet hidraulikailag simának feltételezzük és olyat amit érdesnek. A sima cső szintén nemigen jellemző a gyakorlatban. Ami a gyakorlatra jellemző az a turbulens áramlás érdes csőben. A cső surlódását a csősurlódási tényező jellemzi (Lambda). Lambda pedig függ a cső átmérőjétől, a cső érdességétől és a Reynolds számtól. Röviden ennyi. A kérdés továbbra is a lambda kiszámításának megoldása a szolveres megoldás makrózásával.
Mert figyelmetlen (hülye) voltam, és a képlet másolásánál egy súlyos nagyságrendi tévedést vétettem. Így sajnos nagyobb a lefedendő z intervallum, tehát a javasolt módszem a 3 tizedes pontosságra csak viszonylag szükebb reynoldsok mellett müködne. Még szerencse, hogy találtál tammyboynak egy adekvátabb képletet.