Tutorial – BBV Spielergebnisse in eigenes Canva Design umwandeln

Möchtest du die Spielergebnisse deines Teams ansprechend auf Social Media präsentieren? In diesem Tutorial zeige ich dir, wie du Daten von der BBV (Bayerischer Badminton Verband) Webseite mit Hilfe von Canva und LibreOffice Calc importierst und automatisch in dein Design einfügst. So kannst du mit wenigen Klicks professionelle Grafiken für Social Media oder die Vereinsseite erstellen!

Weiterer Vorteil: Dein Verein wird immer als erstes genannt (Ergebnisse getauscht), auch wenn du nicht die Heimmannschaft bist 😉

Vorbereitung: Canva-Design

Bevor wir die Ergebnisse importieren, muss dein Canva-Design vorbereitet werden:

  1. Ein neues Design erstellen: Öffne Canva und erstelle ein neues Design mit den gewünschten Maßen, Bildern und Textfeldern.
    Tip: nutze als Platzhalter bereits lange Namen, damit später dein Design nicht verrutscht.

2. Textfelder verknüpfen: Klicke hierfür auf der linken Seite auf „Data Autofill“. Wenn du jetzt auf ein Textfeld klickst, erscheint oben in der Bearbeitungs-Leiste das Feld „Datenfeld„. Hier legst du einfach deine entsprechenden Datenfelder an.

WICHTIG: Die Datenfelder müssen die gleichen Bezeichnungen haben wie im Header der CSV Datei später angegeben. Verwendest du mein Makro sollten es folgende Datenfelder sein:

„Verein1“, „Verein2“, „Verein1 Punkte“, „Verein2 Punkte“, „1.HD“, „1.HD Team 1“, „1.HD Score 1“, „1.HD Team 2“, „1.HD Score 2“, „1.HD Ergebnis“, „2.HD“, „2.HD Team 1“, „2.HD Score 1“, „2.HD Team 2“, „2.HD Score 2“, „2.HD Ergebnis“, „DD“, „DD Team 1“, „DD Score 1“, „DD Team 2“, „DD Score 2“, „DD Ergebnis“, „1.HE“, „1.HE Team 1“, „1.HE Score 1“, „1.HE Team 2“, „1.HE Score 2“, „1.HE Ergebnis“, „2.HE“, „2.HE Team 1“, „2.HE Score 1“, „2.HE Team 2“, „2.HE Score 2“, „2.HE Ergebnis“, „DE“, „DE Team 1“, „DE Score 1“, „DE Team 2“, „DE Score 2“, „DE Ergebnis“, „3.HE“, „3.HE Team 1“, „3.HE Score 1“, „3.HE Team 2“, „3.HE Score 2“, „3.HE Ergebnis“, „GD“, „GD Team 1“, „GD Score 1“, „GD Team 2“, „GD Score 2“, „GD Ergebnis“


Vorbereitung: LibreOffice Calc Makro erstellen

  1. Öffne LibreOffice Calc
  2. Öffne das Makro Menü mit der Tastenkombination „ALT + F11
  3. Klicke auf „Verwalten
  4. Erstelle ein neues Module mit „Neu…
  5. Benenne das Module. z.B. „Badminton“
  6. Wähle das erstellte Module (Badminton) aus und klicke auf „Bearbeiten
  7. Kopiere den Makro Code (findest du am Ende des Beitrags) in das rechte Feld, wo aktuell „REM BASIC Sub Main End Sub“ steht
  8. Ändere folgende Zeile: (WICHTIG)
    • Zeile 96: Ändere die beiden Texte „1. BC Straubing“ und „1. BC Straubing II“ in den Namen deines Vereins / Teams
  9. Speichere das Makro (mit STRG-S)
  10. Schließe das Fenster

Spielergebnis von der BBV Webseite kopieren

  1. BBV Webseite aufrufen: Gehe auf die Seite des Bayerischen Badminton Verbands und rufe die aktuellen Spielergebnisse auf.
  2. Ergebnisse kopieren: Markiere die relevanten Ergebnisse und kopiere sie mit Strg + C (Windows) oder Cmd + C (Mac).

    Wichtig: Bitte genau diesen Teil so markieren wie auf dem Bild!

