IBE120: Programmatiske eksempler fra øving nr. 1 2014

Submitted by lroedal on Mon, 12/11/2017 - 00:06

I andre del av første øving to skulle dere regne ut statistikk over sykefraværet i det utdelte regnearket. Her var det meningen at dere skulle bruke Excel's innebygde funksjoner - men det er også fullt mulig å gjøre flere av oppgavene med egenprogrammerte makroer skrevet i VBA (programmeringsspråket som brukes til makro-programmering i Microsoft Office). I kodevinduene under denne teksten kan dere se eksempler på hvordan beregning av gjennomsnittslig sykefravær fordelt på kjønn, med legemeldt & egenmeldt hver for seg. I tillegg får dere se hvordan variasjonsbredde kan regnes ut, fordelt etter de samme kriteriene.

PS. La også til et eksempel på en alternativ metode for å slette de radene som mangler data, dette ligger i tredje kodevindu.

sykeprosenter

  1. Sub RegneutGjennomsnitt()
  2.  
  3. For kolonne = 4 To 20 'ytre loop, går bortover (opp til 20 år sjekkes)
  4. If Cells(3, kolonne).Value = "" Then 'stopper loopen når det ikke flere årstall som skal sjekkes
  5. Exit For
  6. End If
  7.  
  8. 'Double-variablene (desimal-tall) brukes for å summere opp de totale prosentsummene
  9. 'Long-variablene (lang integer) teller opp antallet som summeres sammen, slik at vi kan dele på denne for å få gjennomsnittet
  10. Dim mennEgenM, mennLegeM, kvinnerEgenM, kvinnerLegeM As Double
  11. Dim mennEgenCount, mennLegeCount, kvinnerEgenCount, kvinnerLegeCount As Long
  12.  
  13. 'Alle settes til en verdi av 0 her, da vi trenger at de "nullstilles" mellom hvert årstall som sjekkes
  14. mennEgenCount = 0
  15. mennLegeCount = 0
  16. kvinnerLegeCount = 0
  17. kvinnerEgenCount = 0
  18. mennEgenM = 0
  19. mennLegeM = 0
  20. kvinnerLegeM = 0
  21. kvinnerEgenM = 0
  22.  
  23. For rad = 5 To 80 'indre loop, går nedover
  24.  
  25. If Cells(rad, 1).Value = "Menn" Then 'hvis det er menn
  26. If Cells(rad, 3).Value = "Egenmeldt" Then 'sjekker vi om det er egenmeldt
  27. mennEgenM = mennEgenM + CDbl(Cells(rad, kolonne).Value)
  28. mennEgenCount = mennEgenCount + 1
  29. End If
  30.  
  31. If Cells(rad, 3).Value = "Legemeldt" Then 'eller legemeldt
  32. mennLegeM = mennLegeM + CDbl(Cells(rad, kolonne).Value)
  33. mennLegeCount = mennLegeCount + 1
  34. End If
  35. End If
  36.  
  37. If Cells(rad, 1).Value = "Kvinner" Then 'tilsvarende for kvinner her
  38. If Cells(rad, 3).Value = "Egenmeldt" Then
  39. kvinnerEgenM = kvinnerEgenM + CDbl(Cells(rad, kolonne).Value)
  40. kvinnerEgenCount = kvinnerEgenCount + 1
  41. End If
  42.  
  43. If Cells(rad, 3).Value = "Legemeldt" Then
  44. kvinnerLegeM = kvinnerLegeM + CDbl(Cells(rad, kolonne).Value)
  45. kvinnerLegeCount = kvinnerLegeCount + 1
  46. End If
  47. End If
  48.  
  49. If Cells(rad, 4).Value = "" Then
  50. 'resultatet kunne evt. vært rundt av her.. :)
  51. 'resultatet legges eksplisitt i celler under næringene (som sees på bildet over)
  52. 'denne koden vil fungere fint selv om du legger til nye årstall, da den sjekker opp til 20 år
  53. 'om du vil ha flere endrer du kun første linje i øverst loop til å gå endra lengre til høyre
  54. Cells(71, kolonne).Value = mennEgenM / mennEgenCount
  55. Cells(72, kolonne).Value = mennLegeM / mennLegeCount
  56. Cells(73, kolonne).Value = kvinnerEgenM / kvinnerEgenCount
  57. Cells(74, kolonne).Value = kvinnerLegeM / kvinnerLegeCount
  58.  
  59. Exit For
  60. End If
  61.  
  62. Next rad
  63. Next kolonne
  64.  
  65.  
  66. End Sub
  1. Sub finnVariasjonsbredde()
  2. Dim mennLavestE, mennLavestL, kvinnerLavestE, kvinnerLavestL, mennHøyestE, mennHøyestL, kvinnerHøyestE, kvinnerHøyestL As Double
  3.  
  4. For kolonne = 4 To 20 'ytre loop, går bortover
  5. If Cells(3, kolonne).Value = "" Then 'sjekker om årstall-cellen er tom, er den det, avsluttes hele loopen
  6. Exit For
  7. End If
  8.  
  9. mennLavestE = Cells(5, kolonne).Value 'gir lavest verdien fra "første" celle den vil loope forbi
  10. mennHøyestE = Cells(5, kolonne).Value 'gir høyest verdien fra "første" celle den vil loope forbi
  11. mennLavestL = Cells(5, kolonne).Value
  12. mennHøyestL = Cells(5, kolonne).Value
  13. kvinnerLavestE = Cells(5, kolonne).Value
  14. kvinnerHøyestE = Cells(5, kolonne).Value
  15. kvinnerLavestL = Cells(5, kolonne).Value
  16. kvinnerHøyestL = Cells(5, kolonne).Value
  17.  
  18.  
  19. For rad = 5 To 80 'indre loop, går nedover
  20. If Cells(rad, 4).Value = "" Then 'stopper loopen, og printer årsresultatet når det ikke lengre er flere næringer å sjekke
  21. Cells(77, kolonne).Value = mennHøyestE - mennLavestE
  22. Cells(78, kolonne).Value = mennHøyestL - mennLavestL
  23. Cells(79, kolonne).Value = kvinnerHøyestE - kvinnerLavestE
  24. Cells(80, kolonne).Value = kvinnerHøyestL - kvinnerLavestL
  25. Exit For
  26. End If
  27.  
  28. 'sjekker verdien i lavest og høyest opp mot cellen som loopes, overskriver variablene dersom verdiene er høyere/lavere enn nåværende verdi
  29. If Cells(rad, 1).Value = "Menn" Then
  30. If Cells(rad, 3).Value = "Egenmeldt" Then
  31. If Cells(rad, kolonne).Value > mennHøyestE Then
  32. mennHøyestE = Cells(rad, kolonne).Value
  33. End If
  34.  
  35. If Cells(rad, kolonne).Value < mennLavestE Then
  36. mennLavestE = Cells(rad, kolonne).Value
  37. End If
  38. End If
  39.  
  40. If Cells(rad, 3).Value = "Legemeldt" Then
  41. If Cells(rad, kolonne).Value > mennHøyestL Then
  42. mennHøyestL = Cells(rad, kolonne).Value
  43. End If
  44.  
  45. If Cells(rad, kolonne).Value < mennLavestL Then
  46. mennLavestL = Cells(rad, kolonne).Value
  47. End If
  48. End If
  49. End If
  50.  
  51. If Cells(rad, 1).Value = "Kvinner" Then
  52. If Cells(rad, 3).Value = "Egenmeldt" Then
  53. If Cells(rad, kolonne).Value > kvinnerHøyestE Then
  54. kvinnerHøyestE = Cells(rad, kolonne).Value
  55. End If
  56.  
  57. If Cells(rad, kolonne).Value < kvinnerLavestE Then
  58. kvinnerLavestE = Cells(rad, kolonne).Value
  59. End If
  60. End If
  61.  
  62. If Cells(rad, 3).Value = "Legemeldt" Then
  63. If Cells(rad, kolonne).Value > kvinnerHøyestL Then
  64. kvinnerHøyestL = Cells(rad, kolonne).Value
  65. End If
  66.  
  67. If Cells(rad, kolonne).Value < kvinnerLavestL Then
  68. kvinnerLavestL = Cells(rad, kolonne).Value
  69. End If
  70. End If
  71. End If
  72.  
  73. Next rad
  74. Next kolonne
  75.  
  76.  
  77. End Sub
  1. Sub SlettTommeLinjer()
  2. Dim antTomme, teller As Long
  3. antTomme = 0 'teller for antall "tomme" celler
  4. teller = 68 'teller for den ytre loopen
  5.  
  6. For rad = 5 To teller 'begynner på rad fem, og teller ned til rad 68
  7.  
  8. For kolonne = 4 To 15 'begynner på kolonne d, og teller bortover til kolonne o (bare å øke tallet om det blir flere år med data)
  9. If Cells(rad, kolonne).Value = ".." Then
  10. antTomme = antTomme + 1 'for å passe på at vi kun sletter rader hvor ALLE årene mangler data
  11. End If
  12.  
  13. If antTomme = 12 Then 'siden vi for øyeblikket har tolv år (må økes dersom det blir flere år
  14. Cells(rad, kolonne).EntireRow.Delete 'sletter raden
  15. teller = teller - 1 'fjerner en rad fra telleren (siden vi nå har slettet en)
  16. antTomme = 0 'nullstiller telleren
  17. Exit For
  18. End If
  19. Next kolonne
  20. Next rad
  21.  
  22. End Sub