Keresés

Részletes keresés

tbando Creative Commons License 2013.11.22 0 0 23125

Érdekes ez a LIN.ILL-es megoldás. De nálam nem működik (2007-es). Nem csak a te polinomialis problémádnál, de már az excel súgó mintapéldájánál sem, pedig azt copy-paste-tal  vittem be. De csak #ÉRTÉK hibákat ereményezett. A te képletedben a kitevők kapcsos zárójelét hogy kell beírni?  Billentyúzéssel?  Meg azt sem értem minek kell transzponálni?

 

Ja és még valami! A felrakott polielo függvényemben maradt egy sajnálatos hiba, ezért a jelenlegi formájában csak a negyedfoku polinomot számolja ki. A javítása elég egyszerű. Az állandó kiszámításánál (9. pont) A For i=1 to 4 helyesen: For i=1 to fok.

 

Előzmény: NPW (23122)
tbando Creative Commons License 2013.11.22 0 0 23124

Hát bár úgy néz ki, hogy igazad van,  de a feltett udf-ben valami speiális probléma lehet Ugyanis a  

 

'bisvekt = Application.WorksheetFunction.MMult(xikorrmtx, ykorrvekt) utasítás S4O1=S4O4*S4O1 szerkezetű aminek müködni kéne, de nem müködik,

 

míg a bisvekt = Application.WorksheetFunction.MMult(ykorrvekt, xikorrmtx) pedig   S4O1=S4O1*S4O4 szerkezet, aminek nem lenne szabad müködnie, és mégis müködik.  ????

 

A matrix is és a vektor is For next-tel lett feltöltve. 

 

***********

 

Javasoltad a tanspose-t. De nem megy. A vba tömbök transponálásának mi a szintaktikája?  

Előzmény: Fferi50 (23123)
Fferi50 Creative Commons License 2013.11.21 0 0 23123

Szia!

 

A titok nyitja a mátrix algebrában van!

"Csak"  annyi a probléma a matrix szorzásnál, hogy a matrix műveleteknél nem mindegy balról vagy jobbról szorzod a mátrixokat!

Hogy ismét az Excel helpet idézzem:

"A tömb1 oszlopai számának egyeznie kell a tömb 2 sorainak számával és mindkét tömb csak számokból állhat."

 

Az első esetben a 4S*4O mátrix szorozható az 4S*1O mátrixxal (eredmény 4S*1O), de az 4S*1O mátrix nem szorozható a 4S*4O matrixxal.

 

A második esetben szintén arról van szó,hogy a két egy oszlopból álló mátrix (azaz vektor) nem szorozható direktben össze. A szorzáshoz a második mátrixot transzponálni kell (Transpose függvény!) és akkor kapsz egy egy elemű mátrixot (skalárt) eredményül.

 

Üdv.

Előzmény: tbando (23121)
NPW Creative Commons License 2013.11.21 0 0 23122

Köszi!

 

Közben kutakodtam én is tovább, és azt hiszem, egy ausztrál honlap meghozta az ihletet.

 

A nyerő képlet:

 

{=LIN.ILL(TRANSZPONÁLÁS(y adatsor);TRANSZPONÁLÁS(x adatsor)^{1.2.3})}

 

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.

Előzmény: tbando (23121)
tbando Creative Commons License 2013.11.21 0 0 23121

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.

 

 

**********

Option Explicit
Option Base 1

****************

 

Function polielo(a, b, c, d)

 

Dim wsac&, x#(), y#(), xy(), tmb1(), tmb2(), xkorrmtx(), xikorrmtx(), ykorrvekt(), kovarvekt(), bisvekt(), bivekt(), xavgvekt()
Dim fok%, i%, j%, k&, sumi#, Ykovar#, Yavg#, allando#

 

'1 adatbevitel és Redimek
fok = d
wsac = b.Rows.Count
ReDim x(wsac), y(wsac), xy(wsac, 2), tmb1(wsac), tmb2(wsac), xkorrmtx(fok, fok), xikorrmtx(fok, fok), ykorrvekt(fok), kovarvekt(fok)
ReDim bisvekt(fok), bivekt(fok), xavgvekt(fok)


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

 

''3 xikorrmtx (inverzR) kiszamitasa

 

xikorrmtx = Application.WorksheetFunction.MInverse(xkorrmtx)

 

''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ú

 

bisvekt = Application.WorksheetFunction.MMult(ykorrvekt, xikorrmtx)

 

''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

 

polielo = sumi + allando

 

End Function

 

Előzmény: NPW (23105)
tbando Creative Commons License 2013.11.21 0 0 23120

Neked is köszönöm Feri! Az ilyen magyarázatok, sokat segítenek. 

Előzmény: Fferi50 (23118)
Fferi50 Creative Commons License 2013.11.21 0 0 23119

Szia!

 

Még egy kiegészítés: Ha hibakezelési részt is írsz bele, akkor megkapod az 1004 Application defined errort.

 

Üdv.

Előzmény: tbando (23115)
Fferi50 Creative Commons License 2013.11.21 0 0 23118

Szia!

 

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.

 

Üdv.

Előzmény: tbando (23115)
tbando Creative Commons License 2013.11.21 0 0 23117

Kösz Jimmy! Így utólag belegondolva, logikus. 

