18. marts 2004 - 17:04Der 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).
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.
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
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
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 ;-)
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.
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.
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
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.
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.