Automatisk uppdatering av resultatlistor


I det här mer omfattande tipset visas hur vi kan dra nytta av att kombinera avancerade kalkylbladsfunktioner och programmering i VBA-miljö för att skapa automatisk uppdatering av resultatlistor.

Detta kan komma till nytta i många sammanhang, inte minst inom idrottsrörelsen och när vi hämtar och förädlar större datamängder av annat slag i XL.

 

Vill du få reda på hur vi:


Exemplet bygger på följande förutsättningar:


Skapa matchprogrammet
Tabellen nedan visar matchprogrammet i sin helhet:


I kolumnen E räknar XL fram vinnaren eller vid oavgjort visas tecknet "o". Denna information ligger till grund för resultatlistan men kan med fördel döljas i en färdig modell.

Följande matrisformel ligger till grund för det och kopieras nedåt i kolumnen:

 

Skapa den automatiska uppdaterade resultatlistan

Tabellen nedan visar resultatlistan i sin helhet:


Vid uppbyggnad av resultatlistan skrivs samtliga namnen in manuellt i listan.

Rubriken med antal omgångar genereras av följande formel:

Antal vunna matcher räknas fram mha följande matrisformel:

Antal oavgjorda matcher erhålls genom följande matrisformel:

Antal förlorade matcher identifieras mha följande formel:

Antal gjorda respektive insläppta mål erhålls den mer komplexa (!) matrisformeln:

Antal poäng summeras ihop mha formeln:


Räkna målskillnad och sortera listan
Dessa två aktiviteter sker varje gång det matas in tecken i arbetsbladet genom nedanstående VBA-lösningar.

I det berörda arbetsbladets modul placeras följande kod:

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Call MalSkillnad
Call Resultat_Sortering
End Sub

I en vanlig modul placeras följande procedurer:

Sub MalSkillnad()
Dim rnOmrade As Range
Dim rnCell As Range
Dim iAntalTecken As Integer
Dim iTextLangd As Integer

'I exemplet innefattas namnet "Mål" av cellområdet G10:G13 
Set rnOmrade = Range("Mål")

'Här loopas cellområdet igenom och evaluering sker av
'innehållet
For Each rnCell In rnOmrade
'Här identifieras "-"-tecknets position och textlängden
      iAntalTecken = Application.WorksheetFunction.Find("-", rnCell)
      iTextLangd = Len(rnCell)

'Textlängden är den styrande faktorn förr vad som ska ske därav
'Select-satsen 
Select Case iTextLangd
Case 3
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 1)) - CInt(Right(rnCell, 1))
Case 4
If iAntalTecken = 2 Then
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 1)) - CInt(Right(rnCell, 2))
ElseIf iAntalTecken = 3 Then
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 2)) - CInt(Right(rnCell, 1))
Else
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 1)) - CInt(Right(rnCell, 2))
End If
Case 5
If iAntalTecken = 3 Then
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 2)) - CInt(Right(rnCell, 2))
ElseIf iAntalTecken = 4 Then
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 3)) - CInt(Right(rnCell, 1))
Else
      rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 1)) - CInt(Right(rnCell, 3))
End If
Case 6

If iAntalTecken = 4 Then
     rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 3)) - CInt(Right(rnCell, 2))
Else
     rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 2)) - CInt(Right(rnCell, 3))
End If

Case 7
     rnCell.Offset(0, 1).Value = CInt(Left(rnCell, 3)) - CInt(Right(rnCell, 3))

End Select
Next rnCell

End Sub


Avslutningsvis sker en sortering, vilket sker med följande procedur:

Sub Resultat_Sortering()
Dim rnSortering As Range

'Namnområdet Resultatlista omfattas i exemplet av
'B10:I13 - Ej placeringkolumnen!
Set rnSortering = Range("ResultatLista")

rnSortering.Sort _
          Key1:=Range("I10"), Order1:=xlDescending, _
          Key2:=Range("H10"), Order2:=xlDescending, _
          Key3:=Range("D10"), Order3:=xlDescending, _
          Orientation:=xlTopToBottom
End Sub