Kasper Okkels <okkels@wanadoo.dk> wrote:
> "Allan Olesen" <aolesen@post3.tele.dk> skrev i en meddelelse
> news:3cc83f88$0$58759$edfadb0f@dspool01.news.tele.dk...
>> Kan du ikke lade din funktion køre argument-funktionen med
>> 'eval'?
>
> Jo, jeg har (efter hjælp fra Leo Heuser i dk.edb.regneark)
> forsøgt med noget lignende
>
> Function FuncStr(FuncName As String, a As Double, b As Double) As
> Double
> dummy = Replace(Str(a / b), ",", ".")
> FuncStr = Evaluate(FuncName & "(" & dummy & ")")
> End Function
Læs kun dette hvis dummy ikke er erklæret et andet sted. Her
oprettes der her en ny Variant variabel for hvert kald. Du kan evt.
erklære dummy på "modulniveau" (øverst oppe) og så af typen String
så den kun skal erklæres en gang i løbet af kode (burde dog ikke
give den helt store gevinst).
> Grunden til at 'dummy'-variablen skal replaces er for at sikre
> overensstemmelse med brug af komma og punktum som
> decimalseparator. Problemet med metoden er dog, at det tager
> ualmindelig lang tid at benytte denne fremgangsmåde. Simple test
> har vist, at det tager ca. 150 gange så lang tid hvis jeg skal
> Replace/Evaluate hver gang, i stedet for at kalde en VBA-
> funktion. Og det har jeg ikke tålmodighed til. Nedenfor er mine
> koder gengivet, og hvis nogen skulle have en god ide til hvordan
> farten kan sættes op, hører jeg det gerne.
>
> Kasper
>
> Den funktion jeg testregner på er
>
> Function Func(ByVal x As Double)
> Func = 1 / Sqr(x)
> End Function
>
> og den funktion (der er en simpel numerisk integrations-
> algoritme) der kaldes med såvel Evaluate/Replace som direkte er:
>
> Function NumIntegration(a As Double, b As Double, n As Long,
> FuncName As String)
>
> Dim r As Long
> Dim h#, p#, MellemRes#, z As Double
>
> If Int(n / 2) * 2 <> n Then
> n = n + 1
> End If
Prøv med (hvis det bare er en test om lige/ulige)
If n Mod 2 > 0 Then
Burde også være lidt hurtigere men ikke meget
> h = (b - a) / n
> a = Replace(Str(a), ",", ".")
> b = Replace(Str(b), ",", ".")
> p = Evaluate(FuncName & "(" & a & ")") + Evaluate(FuncName & "("
> & b & ")") 'p = Func(a) + Func(b)
> z = 4
> For r = 1 To n - 1
> MellemRes = Replace(Str(a + r * h), ",", ".")
> p = p + z * Evaluate(FuncName & "(" & MellemRes & ")")
> 'p = p + z * Func(a + r * h)
> z = 6 - z
> Next
> NumIntegration = h * p / 3
>
> End Function
Hej Kasper
Dette er et skud i tågen (og ikke særligt kønt), men du kunne evt.
kigge på metoden InsertLines (du kan ikke finde noget om den i Excel
97s hjælp, men den findes i Access). Se
http://www.cpearson.com/excel/vbe.htm både for hvordan du findes
hjælpen (hvis du ikke har noget nyere end 97) og for et par
eksempler.
Se efter funktionerne InsertLines, DeleteLines og ReplaceLine. Disse
funktioner kan henholdsvis indsætte, fjerne og erstatte en linie
kode i et modul. Du kunne evt. bruge dette til at lave noget
"selv-modificerende" kode (meget fyfy), så du slipper for mange
(måske alle) af de Evaluate kald og du slipper måske også for
Replace kaldene (men det kan jeg ikke lige gennemskue så tidligt om
morgenen
).
FUT dk.edb.regneark
--
Mikkel Bundgaard
IT University of Copenhagen
http://officehelp.gone.dk
Codito, Ergo Sum