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