Daten in LibreOffice Calc formatieren

  1. LibreOffice Calc öffnen: Starte LibreOffice Calc und erstelle eine neue Tabelle.
  2. Daten einfügen: Füge die kopierten Daten mit Strg + V oder Cmd + V in eine neue Tabelle ein.

    Hinweis: Du kannst beliebig viele Spielergebnisse in diese Tabelle untereinander kopieren. Für jedes Spielergebnis wird später ein Design erstellt.
  3. Makro ausführen: Führe jetzt das Makro aus. Klicke hierfür ALT-F11 um ins Makro Menü zu kommen. Wähle dann „convertBadmintonResults“ aus und klicke auf „Ausführen
  4. Das Makro wird die aktuellen Spielergebnisse in einzelne Zeilen umwandeln und in das Tabellenblatt „Game Result“ schreiben
  5. Zum Tabellenblatt „Game Result“ wechseln: Sollte das Tabellenblatt nicht automatisch auf das Blatt „Game Result“ wechseln, mache diese bitte manuell. (Wichtig)
  6. Als CSV-Datei speichern: Speichere das aktuelle Tabellenblatt (Game Result) als CSV (Comma-Separated Values), damit Canva die Daten lesen kann. Achte darauf, dass das Trennzeichen ein Komma oder Semikolon ist.

CSV-Datei in Canva importieren

  1. Canva Design öffnen: Öffne dein zuvor erstelltes Canva-Design.
  2. „Data Autofill“ öffnen: Klicke links im Menü auf „Data Autofill“.
  3. Datenquelle auswählen: Wähle die zuvor gespeicherte CSV-Datei aus.
  4. Automatische Befüllung ausführen: Canva füllt die verknüpften Felder automatisch mit den importierten Daten.
    Wichtig: sollten einige der Felder nicht lila hinterlegt sein, bedeutet das, dass der Datenfeld Name, nicht mit dem in der CSV Datei übereinstimmt

Fazit

Mit diesen einfachen Schritten kannst du die Spielergebnisse deines Teams schnell und professionell visualisieren. Egal ob für Instagram, Facebook oder den Vereins-Newsletter – durch die Automatisierung sparst du Zeit und kannst dich auf das Wesentliche konzentrieren: den Sport! 🎉🏸

Viel Spaß beim Erstellen deiner individuellen Designs! 😊

Makro Code

Private Type Game
verein1 as STRING
verein2 as STRING
score1 as Integer
score2 as Integer
matches(7) as Match
End Type

Private  Type Match
 	disziplin As String
    spieler1 As String
    spieler2 As String
    matchResult as MatchResult
End Type

Private Type MatchResult
 score1 as Integer
 score2 as Integer
 points1 as new Collection
 points2 as new Collection
END TYPE

Sub convertBadmintonResults()
    Dim Doc As Object
    Dim Sheets As Object
    Dim sheetName As String
    Dim Sheet As Object
    Dim SheetResult As Object
    Dim Row As Integer
    Dim Cell As Object
    Dim lastRow as Integer
    
	Dim games as new Collection
	
    ' Aktuelles Tabellenblatt auswählen
    Sheet = ThisComponent.Sheets(0) ' Erstes Tabellenblatt (Index 0)
	lastRow = GetLastUsedRow(Sheet)
   
    ' Aktuelles Dokument abrufen
    Doc = ThisComponent
    Sheets = Doc.Sheets
   
   ' Sheet-Name in Variable speichern
    sheetName = "Game Result"
    
	If Sheets.hasByName(sheetName) Then
    	Sheets.removeByName(sheetName)
    End If
    ' Neues Blatt am Ende einfügen
    Sheets.insertNewByName(sheetName, Sheets.getCount())

    ' Referenz zum Blatt abrufen (existierend oder neu erstellt)
    SheetResult = Sheets.getByName(sheetName)

    ' Optional: Blatt aktiv setzen
    Doc.CurrentController.setActiveSheet(SheetResult)
   
   
   
    For row = 0 To lastRow
       If Sheet.getCellByPosition(0, row).String = "Disziplin" Then
       	games.Add(parseGame(Sheet, row))
       End If
    Next row
    
    printGameHeaderToSheet(SheetResult, 0)
    
    Dim gameIndex As Integer
    For gameIndex = 1 To games.Count
       printGameToSheet(SheetResult, gameIndex, games(gameIndex))
    Next gameIndex
    
