Avatar billede misseren Nybegynder
02. januar 2006 - 11:37 Der er 5 kommentarer

forklaring af VBA kode

Hej
Er der nogen der linie for linie kan forklare hvad der sker i følgende vba kode.

Sub GCD(byval tal1 as integer, byval tal2 as integer, byref resultat as integer)
dim taeller as integer, naevner as integer, rest as integer

If(tal1 > tal 2) then
taeller = tal1
naevner = tal2
else
taeller = tal2
naevner = tal1
end if

rest = taeller Mod naevner
Do while rest > 0
taeller = naevner
næaevner = rest
rest = taeller Mod naevner
loop

resultat = naevner
end sub

Sub checkGCD()
dim A as integer, B as integer, R as integer

A=9
B=24
GCD A B, R
End sub

Tak for hjælpen
Avatar billede kabbak Professor
02. januar 2006 - 12:10 #1
der var den del fejl i koden, de er rettet, jeg har prøvet at sætte beskrivelse på.

Sub GCD(ByVal tal1 As Integer, ByVal tal2 As Integer, ByRef resultat As Integer)
Dim taeller As Integer, naevner As Integer, rest As Integer

'checkGCD sender værdierne op i denne
If tal1 > tal2 Then ' hvis tal1 er større end tal2 så
taeller = tal1 '= A
naevner = tal2 ' = B
Else          ' eller hvis tal2 er større end tal1 så
taeller = tal2
naevner = tal1
End If

rest = taeller Mod naevner ' finder restværdien hvor tæller er devideret med nævner
Do While rest > 0  ' hvis restværdien > 0 kører løkken
taeller = naevner  ' nu byttes de om taeller bliver nævner
naevner = rest    ' og naevner bliver = restværdien
rest = taeller Mod naevner ' finder restværdien hvor tæller er devideret med nævner
Loop

resultat = naevner ' det er denne værdi der retuneres med R
End Sub

Sub checkGCD()
Dim A As Integer, B As Integer, R As Integer

A = 9
B = 24
GCD A, B, R ' kalder den anden sub GCD og sender værdierne A og B med, R er den værdi der kommer tilbage
res = R
End Sub
Avatar billede simonvalter Praktikant
02. januar 2006 - 12:12 #2
nå en var hurtigere men nu har jeg aligevel brugt tiden på det så her kommer det.

Jeg har aldrig skrevet en linie VBA så jeg kan tage fejl men jeg vil mene det er rimlig tæt på ;)

GCD finder Greatest common divisor ( se http://en.wikipedia.org/wiki/Greatest_common_divisor )

Sub GCD(byval tal1 as integer, byval tal2 as integer, byref resultat as integer) // erklærer en funktion/metode ved havn GCD som tager 3 integer argumenter tal1, tal2 og resultat. tal1 og tal2 bliver passed by value og resultat bliver passed by reference.( se http://en.wikipedia.org/wiki/Pass-by-reference )

dim taeller as integer, naevner as integer, rest as integer // i funktionen erklæres tæller,nævner og rest som integer.

If(tal1 > tal 2) then  // conditional statement, Hvis tal1 er større end tal2 så udføres de næste 2 linier (indtil else)
taeller = tal1 // tal1's værdi tildeles til tæller.
naevner = tal2 // tal2's værdi tildeles til nævner.
else // ellers udføres
taeller = tal2 // samme som ovenfor
naevner = tal1
end if // slut på conditional statement

rest = taeller Mod naevner // rest sættes til værdi. tæller modolus nævner (se http://en.wikipedia.org/wiki/Remainder , http://en.wikipedia.org/wiki/Modulus , 10 % 3 = 1 )

Do while rest > 0 // loop statement, Udføres så længe rest er større end 0
taeller = naevner // assignment af nævner til tæller
næaevner = rest // assignment
rest = taeller Mod naevner // som vist tidligere
loop // slut på loop

resultat = naevner // nævner assignes til resultatet.
end sub // slut på funktionen.

Sub checkGCD() // endnu en funktion som ikke tager nogen argumenter
dim A as integer, B as integer, R as integer // variabel erklæring af integers A,B og R

A=9 // R assignes tallet 9
B=24
GCD A B, R // funktionen GCD udføres med argumenterne A, B og R, når funktionen er kaldt vil R have resultatet
End sub // slut på funktion.
Avatar billede bak Forsker
02. januar 2006 - 12:17 #3
ligeså her :-)
'Greatest Common Divisor
Sub GCD(ByVal tal1 As Integer, ByVal tal2 As Integer, ByRef resultat As Integer)
Dim taeller As Integer, naevner As Integer, rest As Integer
  'find det største af tallene og sæt det i tælleren og det mindste i nævneren
  If (tal1 > tal2) Then
      taeller = tal1
      naevner = tal2
  Else
      taeller = tal2
      naevner = tal1
  End If
  'Divider de to tal og find resten (24/9) rest 6
  rest = taeller Mod naevner
  'gør mens resten er >0
  Do While rest > 0
      '1. gennemløb.  sæt tælleren = nævneren 'tæller bliver så 9
      '2. gennemløb.  sæt tælleren = nævneren 'tæller bliver så 6
      taeller = naevner
      'sæt nævneren = resten
      '1. gennemløb. nævner bliver så 6
      '2. gennemløb. nævner bliver så 3 (tidligere rest)
      naevner = rest
      '1. gennemløb. rest = resten af divisionen (9/6) = 3
      '2. gennemløb. rest = resten af divisionen (6/3) = 0, hvilket betyder at
      'vi skal ud af løkken
      rest = taeller Mod naevner                      'rest 3
  Loop
  'resultat = 3 som er nævner i 2. gennemløb
  resultat = naevner
End Sub

Sub checkGCD()
Dim A As Integer, B As Integer, R As Integer

  A = 9
  B = 24
  GCD A, B, R
  Debug.Print A, B, R
End Sub
Avatar billede misseren Nybegynder
02. januar 2006 - 12:34 #4
tak for beskrivelsen, men er det muligt at i kan give et tal eksempel. Dvs køre loop igennem med 24 og 9 og vise rest og til sidst vise hvad resultat er lige med.
Avatar billede simonvalter Praktikant
02. januar 2006 - 12:40 #5
prøv og kør det og print undervejs... ved ikke lige hvordan man printer i vba.
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