Hey redders in (luxe) nood!
Ik probeer d.m.v. een VBA script data uit mijn Strava account te halen.
Het lukt mij om via VBA:
Het probleem heb ik (denk ik) al geconstateerd en dat is dat wanneer ik de paginabron bekijk, ik dit krijg:
Of te wel: de juiste tabel wordt in de basiscode wel aangemaakt, maar niet gevuld, dit gebeurd vanuit de template, en gebeurd dus na het laden van de pagina zelf.
Wanneer ik echter op inspecteren klik in de browser, krijg ik dit:
Dus wel de gehele website zoals deze uiteindelijk weergegeven wordt.
Nu wil ik dus vanuit VBA de activiteitendata ophalen. Iemand een idee hoe ik dat kan doen? Als ik maar eenmaal in de goede regels kan komen, kom ik daarna wel weer verder.
Dit is wat ik tot nu toe heb:
De MSGBOXes die vooraan staan gebruik ik puur om te controleren hoever ik kom met mijn code. De tabel wordt dus wel gevonden, maar daarna niet meer...
Hoop dat iemand kan helpen/meedenken.
Alvast bedankt!
Ik probeer d.m.v. een VBA script data uit mijn Strava account te halen.
Het lukt mij om via VBA:
- In te loggen
- Mijn accountnaam er uit te halen
- Mijn profielfoto er af te plukken
- Te wisselen tussen de verschillende Strava-pagina's
- Aan het eind weer uit te loggen
- Tussendoor de pagina met activiteiten te bereiken
- En daar de juiste tabel te vinden
Het probleem heb ik (denk ik) al geconstateerd en dat is dat wanneer ik de paginabron bekijk, ik dit krijg:
HTML:
<table class='table table-striped table-padded activities table-sortable' id='search-results'>
<thead>...</thead>
<tbody></tbody>
</table>
</div>
<nav class='text-center'>
<div class='simple pagination'></div>
</nav>
</div>
<script id='loading-template' type='text/template'>
<tr>
<td class='updating-col' colspan='8'>
<div class='mt-lg mb-lg'><div class='spinner sm vcentered' style=''>
<div class='graphic'></div>
<span class='status'>Bezig met laden...</span>
</div></div>
</td>
</tr>
</script>
<script id='activity-template' type='text/template'>
<td class='view-col col-type' data-field-name='type'>{{ display_type }}</td>
<td class='view-col col-date'>{{ start_date }}</td>
<td class='view-col col-title'>
<a data-field-name='name' href='{{ activity_url }}'>{{ name }}</a>
<div class='icon-private app-icon icon-xs icon-dark' data-field-name='private' style='display: none;' title='Privé'></div>
<% if (flagged) { %>
<span class='icon flag' title='Gemeld'>
⚑
</span>
<% } %>
</td>
Wanneer ik echter op inspecteren klik in de browser, krijg ik dit:
HTML:
<table class="table table-striped table-padded activities table-sortable" id="search-results">
<thead>...</thead>
<tbody>
<tr class="training-activity-row">
<td class="view-col col-type" data-field-name="type" style="display: table-cell;">Rit</td>
<td class="view-col col-date" style="display: table-cell;">zo 19-8-2018</td>
<td class="view-col col-title" style="display: table-cell;">
<a data-field-name="name" href="https://www.strava.com/activities/1782743091">Rondje Ark van Noach</a>
<div class="icon-private app-icon icon-xs icon-dark" data-field-name="private" style="display: none;" title="Privé"></div>
</td>
<td class="view-col col-time" data-field-name="time" style="display: table-cell;">1:23:46</td>
<td class="view-col col-dist" style="display: table-cell;">
42,82
<abbr class="unit" title="kilometer">
km
</abbr>
</td>
<td class="view-col col-elev" style="display: table-cell;">
51
<abbr class="unit" title="meter">m</abbr>
</td>
Nu wil ik dus vanuit VBA de activiteitendata ophalen. Iemand een idee hoe ik dat kan doen? Als ik maar eenmaal in de goede regels kan komen, kom ik daarna wel weer verder.
Dit is wat ik tot nu toe heb:
Code:
Sub ImportStravaData()
On Error GoTo ErrorHandling
' Controle op account
If Sheets("StravaData").Range("B1").Value <> "" Then
' Inloggen
Call Inloggen
' Tellen hoeveel activiteiten al in het overzicht staan
Dim Activiteiten As Integer
Dim Tabel As ListObject
Set Tabel = Sheets("StravaData").ListObjects("StravaData")
Activiteiten = Tabel.ListRows.Count
' Variabelen maken
Dim Link As String
Dim Datum As String
Dim Jaar As Integer
Dim Maand As Integer
Dim Dag As Integer
Dim Sport As String
Dim Omschrijving As String
Dim Tijd As String
Dim Afstand As String
Dim GemTempo As String
Dim MaxTempo As String
Dim GemSnelheid As String
Dim MaxSnelheid As String
Dim GemHart As String
Dim MaxHart As String
Dim Hoogte As String
Dim ID As String
Dim TBL As Object
Dim TBLs As Object
Dim TR As Object
Dim TD As Object
Dim A As Object
Dim RijTeller As Integer
RijTeller = 4
' Data ophalen
If Activiteiten = 0 Then
' Geen activiteiten in overzicht, dus alles downloaden
With IE
.navigate "https://www.strava.com/athlete/training"
Do While .readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait (Now() + TimeValue("00:00:05"))
' ##### VANAF HIER WORDT HET INTERESSANT #####
MsgBox "Site geladen"
' Data verzamelen
Set TBLs = .document.getElementsByTagName("table")
For Each TBL In TBLs
MsgBox "Tabellen gevonden"
' Juiste tabel zoeken
If TBL.ID = "search-results" Then
MsgBox "Juiste tabel gevonden"
Set TR = TBL.getElementsByTagName("tr")
For Each TBLrij In TR
' Juiste tabel rij pakken
If TR.className = "training-activity-row" Then
MsgBox "Juiste rij gevonden"
For Each TD In TBLrij.getElementsByTagName("td")
' Data uit cellen trekken
If TD.className = "view-col col-date" Then
Datum = TD.innerHTML
Jaar = Right(TD.innerHTML, 4)
Maand = Replace(Mid(TD.innerHTML, InStr(1, TD.innerHTML, "-") + 1, 2), "-", "")
Dag = Replace(Mid(TD.innerHTML, InStr(1, TD.innerHTML, " ") + 1, 2), "-", "")
Sheets("StravaData").Range("A" & RijTeller).Value = Datum
Sheets("StravaData").Range("B" & RijTeller).Value = Jaar
Sheets("StravaData").Range("C" & RijTeller).Value = Maand
Sheets("StravaData").Range("D" & RijTeller).Value = Dag
ElseIf TD.className = "view-col col-type" Then
Sport = TD.innerHTML
Sheets("StravaData").Range("E" & RijTeller).Value = Sport
ElseIf TD.className = "view-col col-title" Then
Set A = TD.getElementsByTagName("a")
Link = A.href
Omschrijving = A.innerHTML
ID = Right(Link, Len(Link) - InStrRev(Link, "/"))
Sheets("StravaData").Range("F" & RijTeller).Value = Omschrijving
Sheets("StravaData").Range("P" & RijTeller).Value = ID
ElseIf TD.className = "view-col col-time" Then
Tijd = TD.innerHTML
Sheets("StravaData").Range("G" & RijTeller).Value = Tijd
ElseIf TD.className = "view-col col-dist" Then
Afstand = TD.innerHTML
Sheets("StravaData").Range("H" & RijTeller).Value = Afstand
ElseIf TD.className = "view-col col-elev" Then
Hoogte = TD.innerHTML
Sheets("StravaData").Range("O" & RijTeller).Value = Hoogte
End If
Next
End If
RijTeller = RijTeller + 1
Next
End If
Next
End With
Else
' Wel activiteiten in overzicht, dus alleen nieuwe downloaden
With IE
.navigate "https://www.strava.com/athlete/training"
Do While .readyState <> READYSTATE_COMPLETE
DoEvents
Loop
Application.Wait (Now() + TimeValue("00:00:05"))
' Data verzamelen
End With
End If
Set Tabel = Nothing
' Uitloggen
Call Uitloggen
Else
MsgBox "Geen account ingesteld. Reset eerst het account.", vbOKOnly + vbCritical, "Error"
End If
Exit Sub
ErrorHandling:
' Uitloggen
Call Uitloggen
End Sub
Hoop dat iemand kan helpen/meedenken.
Alvast bedankt!