Avatar billede masteraaen Novice
14. juli 2004 - 11:30 Der er 12 kommentarer og
2 løsninger

Kalde sub

Hejsa!

Hvordan kalder jeg en sub fra en function? Og jeg vil gerne have de variable funktionen har udregnet til at blive brugt i min sub også...

Venligst

Morten
Avatar billede masteraaen Novice
14. juli 2004 - 11:31 #1
Det er i Excel VBA
Avatar billede ferdinand.k Mester
14. juli 2004 - 11:32 #2
er det ikke bare

DinFunktion()
Avatar billede rbj_fp Nybegynder
14. juli 2004 - 11:35 #3
Det er nok pænere og mere forståligt hvis du skaber en wrapper-sub

public function minFunktion(blab blab) as output
end function

public sub min-sub(parametere)
end sud

public sub wrapper()
      min-sub(minfunktion())
end sub
Avatar billede masteraaen Novice
14. juli 2004 - 11:47 #4
Det forstår jeg ikke. Jeg kan ikke få det til at virke.

Hvis jeg nu har en funktion, som udregner noget:
Private minfunk(ind1,ind2)
Dim rk,kol As Integer

rk = 6 * ind1
kol = 6 * ind2

'HER VIL JEG GERNE KALDE MIN SUB, SOM UDFØRER NOGET PÅ BAGGRUND AF rk OG kol.

minfunk= 2
End funktion

Kan jeg det?

Hvor sub'en så ligner sådan noget fx:

Public Sub minsub(rk, kol As Integer)
Dim i As Integer
i = 0

For i = 1 To kol
Worksheets("Ark1").Cells(i, 1).Copy
Sheets("Ark2").Activate
ActiveSheet.Cells(rk, i).Select
ActiveSheet.Paste
Next i
End Sub
Avatar billede rbj_fp Nybegynder
14. juli 2004 - 11:52 #5
PRøv dette:
Private minfunk(ind)
dim out as integer
out = 6 * ind

Public Sub minsub(ind1, ind2 As Integer)
dim rk, kol as integer
rk = minfunk(ind1)
kol = minfunk(ind2)
Dim i As Integer
i = 0

For i = 1 To kol
Worksheets("Ark1").Cells(i, 1).Copy
Sheets("Ark2").Activate
ActiveSheet.Cells(rk, i).Select
ActiveSheet.Paste
Next i
End Sub
Avatar billede martin_moth Mester
14. juli 2004 - 12:37 #6
Du erklærer en funktion ved

Private Function MinFunktion (byval tal1 as integer, byval2 as integer) as long
  bla bla bla
  MinFunktion = tal1+tal2
End function

Du kalder en sub ved

Private Sub MinSub (byval tal1 as integer, byval2 as integer)
  bla bla bla
End Sub


Du skriver

Private minfunk(ind1,ind2)
Du mangler ordet "Function" i den linie!!! Det gør rbj_fp også...

Forskellen på en sub og en function er altså, at en funktion returenrer EN (og kun en) værdi i sit navn, det gør en sub ikke. Skal du ikke bruge en værdi returneret i funktionsnavnet, så lad være med at bruge en function, brug en sub!

Du kan overføre variable til en sub eller en function ved at smide dem ind i hovedet - jeg bruger ovenfor ByVal, som betyder, at de ændringer du evt. foretager på de parametre du sender med (tal1 og tal2) KUN foretages indenfor den enkelte sub/function, og ikke slår igennem i resten af programmet. Det er ofte en fordel.


Altså kan du kalde en function fra en anden function på følgende måde

Dim tal1 as integer
Dim tal2 as integer
Dim resultat as integer

Private function kvadrat (byval tal as integer) as integer
  kvadrat = tal1^2
End function

Private function kvadratsum (byval tal1 as integer, byval tal2 as integer) as integer
  sum = kvadrat(tal1) + kvadrat(tal2)
end function

'HER KALDER DU SÅ KVADRATSUM; DER KALDER KVADRAT
resultat = kvadratsum(2,4)




Helt analogt med sub
Avatar billede martin_moth Mester
14. juli 2004 - 12:39 #7
Private function kvadrat (byval tal as integer) as integer
  kvadrat = tal1^2