End Sub

Private FUNCTION parseGame(Sheet as Object, startRow as Integer) as Game
		
    Dim game as new Game
    
    ' Vereine bestimmen
	game.verein1 = Sheet.getCellByPosition(1, startRow).String ' Spalte B
    game.verein2 = Sheet.getCellByPosition(3, startRow).String ' Spalte D
    game.matches = new Collection
    
    For row = startRow+1 To startRow+8
    	Dim match as Match
    	match = parseMatch(Sheet, row)
    	if match.matchResult.score1 > match.matchResult.score2 then
    		game.score1 = game.score1 + 1
    	else
    		game.score2 = game.score2 + 1
    	end if
       	
       	game.matches.Add(match)   	     
    Next row
    
    If game.verein2 = "1. BC Straubing" or game.verein2 = "1. BC Straubing II"  Then
    	tauschen(game)
    End If

	parseGame = game

End Function

Private FUNCTION parseMatch(Sheet as Object, row as Integer) As Match
 ' Werte aus den Spalten in Variablen speichern
               
       	Dim match as new  Match
        
        match.disziplin = Sheet.getCellByPosition(0, row).String ' Spalte A
        match.spieler1 = Sheet.getCellByPosition(1, row).String ' Spalte B
        match.spieler2 = Sheet.getCellByPosition(3, row).String ' Spalte D
       
        Ergebnis = Sheet.getCellByPosition(4, row).String ' Spalte E
   		match.matchResult = GetMatchResult(Ergebnis)
   		
   		parseMatch = match
END FUNCTION


Private Function GetMatchResult(ergebnis as String) As MatchResult 
	Dim matchResult as new MatchResult
	
	matchResult.points1 = new Collection
	matchResult.points2 = new Collection
      
    ' Ergebnis-String splitten (z. B. "21:14 4:21 11:21")
    Dim spiele() As String
    spiele = Split(ergebnis, " ")
    

    ' Punkte für jedes Spiel speichern
    Dim i As Integer
    For i = 0 To UBound(spiele)
        Dim punkte() As String
        punkte = Split(spiele(i), ":") ' "21:14" → {21, 14}
        
        ' Werte ins Dictionary schreiben
        matchResult.points1.Add(CInt(punkte(0))) ' Spieler 1 Punkte
        matchResult.points2.Add(CInt(punkte(1))) ' Spieler 2 Punkte
        
        ' Sieger bestimmen
        If CInt(punkte(0)) > CInt(punkte(1)) Then
            matchResult.score1 = matchResult.score1 + 1
        Else
            matchResult.score2 = matchResult.score2 + 1
        End If
    Next i
        
    GetMatchResult = matchResult
End Function


Private Function tauschen(game as Game) as Game
		' Vereine tauschen
        Dim temp As String
        temp = game.verein1
        game.verein1 = game.verein2
        game.verein2 = temp
        
        Dim tempGameScore as Integer
        tempGameScore = game.score1
        game.score1 = game.score2
        game.score2 = tempGameScore

        ' Match (Spieler und Ergebnis tauschen)
        Dim tempPlayer As String
        Dim tempScore as Integer
        Dim tempPoints as Object
       	For Each match In game.matches
            ' Spieler tauschen
            tempPlayer = match.spieler1
            match.spieler1 = match.spieler2
            match.spieler2 = tempPlayer
            
        	'match result tauschen   
       	 	tempScore = match.matchResult.score1
       		match.matchResult.score1 = match.matchResult.score2
        	match.matchResult.score2 = tempScore
        	
            'match points tauschen
            tempPoints = match.matchResult.points1
            match.matchResult.points1 = match.matchResult.points2
            match.matchResult.points2 = tempPoints
            		
        Next match
End Function

Private Function JoinCollection(col As Object, separator As String) As String
    Dim item As Variant
    Dim result As String
    result = ""

    ' Durch die Collection iterieren
    For Each item In col
        If result = "" Then
            result = item ' Erstes Element ohne Separator
        Else
            result = result & separator & item ' Weitere mit Separator hinzufügen
        End If
    Next item

    JoinCollection = result
