/ Forside / Teknologi / Udvikling / VB/Basic / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
VB/Basic
#NavnPoint
berpox 2425
pete 1435
CADmageren 1251
gibson 1230
Phylock 887
gandalf 836
AntonV 790
strarup 750
Benjamin... 700
10  tom.kise 610
Kalde funktion med funktion som argument i~
Fra : Kasper Okkels


Dato : 18-04-02 14:13

Hej,

Kan man kalde en function (eller en sub) med en funktion som argument i
VBA/Excel? Jeg har lavet funktionen NumeriskIntegration, og jeg ønsker at
kalde den som
=NumeriskIntegration(a ; b ; EXP(X) )
=NumeriskIntegration(a ; b ; MinEgenFunktion(X) )
osv., hvor a og b er normale tal.

(Hvordan) kan det lade sig gøre?

Kasper



 
 
Christian R. Larsen (18-04-2002)
Kommentar
Fra : Christian R. Larsen


Dato : 18-04-02 15:35

Kasper Okkels <okkels@wanadoo.dk> skrev i artiklen
<3cbec64a$0$11939$edfadb0f@dspool01.news.tele.dk>...
> Hej,
>
> Kan man kalde en function (eller en sub) med en funktion som argument i
> VBA/Excel? Jeg har lavet funktionen NumeriskIntegration, og jeg ønsker at
> kalde den som
> =NumeriskIntegration(a ; b ; EXP(X) )
> =NumeriskIntegration(a ; b ; MinEgenFunktion(X) )
> osv., hvor a og b er normale tal.
>
> (Hvordan) kan det lade sig gøre?

Resultatet af MinEgenFunktion(X) skal først beregnes i et andet felt (lad
os sige A1). Detnæst bruger du så A1 som inputparameter i den anden
funktion, =NumeriskIntegration(a ; b ; A1)

Jeg går ud fra, at du har forsøgt dig med =NumeriskIntegration(a ; b ;
MinEgenFunktion(X) )??


Kasper Okkels (18-04-2002)
Kommentar
Fra : Kasper Okkels


Dato : 18-04-02 17:05

"Christian R. Larsen" <crlarsen@hotmail.com> skrev i en meddelelse
news:01c1e6e6$1e86c5a0$f0cd010a@0009-2006...
> Resultatet af MinEgenFunktion(X) skal først beregnes i et andet felt (lad
> os sige A1). Detnæst bruger du så A1 som inputparameter i den anden
> funktion, =NumeriskIntegration(a ; b ; A1)
>
> Jeg går ud fra, at du har forsøgt dig med =NumeriskIntegration(a ; b ;
> MinEgenFunktion(X) )??

Ok, jeg var måske ikke præcis nok. "X" er ikke et tal, men generel
funktions-indmad. Det er altså ikke MinEgenFunktion(3) eller
MinEgenFunktion(-78) der skal være input, men alle tænkelige værdier.
Funktionen benytter MinEgenFunktion måske 1000, måske 100.000 gange - det
finder funktionen ud af, og derfor er den smart. Når jeg skal kalde
funktionen, så skal det eksempelvis være som
=NumeriskIntegration( 1 ; 5 ; EXP(X) )
eller
=NumeriskIntegration(2 ; 4 ; log(1 + sin(x)*exp(1/x)) ),
for at tage en funktion, der nok ikke er lige til at integrere...!

Håber det var mere præcist. Men er det muligt?

Venligst,
Kasper



Barney Gumble (18-04-2002)
Kommentar
Fra : Barney Gumble


Dato : 18-04-02 17:06

Et ord: CallFunction

BG

"Kasper Okkels" <okkels@wanadoo.dk> wrote in message
news:3cbeee93$0$26604$edfadb0f@dspool01.news.tele.dk...
> "Christian R. Larsen" <crlarsen@hotmail.com> skrev i en meddelelse
> news:01c1e6e6$1e86c5a0$f0cd010a@0009-2006...
> > Resultatet af MinEgenFunktion(X) skal først beregnes i et andet felt
(lad
> > os sige A1). Detnæst bruger du så A1 som inputparameter i den anden
> > funktion, =NumeriskIntegration(a ; b ; A1)
> >
> > Jeg går ud fra, at du har forsøgt dig med =NumeriskIntegration(a ; b ;
> > MinEgenFunktion(X) )??
>
> Ok, jeg var måske ikke præcis nok. "X" er ikke et tal, men generel
> funktions-indmad. Det er altså ikke MinEgenFunktion(3) eller
> MinEgenFunktion(-78) der skal være input, men alle tænkelige værdier.
> Funktionen benytter MinEgenFunktion måske 1000, måske 100.000 gange - det
> finder funktionen ud af, og derfor er den smart. Når jeg skal kalde
> funktionen, så skal det eksempelvis være som
> =NumeriskIntegration( 1 ; 5 ; EXP(X) )
> eller
> =NumeriskIntegration(2 ; 4 ; log(1 + sin(x)*exp(1/x)) ),
> for at tage en funktion, der nok ikke er lige til at integrere...!
>
> Håber det var mere præcist. Men er det muligt?
>
> Venligst,
> Kasper
>
>



