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.
Ez kiadja a harmadfokú egyenlet kitevőit, amivel megkereshető az új x-hez tartozó y.
Viszont ennek kapcsán 2 további érdekességre bukkantam.
1/Ez csak 2007-es Excelnél működött (itthon ilyen van), 2010-essel valamiért nem (munkahelyen olyan van). Tudja valaki, mi lehet az oka? (ja és az utolsó mátrix 2010-ben: {123}
2/A képlet csak akkor működik, ha minden x és y érték megvan. Ugyanakkor ha kitörlök néhány x-et vagy y-t, akkor a grafikonon megjelenő egyenlet továbbra is működik. Kiváncsi lennék, ott hogyan számolnak.
Bár Jimmy szenzációs makrójával a diagramról is le tudod venni polinomialis egyenletet, úgy gondoltam, hogy ha már belekezdtem, be is fejezem a polinomialis illesztes makrósítását. Sokat tanultam közben. Neked meg felteszem ide a polinomialis összefüggés forecast fuggvényét polielo() néven.
=polielo(a,b,c,d), ahol
a: x, aminek a párját keresed
b: x adatok tartománya
c: y adatok tartománya
d: a polinomiális egyenlet foka
Fontos: A függvény moduljat Option Base 1-re állitsd.
A függvényt az Immediate ablakban ellenőrizheted, mert oda beírja az együtthatókat és az állandót, így azokat összevetheted a diagramon szereplőkkel.
A makróban van 2 kikommentelt piros sor is. Matrixmüveletek amik nem müködtek. Hátha lesz itt valaki olyan okos, aki meg tudja magyarázni, hogy mi velük a probléma.
For i = 1 To wsac ''wsac: adatparok szama x(i) = b(i) y(i) = c(i) Next i
''2.xkorrmtx kitoltese For i = 1 To fok For j = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = x(k) ^ j Next k xkorrmtx(i, j) = Application.WorksheetFunction.Correl(tmb1, tmb2) Next j Next i
''4 ykorrvekt kitoltese For i = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = y(k) Next k ykorrvekt(i) = Application.WorksheetFunction.Correl(tmb1, tmb2) Next i
''5 bisvekt (bi standardizalt regrkoef) kiszamitasa
''bisvekt = Application.WorksheetFunction.MMult(xikorrmtx, ykorrvekt) EZ MIÉRT NEM MÜKÖDIK, ha az alatta levő igen. Az xkorrvekt(4), a xikorrmtx(4,4) dimenzójú
''5 kovarvekt es Ykovar For i = 1 To fok For k = 1 To wsac tmb1(k) = x(k) ^ i tmb2(k) = x(k) ^ i Next k kovarvekt(i) = Application.WorksheetFunction.Covar(tmb1, tmb2) Next i
For k = 1 To wsac tmb1(k) = y(k) tmb2(k) = y(k) Next k Ykovar = Application.WorksheetFunction.Covar(tmb1, tmb2)
''6 kovarvektor módosítasa For i = 1 To fok kovarvekt(i) = (Ykovar / kovarvekt(i)) ^ (1 / 2) Next i
''7 bivektor (polinomialis regr. koeff) For i = 1 To fok bivekt(i) = bisvekt(i) * kovarvekt(i) Debug.Print bivekt(i) Next i
''8 xavgvekt és Yavg
For i = 1 To fok sumi = 0 For k = 1 To wsac sumi = sumi + x(k) ^ i Next k xavgvekt(i) = sumi / wsac Next i
sumi = 0 For k = 1 To wsac sumi = sumi + y(k) Next k Yavg = sumi / wsac
''9 allando ''allando = Application.WorksheetFunction.MMult(xavgvekt, bivekt). MIERT NEM MUXIK ???? Kénytelen voltam For-next-tel kiváltani. Mindkét vektor 4 elemű. sumi = 0 For i = 1 To 4 sumi = sumi + xavgvekt(i) * bivekt(i) Next i allando = Yavg - sumi
Debug.Print allando
'' 10 elorejelzes sumi = 0 For i = 1 To fok sumi = sumi + bivekt(i) * a ^ i Next i
Amíg az Excel "szerkesztés" üzemmódban van, nem lehet megváltoztatni makróval a munkalap tartalmát. Márpedig a függvény beírásakor szerkesztés feliratot látsz a statusbaron. Ha csinálsz egy kis próbát a worksheet change eseménnyel, kiderül, hogy az csak akkor kezd lefutni, ha már a függvényed lefutott.
Ilyen esetben még a VBA szerkesztő sem működik. Én már többször jártam úgy, hogy egy munkalapon belekattintottam egy cellába, majd utána átváltottam VBA-ra és az "istennek" sem akarta bevenni, amit írni szerettem volna.
Tisztára hülyét kaptam excel udf készítéskor. Segítséget kérnék, mert anélkül hamarosan begolyózok. Az alábbi 3 makró közül a makro2 a makró1-ből indítva gond nélkül lefut. Azaz a kijelölt Munka1!A11:B28 tartományt szépen másoja.
A másolandó tartományt azonban fgv-nyel kijelölve krach.
A Munka1!B30-ban levő függvény csak az első 3 lépést hajtja végre normálisan, a többit nem
A kikommentelt Copy bekapcsolva sem másol
A bekapcsolt wsaa értékadás sem müködik, ráadásul a makró futását is leállítja
A kikommentelt wsaa esetén a makro2-t ugyan meghívja, de nem hajtja vége az abban előírt másolást, és nem lép vissza a fgvmakróba.
Hogyan van ez?
**************
Option Explicit
Dim wsp As Worksheet, wsa As Worksheet, wsaa As Range, wsaacim$, wsaasor
köszi, ez jónak tűnik elsőre, DE az a bajom már csak vele, hogy függvényként menti el.
ezt a fájlt fel kellene töltenem aztán máshova, viszont így, hogy függvényként van, így nem tudja értelmezni, mert azt látja hogy =A1$B1, nekem meg az kéne hogy 001.JPG legyen.
Ha arra nyomok, hogy szövegként illessze be, akkor viszont leveszi a .JPG-t
Ha megfigyeled, a 1,81898940354586E-12 az kísértetiesen egyezik 2-39 értékével.
Valószínűleg a lebegőpontos számábrázolás törtrészének legeslegutolsó bitjében van az eltérés. Nem hiszem, hogy ez kerekítési hiba lenne, hanem inkább konverziós. Nem tudom, pontosan mi van a háttérben, de rémlik valami, hogy az op. rendszer minden számot először 32 vagy 64 bites egésszé konvertál, és csak utána tud vele dolgozni. Aztán az eredményt visszakonvertálja az eredeti típusba. Ez a probléma nem VBA eredető, és nem is korlátozódik erre a programnyelvre. A kerekítésnél jobb megoldást én sem találtam még. (Ettől még lehet, hogy van.)
A trendvonal egyenletét programmal is le lehet olvasni a diagramról, és azt némi sztring-bűvészkedéssel vissza lehet fejteni. Pl.:
Sub Polinom() Dim ch As ChartObject, Képlet As String Dim Együtthatók_száma As Long, Együtthatók() As Double Dim s As String, pos As Long
Set ch = Worksheets("Munka1").ChartObjects("Diagram 1") With ch.Chart.SeriesCollection(1).Trendlines(1) .DisplayEquation = True .DisplayRSquared = False Képlet = .DataLabel.Text End With Együtthatók_száma = 0 ReDim Együtthatók(Együtthatók_száma) Do s = Trim(Mid(Képlet, InStrRev(Képlet, " "))) Együtthatók(UBound(Együtthatók)) = s If InStr(Képlet, "x") = 0 Then Exit Do pos = InStrRev(Képlet, "x") Képlet = Left(Képlet, pos - 1) Debug.Print Képlet Együtthatók_száma = Együtthatók_száma + 1 ReDim Preserve Együtthatók(Együtthatók_száma) Loop End Sub
A piros sort azért emeltem ki, mert lényeges, hogy az R-négyzetet ne jelenjen meg a diagramon (vagy legalább ideiglenesen tűnjön el). Ellenkező esetben az is benne lesz a leolvasott képletben, és félreviszi az együtthatók visszafejtésének algoritmusát.
És még kiegészítésül kérdezem, hogy mi a helyes megoldása a problémának? Egyelőre azt tettem, hogy összegzéskor, minden egyes új adat hozzáadásakor az eredményt 10 számjegyre kerekítettem. Talán többre is lehetett volna, ha nagyobb számaim lennének, de az adott példában megfelelt, ez is. Viszont nem hiszem, hogy valóban ez a megfelelő megoldás a kerekítési pontatlanság kivédésére.
Ez az egész azért volt zavaró, és azért derült ki, mert a program egy bizonyos pontján teszteltem, hogy az adott összeg 0-e, és csodálkozva láttam, hogy a program néha nem hajtja végre azt a feladatot, amit a nulla összegű tételeknél meg kellene tennie.
Valóban körbe néztem a neten, és a legértelmesebb tanács, amit találtam, az volt, hogy rajzoltassam meg a trendvonalat, és másoljam ki az x együtthatóit.
De rejtély, hogy miért nincs alapból egy ilyen függvény az excelben, amikor a grafikon trendvonala akár a 6-od fokú polinomot is kiszámolja???
(Ha én írtam volna az Excelt, akkor az ELŐREJELZÉS függvény egy ELŐRJELZÉS.POLINOM lenne, egy új argumentummal, ahová beírom a polinom fokszámát. :-) )
Hogy milyen trendekre van szó? Ha ez ember egy elnyújtott N betűre gondolunk: egyszer fel, egyszer le, egyszer fel...
Elolvastam, köszi, de őszintén szóla nem értem, nagyon pongyolán van megfogalmazva... :-(
Az még hagyján, hogy felcseréli az x/y értéksorokat a lenti példához képest, de hogy lehet trendet számolni B-D és A között (úgy, hogy az működjön is)?
Ezt inkább NPW-tól kellett volna megkérdezned. Ő akar polinomiális összefüggés alapján előrejelzéseket készíteni. Ezek értelmességéről a véleményem teljesen megegyezik a tieddel. Írtam is NPW-nek lejjebb. Én csak az ő kérdésére/kérésére bonyódtam bele ebbe a problémába. És ha már belekezdtem, valahogy végigviszem. A terveim szerint hamarosan meglesz a polinomiális függvények előrejelzésére alkalmas udf. Aztán hogy ez mennyire hasznos, az már legyen NPW gondja. Egyébként utána néztem a neten, nincs egyedül. De a többiek is csak olyan tanácsokat kaptak, hogy a diagramról manuálisan vegyék le az együtthatókat. És szerintem ez az igazán érdekes ebben a problémában. Hogy mi lehet a magyarázata annak, hogy az excel kiszámítja az együtthatókat, hozzáférhetővé is teszi őket, de megnehezíti az elérhetőségüket? Szerinted?
Egy újabb meglepetés: Programciklusban összegzem a következő számokat: -1,-14999,-2419.24, 1, 14999, 2419.24. A változók, amibe olvasom, és amibe összegzem egyaránt double típusúak.
Az eredmény 0 kellene, hogy legyen, erre a program 1.81899E-12 értéket hoz ki.
Kipróbáltam az összegzést az immediate képernyőn a
Elég régen próbáltam már küldeni, de úgy látszik a Windows Live "tartalékolta" és most egy szuszra kinyomta az összes eddig el nem küldött levelet - amit egyébként én már el is felejtettem -, biztos nagyon megörült, hogy végre el tudta érni a gmail-es fiókomat....
Van szerintetek valami egyszerű módja, hogy az excel A oszlopában található adatokat beillesszem egy sima netes űrlapba? Vagyis, hogy minden cella után valahogy automatikusan "nyomjon" egy TAB-ot?
Csak kíváncsiságból: milyen természetes folyamat írható le harmad- vagy magasabb fokú polinommal? Én viszonylag sok függvényt illesztettem már, de magasfokú polinomot csak szórakozásból. Van bennem némi kétség, hogy ezek felhasználhatók-e egyáltalán előrejelzésre...
A lineáris trenddel nincs probléma, mert annak a paraméterei a munkalapról is elérhetők. De a többi trendtípusé csak a diagramra kerülnek rá, tehát ha tovább akarsz velük számolni, be kell pötyögni őket, már amennyiben nem tudod őket linearizálni. Márpedig egyre inkább úgy látom, hogy a polinomiálisakat a többtaguságuk miatt nem lehet. Igy marad a pötyögés, vagy a makró és az udf.
Valahol a trendlines method környékén érdemes keresni a helpben. Egyébként bő két éve készítettem programból grafikonokat. Azokra ráírattam a programmal az egyenletet is. Igaz, csak lineáris trenddel foglalkoztam. Nagyon sok grafikon volt egy-egy munkalapon, ezért kellett a program. A lényeg, hogy teljesen automatizálni tudtam.
Csak annyira összetett volt a feladat, hogy hosszabb idő kellene az előbányászásukhoz.