End Function

Private Function GetLastUsedRow(sheet As Object) As Integer
    Dim cursor As Object
    cursor = sheet.createCursor()
    cursor.gotoEndOfUsedArea(True)
    GetLastUsedRow = cursor.RangeAddress.EndRow
End Function

Private Function printGameHeaderToSheet(oSheet as Object, zeile as Integer)
    oSheet.getCellByPosition(0, zeile).String = "Verein1"
    oSheet.getCellByPosition(1, zeile).String = "Verein2"
    oSheet.getCellByPosition(2, zeile).String = "Verein1 Punkte"
    oSheet.getCellByPosition(3, zeile).String = "Verein2 Punkte"
    
    Dim disciplines As Variant
    disciplines = Array("1.HD", "2.HD", "DD", "1.HE", "2.HE", "DE", "3.HE", "GD")

    Dim col As Integer
    col = 4 ' Startspalte für Disziplinen

    Dim i As Integer
    For i = LBound(disciplines) To UBound(disciplines)
        oSheet.getCellByPosition(col, zeile).String = disciplines(i)
        oSheet.getCellByPosition(col + 1, zeile).String = disciplines(i) & " Team 1"
        oSheet.getCellByPosition(col + 2, zeile).String = disciplines(i) & " Score 1"
        oSheet.getCellByPosition(col + 3, zeile).String = disciplines(i) & " Team 2"
        oSheet.getCellByPosition(col + 4, zeile).String = disciplines(i) & " Score 2"
        oSheet.getCellByPosition(col + 5, zeile).String = disciplines(i) & " Ergebnis"
        col = col + 6 ' Nächster Block beginnt 6 Spalten weiter
    Next i
End Function

Private Function printGameToSheet(oSheet as Object, zeile as Integer, game As Game)
    oSheet.getCellByPosition(0, zeile).String = game.verein1
    oSheet.getCellByPosition(1, zeile).String = game.verein2
    oSheet.getCellByPosition(2, zeile).String = game.score1
    oSheet.getCellByPosition(3, zeile).String = game.score2
    
    Dim col As Integer
    col = 4 ' Startspalte für Disziplinen
    Dim i As Integer
    For i = 1 To game.matches.Count
        oSheet.getCellByPosition(col, zeile).String = game.matches(i).disziplin
        oSheet.getCellByPosition(col + 1, zeile).String = game.matches(i).spieler1
        oSheet.getCellByPosition(col + 2, zeile).String = game.matches(i).matchResult.score1
        oSheet.getCellByPosition(col + 3, zeile).String = game.matches(i).spieler2
        oSheet.getCellByPosition(col + 4, zeile).String = game.matches(i).matchResult.score2
        oSheet.getCellByPosition(col + 5, zeile).String = pointsToString(game.matches(i).matchResult.points1, game.matches(i).matchResult.points2)
        col = col + 6 ' Nächster Block beginnt 6 Spalten weiter
    Next i
End Function

Private Function printGame(games as Object)
 
    For Each game in games
		For Each match In game.matches
      	  MsgBox "Verein 1: " & game.verein1 & Chr(10) & _
         		"Verein 2: " & game.verein2 & Chr(10) & _
         	 	"Disziplin: " & match.disziplin & Chr(10) & _
              	"Spieler 1: " & match.spieler1 & Chr(10) & _
                "Spieler 2: " & match.spieler2 & Chr(10) & _
                "Match: " & match.matchResult.score1 & ":" & match.matchResult.score2 & Chr(10) & _
                "Points1: " & JoinCollection(match.matchResult.points1, ",") & Chr(10) & _
                "Points2: " & JoinCollection(match.matchResult.points2, ",") & Chr(10)  _
                , 64, "Spielinfo"
		Next match
	Next game
End Function

Private Function pointsToString(col1 As Object, col2 As Object) as String
	Dim ergebnis as new Collection
	
	for i = 1 to col1.Count
		matchErgebnis = col1.Item(i) & ":" & col2.Item(i)  
		ergebnis.Add(matchErgebnis)
	next i
	
	pointsToString = JoinCollection(ergebnis, " | ")
End Function
Nach oben scrollen