25. september 2012 - 16:15Der 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
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
Hi hi. Håber, jeg kan leve op til din tillid. Takker for point ;O)
Synes godt om
Ny brugerNybegynder
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.