Kasper Okkels (18-04-2002)
Kommentar
Fra : Kasper Okkels


Dato : 18-04-02 18:20

"Barney Gumble" <dadrinker.nospam@hotmail.com> skrev i en meddelelse
news:a9mqu6$2m8g$1@news.cybercity.dk...

> Et ord: CallFunction

Der er jeg nok nødt til at have lidt mere hjælp. Søger jeg efter ordet
"CallFunction" i såvel Excels som VBA's hjæpefil, finder jeg intet. Søger
jeg på Google, så kommer der stort set kun hits af typen "... Sub
CallFunction() ...", men ikke noget, jeg umiddelbart finder brugbart. Hjælp
ønskes!

Kasper



Kaj Julius (12-05-2002)
Kommentar
Fra : Kaj Julius


Dato : 12-05-02 01:41


"Kasper Okkels" <okkels@wanadoo.dk> skrev i en meddelelse
news:3cbf0006$0$26560$edfadb0f@dspool01.news.tele.dk...
> "Barney Gumble" <dadrinker.nospam@hotmail.com> skrev i en meddelelse
> news:a9mqu6$2m8g$1@news.cybercity.dk...
>
> > Et ord: CallFunction
>
> Der er jeg nok nødt til at have lidt mere hjælp. Søger jeg efter ordet
> "CallFunction" i såvel Excels som VBA's hjæpefil, finder jeg intet. Søger
> jeg på Google, så kommer der stort set kun hits af typen "... Sub
> CallFunction() ...", men ikke noget, jeg umiddelbart finder brugbart.
Hjælp
> ønskes!
>
> Kasper
>

Måske hentyder Barney til artiklen
http://www.devx.com/upload/free/features/vbpj/2000/02feb00/mc0200/mc0200.asp
som omhandler en måde at kunne udføre funktioner dynamisk under VB5/6 vha.
callback. Det er så vidt jeg kan se en temmelig avanceret metode og
umiddelbart tror jeg ikke den kan bruges i Excel (VBA).

Kaj




Kaj Julius (12-05-2002)
Kommentar
Fra : Kaj Julius


Dato : 12-05-02 03:34


"Kasper Okkels" <okkels@wanadoo.dk> skrev i en meddelelse
news:3cbf0006$0$26560$edfadb0f@dspool01.news.tele.dk...
> "Barney Gumble" <dadrinker.nospam@hotmail.com> skrev i en meddelelse
> news:a9mqu6$2m8g$1@news.cybercity.dk...
>
> > Et ord: CallFunction
>
> Der er jeg nok nødt til at have lidt mere hjælp. Søger jeg efter ordet
> "CallFunction" i såvel Excels som VBA's hjæpefil, finder jeg intet. Søger
> jeg på Google, så kommer der stort set kun hits af typen "... Sub
> CallFunction() ...", men ikke noget, jeg umiddelbart finder brugbart.
Hjælp
> ønskes!
>
> Kasper
>
>

Hvis du stadig bruger Excel97 kan du sikkert også bruge Call funktionen til
Excels makroudførende DLL som beskrevet i
http://www.cpearson.com/excel/Call.htm

Metoden Call er blevet fjernet i Excel2000 da den tillod kald til externe
DLLs, hvilket kan være farligt. Microsoft har desuden frigivet en rettelse
til Excel97, som stopper for brugen af Call, så hvis du har denne rettelse
installeret, kan Excel97 jo heller ikke bruges.

Den i artiklen nævnte sti til Microsofts hjælpefil er åbenbart blevet ændret
til
http://www.microsoft.com/downloads/release.asp?releaseid=12917

Jeg står umiddelbart noget tvivlende overfor om metoden, som påstået i
artiklen, skulle være hurtigere end at bruge evaluate fra VBA, men jeg har
ikke prøvet, så what do I know...

Kaj



Allan Olesen (25-04-2002)
Kommentar
Fra : Allan Olesen


Dato : 25-04-02 18:35

"Kasper Okkels" <okkels@wanadoo.dk> wrote:

