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



Spielergebnis von der BBV Webseite kopieren
- BBV Webseite aufrufen: Gehe auf die Seite des Bayerischen Badminton Verbands und rufe die aktuellen Spielergebnisse auf.
- Ergebnisse kopieren: Markiere die relevanten Ergebnisse und kopiere sie mit
Strg + C
(Windows) oderCmd + C
(Mac).
Wichtig: Bitte genau diesen Teil so markieren wie auf dem Bild!

Daten in LibreOffice Calc formatieren
- LibreOffice Calc öffnen: Starte LibreOffice Calc und erstelle eine neue Tabelle.
- Daten einfügen: Füge die kopierten Daten mit
Strg + V
oderCmd + 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. - 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„
- Das Makro wird die aktuellen Spielergebnisse in einzelne Zeilen umwandeln und in das Tabellenblatt „Game Result“ schreiben
- Zum Tabellenblatt „Game Result“ wechseln: Sollte das Tabellenblatt nicht automatisch auf das Blatt „Game Result“ wechseln, mache diese bitte manuell. (Wichtig)
- 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
- Canva Design öffnen: Öffne dein zuvor erstelltes Canva-Design.
- „Data Autofill“ öffnen: Klicke links im Menü auf „Data Autofill“.
- Datenquelle auswählen: Wähle die zuvor gespeicherte CSV-Datei aus.
- 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