End function

rettes til

Private function kvadrat (byval tal as integer) as integer
  kvadrat = tal^2
End function

Og du behøver ikke dimme tal1 ot tal2

Altså:


Dim resultat as integer

Private function kvadrat (byval tal as integer) as integer
  kvadrat = tal^2
End function

Private function kvadratsum (byval tal1 as integer, byval tal2 as integer) as integer
  sum = kvadrat(tal1) + kvadrat(tal2)
end function

'HER KALDER DU SÅ KVADRATSUM; DER KALDER KVADRAT
resultat = kvadratsum(2,4)
Avatar billede rbj_fp Nybegynder
14. juli 2004 - 12:40 #8
Ups... det er rigtig nok jeg har glemt at skrive function, men stadigvæk burde den kode jeg har givet virke... :-)
Avatar billede martin_moth Mester
14. juli 2004 - 12:42 #9
Og hvis jeg skriver din kode om så den virker, bliver den til følgende:

Private function minfunk(ind1,ind2) as integer
  Dim rk as integer
  dim kol As Integer
  rk = 6 * ind1
  kol = 6 * ind2
  minsub(rk,kol)  '<HER KALDER DU DIN SUB
  minfunk= 2
End funktion

Public Sub minsub(rk, kol As Integer)
  Dim i As Integer
  For i = 1 To kol
    Worksheets("Ark1").Cells(i, 1).Copy
    Sheets("Ark2").Activate
    ActiveSheet.Cells(rk, i).Select
    ActiveSheet.Paste
  Next i
End Sub
Avatar billede martin_moth Mester
14. juli 2004 - 12:45 #10
rbj_fp:

Den kode du har skrevet er noget nonsens...

Du starter en function, og inde i den erklærer du en sub. Det må du ikke. Og du slutter aldrig din function.
Avatar billede martin_moth Mester
14. juli 2004 - 12:46 #11
Hov - undskyld - du kalder en sub sådan her:

minsub rk, kol

Altså uden paranteser. Paranteser bruges til funktioner, ikke subs

Din kode skal se sådan ud:





Private function minfunk(ind1,ind2) as integer
  Dim rk as integer
  dim kol As Integer
  rk = 6 * ind1
  kol = 6 * ind2
  minsub rk, kol  '<HER KALDER DU DIN SUB
  minfunk= 2
End funktion

Public Sub minsub(rk, kol As Integer)
  Dim i As Integer
  For i = 1 To kol
    Worksheets("Ark1").Cells(i, 1).Copy
    Sheets("Ark2").Activate
    ActiveSheet.Cells(rk, i).Select
    ActiveSheet.Paste
  Next i
End Sub



Bemærk, at du ikke behøver at sætte i=0. Jeg har også lavet andre smårettelser
Avatar billede rbj_fp Nybegynder
14. juli 2004 - 12:47 #12
Doohhhh..... Jeg tror jeg er for træt til at skrive kode idag.... men skidt pyt...

Det er selvfølgelig rigtig nok! MEn det du laver ovenstående med at kalde en sub fra en funktion er ikke særlig god programmings-skik
Avatar billede martin_moth Mester
14. juli 2004 - 12:48 #13
Og skulle du gøre det helt efter bogen, skal du typeerklære ALLE dine variable:



Private function minfunk(ind1 as integer, ind2 as integer) as integer
  Dim rk as integer
  dim kol As Integer
  rk = 6 * ind1
  kol = 6 * ind2
  minsub rk, kol  '<HER KALDER DU DIN SUB
  minfunk= 2
End funktion

Public Sub minsub(rk as integer, kol As Integer)
  Dim i As Integer
  For i = 1 To kol
    Worksheets("Ark1").Cells(i, 1).Copy
    Sheets("Ark2").Activate
    ActiveSheet.Cells(rk, i).Select
    ActiveSheet.Paste
  Next i
End Sub

Voliá
Avatar billede martin_moth Mester
14. juli 2004 - 12:49 #14
rbj_fp:

Det er da ikke mig der laver det - masteraaen spørger hvordan man gør, og jeg viser det...

:o)
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