>Kan man kalde en function (eller en sub) med en funktion som argument i
>VBA/Excel?

Kan du ikke lade din funktion køre argument-funktionen med
'eval'?


--
Allan

Kasper Okkels (26-04-2002)
Kommentar
Fra : Kasper Okkels


Dato : 26-04-02 08:16

"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

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




Mikkel Bundgaard (26-04-2002)
Kommentar
Fra : Mikkel Bundgaard


Dato : 26-04-02 09:27

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



Tomas Christiansen (27-04-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 27-04-02 00:06

Kasper Okkels skrev:
> Function FuncStr(FuncName As String, a As Double, b As Double) As
Double
> dummy = Replace(Str(a / b), ",", ".")
> FuncStr = Evaluate(FuncName & "(" & dummy & ")")
> End Function
>
> Grunden til at 'dummy'-variablen skal replaces er for at sikre
> overensstemmelse med brug af komma og punktum som decimalseparator.

??? Er der så stor forskel på VBA og VB, at Str-funktionen gør noget
ret forskelligt i disse to *VB* varianter ???

Hvis der sker det samme i VBA som i VB, vil resultatet fra
Str-funktionen ALTID indeholde punktum som decimalskilletegn, hvorfor
kaldet af Replace er ganske unødvendigt.

Iøvrigt er det lidt spild at bruge en variabel her, når man ligeså
godt kunne skrive udtrykket således (i fald Replace ønskes):

FuncStr = Evaluate(FuncName & "(" & Replace(Str(a / b), ",", ".") &
")")

-------
Tomas


Kasper Okkels (27-04-2002)
Kommentar
Fra : Kasper Okkels


Dato : 27-04-02 09:37

"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:aacj03$1p1n$1@news.cybercity.dk...
> Hvis der sker det samme i VBA som i VB, vil resultatet fra
> Str-funktionen ALTID indeholde punktum som decimalskilletegn, hvorfor
> kaldet af Replace er ganske unødvendigt.

Desværre er det nødvendigt når man i Excel benytter punktum som
decimalskilletegn. Excel giver en #VÆRDI!-fejl, hvis man ikke sørger for at
bruge Replace-kommandoen.

> Iøvrigt er det lidt spild at bruge en variabel her, når man ligeså
> godt kunne skrive udtrykket således (i fald Replace ønskes):

ok, forstået!

Kasper



Tomas Christiansen (28-04-2002)
Kommentar
Fra : Tomas Christiansen


Dato : 28-04-02 23:31

Kasper Okkels skrev:
> Desværre er det nødvendigt når man i Excel benytter punktum som
> decimalskilletegn. Excel giver en #VÆRDI!-fejl, hvis man ikke sørger
for at
> bruge Replace-kommandoen.

Jamen resultatet af Str-funktionen er jo netop en streng, hvor der
benyttes punktum som decimalskilletegn! Replace-funktionen vil derfor
aldrig nogensinde ændre nogetsomhelst.

Jeg kan IKKE få min Excel til at komme med #VÆRDI!-fejlen, selvom jeg
fjerner brugen af Replace.

Prøv at kalde denne funktion fra Excel:

Function FS (a As Double, b As Double) As String
FS = Str(a / b)
End Function

Resultatet skulle gerne indeholder punktum som decimalskilletegn.

Prøv derefter at udskifte funktionen Str med CStr, og svaret vil nu
indeholde det decimalskilletegn, som din computer er sat op til at
bruge.

-------
Tomas


Kasper Okkels (29-04-2002)
Kommentar
Fra : Kasper Okkels


Dato : 29-04-02 08:30

"Tomas Christiansen" <toc@blikroer.removethis.dk> skrev i en meddelelse
news:aahplg$1vco$1@news.cybercity.dk...

> Jamen resultatet af Str-funktionen er jo netop en streng, hvor der
> benyttes punktum som decimalskilletegn! Replace-funktionen vil derfor
> aldrig nogensinde ændre nogetsomhelst.

Ja, det kan jeg da godt se. Jeg var blot kommet i den tro, at jeg blev nødt
til at have såvel Replace som Str med, men det virker jo lige så fint
udelukkende med Str. Tak for hintet!

Hastigheden er blevet forbedret en smule. Det, der tidligere tog knap 20
sekunder, er nu nede på 16 sekunder. Men det er stadig meget tidskrævende i
forhold til de 0,11 sekunder det tager, hvis jeg helt dropper
Evaluate/Str-metoden...

Kasper



Søg
Reklame
Statistik
Spørgsmål : 177559
Tips : 31968
Nyheder : 719565
Indlæg : 6408938
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste