Avatar billede jensen363 Forsker
25. september 2012 - 16:15 Der er 2 kommentarer og
1 løsning

Tæl forekomster i tabelmatrix

Mit datasæt består af følgende


Enhed  01 02 03 04 05 06 07 08 09 10 11 12
100    A  A  A  I  I  A  I  A  A  A  A  A
200    A  A  I  I  I  I  A  A  I  I  A  A
300    A  I  I  I  I  I  A  A  I  I  I  A

01 - 12 er år, A = Aktiv  I = Inaktiv

For hver enhed skal jeg fra højre mod venstre skal jeg have optalt følgende :

  1. Samlet antal A
  2. Antal perioder ( afbrudt af I giver ny periode )
  3. Længden på seneste Aktive periode
  4. Længste Aktive periode
  5. Korteste Aktive periode
Avatar billede fdata Forsker
26. september 2012 - 23:36 #1
Nu er det jo ikke lige til at se, hvordan din opgave ser ud; men du kunne måske bruge en række små funktioner.

F.eks. (omdøb selv tabellen "Enheder"):

Sub Test()
  Const Enhed = 100
  Debug.Print "Antal A", , AntalA(Enhed)
  Debug.Print "Antal perioder", AntalPerioder(Enhed)
  Debug.Print "Seneste A længde", SenesteAktiveLængde(Enhed)
  Debug.Print "Længste A", , LængsteAktivePeriode(Enhed)
  Debug.Print "Korteste A", , KortesteAktivePeriode(Enhed)
  Debug.Print
End Sub

Function AntalA(Enhed As Integer) As Integer
  Dim strSQL As String
  Dim DummyRst As Recordset
  Dim i As Integer
 
  AntalA = 0
  strSQL = "SELECT Enheder.* FROM Enheder WHERE Enhed=" & Enhed
  Set DummyRst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  With DummyRst
    For i = 1 To .Fields.Count - 1
      If .Fields(i) = "A" Then AntalA = AntalA + 1
    Next i
    .Close
  End With
  Set DummyRst = Nothing
End Function

Function AntalPerioder(Enhed As Integer) As Integer
  Dim strSQL As String
  Dim DummyRst As Recordset
  Dim i As Integer
  Dim Old As String
 
  AntalPerioder = 0
  Old = "I"
  strSQL = "SELECT Enheder.* FROM Enheder WHERE Enhed=" & Enhed
  Set DummyRst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  With DummyRst
    For i = .Fields.Count - 1 To 1 Step -1
      If .Fields(i) = "A" And Old = "I" Then AntalPerioder = AntalPerioder + 1
      Old = .Fields(i)
    Next i
    .Close
  End With
  Set DummyRst = Nothing
End Function

Function SenesteAktiveLængde(Enhed As Integer) As Integer
  Dim strSQL As String
  Dim DummyRst As Recordset
  Dim i As Integer
  Dim Old As String
 
  SenesteAktiveLængde = 0
  Old = "X"
  strSQL = "SELECT Enheder.* FROM Enheder WHERE Enhed=" & Enhed
  Set DummyRst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  With DummyRst
    For i = .Fields.Count - 1 To 1 Step -1
      If Old <> "Y" Then
        If .Fields(i) = "A" Then
          SenesteAktiveLængde = SenesteAktiveLængde + 1
          Old = "A"
        End If
        If .Fields(i) = "I" Then
          If Old = "A" Then
            Old = "Y"
          Else
            Old = "I"
          End If
        End If
      End If
    Next i
    .Close
  End With
  Set DummyRst = Nothing
End Function

Function LængsteAktivePeriode(Enhed As Integer) As Integer
  Dim strSQL As String
  Dim DummyRst As Recordset
  Dim i As Integer
  Dim Længste As String
 
  Længste = 0
  LængsteAktivePeriode = 0
  strSQL = "SELECT Enheder.* FROM Enheder WHERE Enhed=" & Enhed
  Set DummyRst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  With DummyRst
    For i = .Fields.Count - 1 To 1 Step -1
      If .Fields(i) = "A" Then
        Længste = Længste + 1
      Else
        If Længste <> 0 Then
          If Længste > LængsteAktivePeriode Then LængsteAktivePeriode = Længste
          Længste = 0
        End If
      End If
    Next i
    .Close
  End With
  Set DummyRst = Nothing
End Function

Function KortesteAktivePeriode(Enhed As Integer) As Integer
  Dim strSQL As String
  Dim DummyRst As Recordset
  Dim i As Integer
  Dim Korteste As String
 
  Korteste = 0
  KortesteAktivePeriode = 100
  strSQL = "SELECT Enheder.* FROM Enheder WHERE Enhed=" & Enhed
  Set DummyRst = CurrentDb.OpenRecordset(strSQL, dbOpenSnapshot)
  With DummyRst
    For i = .Fields.Count - 1 To 1 Step -1
      If .Fields(i) = "A" Then
        Korteste = Korteste + 1
      Else
        If Korteste <> 0 Then
          If Korteste < KortesteAktivePeriode Then KortesteAktivePeriode = Korteste
          Korteste = 0
        End If
      End If
    Next i
    .Close
  End With
  Set DummyRst = Nothing
End Function
Avatar billede jensen363 Forsker
30. oktober 2012 - 10:28 #2
Har slet ikke haft tid til at teste, men med sædvanlig tiltro til at dine løsninger ikke er helt skæve, får du point nu :-)
Avatar billede fdata Forsker
30. oktober 2012 - 19:54 #3
Hi hi. Håber, jeg kan leve op til din tillid. Takker for point ;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
Dyk ned i databasernes verden på et af vores praksisnære Access-kurser

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



IT-JOB