Avatar billede gotcha Nybegynder
18. marts 2004 - 17:04 Der er 23 kommentarer og
1 løsning

Parametre i en funktion

Jeg har en funktion, hvis opgave er at skrive en række nøgletal til mit ark.

På nuværende tidspunkt gøres dette manuelt på formen:

Public Function WriteKeyFigures(bpv As Double, cvx As Double, acc As Double, yield As Double, rowNo As Integer, colNo As Integer)

    'write key figures at the given index, but shift 2 cells to the right
    Range("sIsin").Cells(rowNo, colNo + 2) = bpv
    Range("sIsin").Cells(rowNo, colNo + 3) = cvx
    Range("sIsin").Cells(rowNo, colNo + 4) = acc
    Range("sIsin").Cells(rowNo, colNo + 5) = yield

End Function

men kan dette ikke gøres lettere? Jeg tænker på, om alle parametre f.eks. ikke er givet ved et array, som jeg så kan gennemløbe (ovenstående virker temmelig rigidt).

Mvh Morten
Avatar billede nmh Nybegynder
18. marts 2004 - 17:51 #1
Ikke så vidt jeg ved, men du kunne selvfølgelig have værdierne for cvx, acc, yield osv. gemt i et array.
Avatar billede gotcha Nybegynder
18. marts 2004 - 19:37 #2
Har man så nogen mulighed for at aflæse, hvorfra funktionen bliver kaldt?
Avatar billede nmh Nybegynder
18. marts 2004 - 19:49 #3
Nej, så skal man selv indføre en ekstra parameter, så man ved kald forskellige steder kan aktivere den på forskellig måde. Så kan du selv til en vis grad indhente denne viden.
Funktionen "ved selv" hvorfra den er blevet kaldt, så den kan returnere det rigtige sted, men denne returadresse kan man ikke aflæse.
Avatar billede sjh Nybegynder
19. marts 2004 - 03:12 #4
Du kan måske bruge ParamArray ;)


Private Sub Form_Load()
  Call WriteKeyFigures("Tekst", 123, 10.5, "Tekst 4")
End Sub

Public Sub WriteKeyFigures(ParamArray arrValue() As Variant)
Dim i As Integer
  For i = LBound(arrValue) To UBound(arrValue)
    MsgBox arrValue(i)
  Next
End Sub
Avatar billede bak Forsker
19. marts 2004 - 10:02 #5
Public Function WriteKeyFigures(bpv As Double, cvx As Double, acc As Double, yield As Double, rowNo As Integer, colNo As Integer)
Dim MyArray
MyArray = Array(bpv, cvx, acc, yield)
Range("sISin").Cells(rowNo, colNo).Offset(, 2).Resize(, 4) = MyArray
End Function
Avatar billede martin_moth Mester
19. marts 2004 - 10:19 #6
Hvorfor bruge en funktion og ikke en sub - du udnytter jo ikke det en funktion kan i forhld til en sub, så brug en sub i stedet (bare en kommentar fra sidelinien ;-)
Avatar billede bak Forsker
19. marts 2004 - 10:43 #7
enig, martin.
Avatar billede gotcha Nybegynder
20. marts 2004 - 18:39 #8
Hvad er det helt præcist en funktion kan i forhold til en sub (er helt ny til VB)?
Avatar billede nmh Nybegynder
20. marts 2004 - 18:56 #9
En funktion kan returnere en værdi direkte.
Her er et eksempel: (jeg undlader at skrive public eller private i det følgende)

funtion F(x,y)
  F=x+y
end function

Nu kunne du et andet sted give ordren x=F(2,3)
og x ville så have værdien 5.

For at få en subrutine til at ændre på en variabel et andet sted, kan du overføre en variabel med en reference.

sub P(ByRef x)
  x=11
end sub

Hvis man nu giver ordren P(z), vil den variable z nu have værdien 11.

sub P(ByVal x)
  x=11
end sub

Så vil den variable z ikke påvirkes af ordren P(z)

Hvis man skriver

sub P(x)
  x=11
end Sub

vil Visual Basic underforstå at der er tale om en overførsel af typen ByRef i modsætning til alle andre programmerinssprog. (Det er ændret i VB.net)
Så nu vil P(z) resultere i at z bliver 11.