Előzmény: Törölt nick (23116)
Törölt nick Creative Commons License 2013.11.20 0 0 23116

Vannak dolgok, amiket egy UDF nem hajlandó megcsinálni. Többek közt ilyen a munkalap módosítása. Ne is erőlködj vele.

 

http://www.ozgrid.com/Excel/free-training/ExcelVBA1/excelvba1lesson21.htm

 

Első pár bekezdés.

Előzmény: tbando (23115)
tbando Creative Commons License 2013.11.20 0 0 23115

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

***********

 

Sub makro1()

makro2 0

End Sub

 

***************

 

Sub makro2(flag)

Set wsa = ActiveSheet: Set wsp = Sheets("Munka2")

If flag = 0 Then Set wsaa = Selection

wsaa.Copy

wsp.Range("d11").PasteSpecial xlPasteValues

wsp.Range("f11").Formula = "=a11 = d11"

End Sub

*************

 

Function fgv(x, adatok)

Set wsaa = adatok

wsaacim = wsaa.Address

wsaasor = wsaa.Rows.Count

''wsaa.Copy ActiveSheet.Range("e11")

''ActiveSheet.Range("e11") = wsaa

makro2  1

fgv = 4

End Function

***************

 

A munkafüzetetet felraktam a Data.hu-ra is.

Letöltőlink :

http://data.hu/get/7145608/excel_makro-vs-fgv.xlsm

 

Előzmény: forzajuve (23114)
forzajuve Creative Commons License 2013.11.20 0 0 23114

Kimásolod, és Irányított beillesztés, értéket.

Előzmény: szgaborgabor (23113)
szgaborgabor Creative Commons License 2013.11.20 0 0 23113

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

Előzmény: forzajuve (23112)
forzajuve Creative Commons License 2013.11.20 0 0 23112

Hát ez nem átnevezés, de egy másik cellába össze tudod fűzni a 001-et és a .JPG-t az & segítségével. Tehát pl. A3=A1&A2, ahol A1=001, A2=.JPG

Előzmény: szgaborgabor (23111)
szgaborgabor Creative Commons License 2013.11.20 0 0 23111

Sziasztok

 

A következő lenne a gondom:

2013-as excelben kellene megcsinálni, hogy adott egy oszlop és abban az összes cellát át kellene nevezni.

 

Így néz ki most 

001

002

003

 

És ilyenre kellene 

001.JPG

002.JPG

003.JPG

 

Tehát mindegyik után utána kellene fűzni a .JPG-t tömegesen.

 

Mi erre a megoldás?

Köszi

pimre Creative Commons License 2013.11.20 0 0 23110

Köszönöm, értem. Akkor ezentúl számítok rá.

Előzmény: Törölt nick (23108)
Törölt nick Creative Commons License 2013.11.20 0 0 23109

Most nézem, hogy ezt a spanyolviaszt már feltalálták előttem :-|

Előzmény: Törölt nick (23107)
Törölt nick Creative Commons License 2013.11.20 0 0 23108

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.)

Előzmény: pimre (23106)
Törölt nick Creative Commons License 2013.11.20 0 0 23107

Van azért egy lehetőség, csak kicsit komplikált.

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.

Előzmény: NPW (23105)
pimre Creative Commons License 2013.11.20 0 0 23106

É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.

Előzmény: pimre (23102)
NPW Creative Commons License 2013.11.19 0 0 23105

Először is köszönöm a fáradozásaidat. :-)

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...

Előzmény: tbando (23103)
NPW Creative Commons License 2013.11.19 0 0 23104

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)?

Előzmény: Fferi50 (23084)
tbando Creative Commons License 2013.11.19 0 0 23103

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?

 

Előzmény: Törölt nick (23098)
pimre Creative Commons License 2013.11.19 0 0 23102

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

print application.sum(-1,-14999,-2419.24,1,14999,2419.24)

képlettel, és az eredmény: 1.81898940354586E-12 lett.

 

Azután megpróbáltam egyszerűen összeadni: print -1+-14999+-2419.24+1+14999+2419.24 képlettel, és az eredmény 0 lett?

 

Hogy van ez?

Előzmény: Delila10 (23101)
Delila10 Creative Commons License 2013.11.19 0 0 23101

:))

Előzmény: Fferi50 (23100)
Fferi50 Creative Commons License 2013.11.19 0 0 23100

Szia!

 

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....

 

Ugyanez igaz SK-ra nézve is.

 

Üdv.

Előzmény: Delila10 (23097)
forzajuve Creative Commons License 2013.11.19 0 0 23099

Sziasztok!

 

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?

 

köszi

Törölt nick Creative Commons License 2013.11.19 0 0 23098

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...

Előzmény: tbando (23096)
Delila10 Creative Commons License 2013.11.19 0 0 23097

Én is kaptam 2 levelet. Mivel mindegyikhez csatoltál 1-1 Próba.xlsx nevű üres füzetet, gondolom, a próba a küldésre vonatkozik.

 

Sikerült. :)

Előzmény: Fferi50 (23092)
tbando Creative Commons License 2013.11.19 0 0 23096

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.   

Előzmény: pimre (23095)

Ha kedveled azért, ha nem azért nyomj egy lájkot a Fórumért!