Spørg bare løs, hvis du vil vide mere.
Avatar billede gotcha Nybegynder
23. marts 2004 - 09:09 #10
kanon :)

Er der en metode, der afslutter kørslen af en sub fuldstændig? F.eks. hvis brugeren indtaster ugyldig data...
Avatar billede nmh Nybegynder
23. marts 2004 - 09:25 #11
Ja, ordren
exit sub
vil resultere i at proceduren afsluttes, og der returneres til det sted, hvorfra den blev kaldt.
Avatar billede gotcha Nybegynder
23. marts 2004 - 10:21 #12
Hvad så med variable, der ikke længere er nødvendige? Jeg tænker på, om der findes noget i stil med:

delete myVar;
Avatar billede nmh Nybegynder
23. marts 2004 - 10:38 #13
Lokale variable i en procedure forsvinder jo, når proceduren afsluttes.

Hvis man arbejder med klasser bliver tingene jo først til, når man instantierer et objekt.
Her kan man sætte et objekt til Nothing, når man er færdig med det.
Og så vil de variable i dette objekt ikke mere optage plads.

Globale variable kan man ikke få til at forsvinde.
Avatar billede martin_moth Mester
23. marts 2004 - 11:49 #14
Altså: Alle variabler (Integers, Real, Long, Date, String, ...) erklærere du med
  "Dim Variabelnavn As ..."
Når du er færdig med dem glemmer du dem - du skal ikke nedlægge dem.

Objekter instantierer du med
  "Set ObjektNavn = New ..."
Eller tilsvarende - New kan undlades hvis du gør noget andet, men SET bruges altid.

Når du er færdig med et objekt, sætter du Objektnavn = Nothing.

Hvis du er rimelig ny, kommer du nok ikke til at bruge objekter. Og dog - skal du bruge databaser, opretter du typisk et recordset, som er et objekt.

Summa sumarum - så længe du ikke bruger det lille ord SET skal du ikke bekymre dig om at slette variabler/objekter
Avatar billede gotcha Nybegynder
23. marts 2004 - 16:47 #15
Jeg foretager en del forespørgsler i diverse databaser, og derfor spurgte jeg ang.

myObj = Nothing

fordi det vil spare hukommelse i længden og dermed spare mig tid. Men hvad så med definition af klasser, tilhørende metoder og egenskaber?
Avatar billede nmh Nybegynder
23. marts 2004 - 17:05 #16
Husk at skrive

Set myObj=Nothing

'Set' skal med, når der er tale om objekter.

Når vi begynder at tale om klasser, er pladsen her nok for snæver.
Så jeg vil afstå fra at skrive noget om det.
Du burde nok anskaffe en bog om disse ting.

Men du kan da se lidt her:

http://www.developerfusion.com/show/3959/
Avatar billede gotcha Nybegynder
25. marts 2004 - 23:13 #17
Må hellere få lukket det her spørgsmål, og siger tusind tak for hjælpen! :)
Avatar billede gotcha Nybegynder
25. marts 2004 - 23:14 #18
nmh: Hvis du vil have ekstra point, så siger du bare til.
Avatar billede nmh Nybegynder
26. marts 2004 - 00:40 #19
Jeg siger da ikke nej til lidt point, ;o)
Avatar billede gotcha Nybegynder
01. april 2004 - 14:36 #20
Du skal svare på http://www.eksperten.dk/spm/484655 :)

Har ledt en del, men kan ikke finde en modulus-operator i VB. Findes der ikke sådan en operator, der returnerer resten ved division?
Avatar billede nmh Nybegynder
01. april 2004 - 16:55 #21
Modulus operator:
x=15 Mod 4

Nu er x lig med 3

Du kan også benytte heltalsdivision:

x=15-(15\4)*4

det er det samme som 15 Mod 4
Avatar billede gotcha Nybegynder
02. april 2004 - 09:16 #22
Kanon, det var lige det, jeg skulle bruge
Avatar billede nmh Nybegynder
02. april 2004 - 09:21 #23
Det var godt. Har du flere af den slags små spørgsmål, så kom bare med dem her.
Avatar billede gotcha Nybegynder
02. april 2004 - 09:26 #24
Vil jeg gøre :)
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester