schneerunzel
Goto Top

Excel: Daten aus externer Quelle

Hallo zusammen,

folgende Situation: Ich habe Daten aus einer Quelle. In diesem Fall eine einfach HTML Tabelle aus dem Intranet. Diese Daten lade ich in Excel einfach über die Funktion: Externe Daten Abrufen aus Web.

Die Tabelle wird regelmäßig automatisch ergänzt. Einmal eingetragene Zeilen ändern sich aber nicht mehr.
Ich möchte jetzt die Daten in Excel übernehmen und dort ggf überschreiben können.
Beispiel: in einer Zelle steht ein falscher Wert. Diesen möchte ich in Excel korrigieren können, ohne das dieser mir mit dem nächsten Aktualisieren wieder überschrieben wird. In der HTML Tabelle würde weiterhin der falsche Wert drin stehen.

Hat jemand eine Idee?

Meine erste Idee war, die Daten aus dem Tabellenblatt mit der Verknüpfung zu der HTML Tabelle irgenwie per Makro? in eine anderes Tabellen Blatt zu kopieren. Leider habe ich so etwas noch nie gemacht.

Vielen Dank für die Hilfe

Content-ID: 511157

Url: https://administrator.de/contentid/511157

Ausgedruckt am: 25.11.2024 um 06:11 Uhr

Kraemer
Kraemer 01.11.2019 aktualisiert um 16:45:27 Uhr
Goto Top
Moin,


Zitat von @schneerunzel:
Meine erste Idee war, die Daten aus dem Tabellenblatt mit der Verknüpfung zu der HTML Tabelle irgenwie per Makro? in eine anderes Tabellen Blatt zu kopieren. Leider habe ich so etwas noch nie gemacht.

STRG+A
STRG+C
ALT+SHIFT+F1
STRG+ALT+V
ALT+W
ENTER

Gruß
erikro
erikro 01.11.2019 um 17:04:52 Uhr
Goto Top
Zitat von @Kraemer:
STRG+A
> STRG+C
> ALT+SHIFT+F1

ALT-TAB # fehlte hier ;-)

> STRG+ALT+V
> ALT+W
> ENTER
> 
Kraemer
Kraemer 01.11.2019 um 17:10:58 Uhr
Goto Top
Zitat von @erikro:
ALT-TAB # fehlte hier face-wink
nope - damit würdest du - vorausgesetzt eine weitere Anwendung läuft - Excel verlassen
schneerunzel
schneerunzel 01.11.2019 um 17:34:05 Uhr
Goto Top
Zitat von @Kraemer:

Moin,


Zitat von @schneerunzel:
Meine erste Idee war, die Daten aus dem Tabellenblatt mit der Verknüpfung zu der HTML Tabelle irgenwie per Makro? in eine anderes Tabellen Blatt zu kopieren. Leider habe ich so etwas noch nie gemacht.

STRG+A
> STRG+C
> ALT+SHIFT+F1
> STRG+ALT+V
> ALT+W
> ENTER
> 

Gruß


Vielen Dank schon mal für die schnelle Antwort.
Ich bin mir nur nicht sicher, ob das wirklich das richtige ist.

STRG+A - Alles Markieren
> STRG+C - Kopieren
> ALT+SHIFT+F1 - Neues Tabellenblatt
> STRG+ALT+V - Einfügen
> ALT+W - Nur Werte
> ENTER
> 

Ich glaube da habe ich mich dann nicht richtig ausgedrückt.

Die Excel Tabelle ist für mich ein laufendes Arbeitswerkzeug.
Sprich damit wird nicht nur einmal gearbeitet sondern immer und immer wieder.
Mit jeder Übertragung ein neues Tabellenblatt anlegen ist da keine Lösung.

Ich brauche eine Tabellenblatt auf das ich auch mit SVereweisen und Ähnlichen Zugriffen kann was definiert ist.
Wenn ich neue Daten aus den Schnittstellen in die HTML Tabelle bekommen, sollen die neuen Datensätze Hinzugefügt werden, die schon vorhandenen sollen aber nicht aktualisiert werden. Ich brauche da schon einen wirklichen Abgleich.
schneerunzel
schneerunzel 01.11.2019 aktualisiert um 17:40:56 Uhr
Goto Top
Ist es nicht möglich, statt der Externen Datenverbindung und dem vollen Import den Abgleich mit dem Web in wenigen Zeilen in VBA zu schreiben?
Sprich quasi:

Lese Liste in Web
Ist ID nicht in Spalte A dann füge am ende der Tabelle die werte ein

Geht sowas mit VBA?
erikro
erikro 01.11.2019 um 17:53:50 Uhr
Goto Top
Zitat von @Kraemer:

Zitat von @erikro:
ALT-TAB # fehlte hier face-wink
nope - damit würdest du - vorausgesetzt eine weitere Anwendung läuft - Excel verlassen

Ach so meinen. Direkt aus Excel heraus kopieren und einfügen. Dann aber statt ALT-W nur W. Oder?
em-pie
em-pie 01.11.2019 aktualisiert um 17:59:37 Uhr
Goto Top
Moin,

Zitat von @schneerunzel:
Geht sowas mit VBA?

Gehen tut fast alles, aber du wirsft ja nicht gerade mit Infos um dich...

  • Gibt es Schlüsselfelder (IDs, Zeitstempel, ...) in der HTML-Tabelle?
  • Werden neue Datensätze immer zu Beginn oder ans Ende der HTML-Tabelle eingefügt oder sind die quer durcheinander?
  • Wie sieht die Zielstruktur (Excel) aus?

Optimal wäre es, wenn du Beispiele (anonymisiert) hier per Screenshot mal bereitstellen würdest.

Gruß
em-pie
schneerunzel
schneerunzel 03.11.2019 um 18:42:45 Uhr
Goto Top
Hi,

Die Tabelle könnte ich ggf noch beeinflussen. Eine ID wäre durchaus relativ einfach möglich.

Ich habe dieses Anforderung für unterschiedliche Einsatzzwecken.

Hier einmal ein Beispiel:
Ich habe Anmeldungen zu einer Veranstaltung die aus unterschiedlichen Quellen können und per PHP zu der Tabelle zusammengeführt werden. Dadurch wäre eine ID das kleinste Problem.
Neue Einträge werden immer ans Ende der Tabelle geschrieben.

Da diese Anmeldungen häufig Fehler enthalten, müssen diese Daten ggf korrigiert werden (z.B. Tippfehler im Namen, falsche Telefonnummer, Absage oder ähnliches). Daher muss die Exceltabelle das Führende Medium sein.
colinardo
colinardo 08.11.2019 aktualisiert um 11:02:36 Uhr
Goto Top
Servus Schneerunzel.
Man nehme als Bsp. folgende HTML Datei an von der die Daten abgerufen werden
<!DOCTYPE HTML>
<html>
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=utf-8">  
	<meta http-equiv="pragma" content="no-cache" />  
	<title>HTML Dokument</title>
</head>                                         
<body>       
      <table border="0" width="" id="mytable">  
	      <tr>
	      	<th>ID</th>
	      	<th>Spalte 2</th>
	      	<th>Spalte 3</th>
	      	<th>Spalte 4</th>
	      	<th>Spalte 5</th>
	      </tr>
	      <tr>
	      	<td>1</td>
	      	<td>200</td>
	      	<td>300</td>
	      	<td>400</td>
	      	<td>500</td>
	      </tr>
	      <tr>
	      	<td>2</td>
	      	<td>2000</td>
	      	<td>3000</td>
	      	<td>4000</td>
	      	<td>5000</td>
	      </tr>
	      <tr>
	      	<td>3</td>
	      	<td>20000</td>
	      	<td>30000</td>
	      	<td>40000</td>
	      	<td>50000</td>
	      </tr>
	    </table>     
</body>
</html>
Dann nehme man den folgenden VBA Code, passe die abgerufene URL und das ID-Attribut der Tabelle auf der jeweiligen Seite an, zusätzlich welche Spalte auf der HTML-Tabelle und in der Lokalen Tabelle die Schlüsselspalte sein soll.
(Das Beispiel ist auf die obige HTML-Tabelle angepasst bei der die ID "mytable" lautet und die Schlüsselspalte die erste Spalte ist. Kommentare zu jeder Zeile findest du im Code unten.)

Der Code fügt nur Zeilen in die lokale Tabelle ein sofern die ID lokal noch nicht vorhanden ist.

Sollte die HTML/PHP-Seite Ihre Daten nicht explizit vom Cache ausnehmen durch entsprechende Header oder META-Tags musst du der URL im Nachhinein noch einen random URL-Parameter mitgeben (z.B. mit den ticks der aktuellen Zeit) damit die HTML-Daten nicht aus dem Cache abgerufen werden.
Sub OneWaySyncHtmlTableWithLocalTable()
    On Error GoTo Errhandler
    ' Variables  
    Dim tbl As String, ws As Worksheet, objIE As Object, objTable As Object, tblLocal As ListObject, lRow As ListRow, rngOut As Range, r As Long, c As Long, strID As String, f As Range
    ' Work on Sheet 1  
    With Sheets(1)
        ' create ie object  
        Set objIE = CreateObject("InternetExplorer.Application")  
        ' work with ie object  
        With objIE
            ' window is hidden  
            .Visible = False
            ' navigate to website  
            .Navigate "https://domain.tld.net/seite.html"  
            ' wait while loading  
            While .Busy
               DoEvents
            Wend
            ' find table dom object with id attribute  
            Set objTable = .document.GetElementById("mytable")  
            ' if table not found exit sub  
            If objTable Is Nothing Then
                MsgBox "Tabelle konnte nicht geladen werden.", vbExclamation  
                Exit Sub
            End If
            ' load table data into 2-dimensional array object  
            Dim arrData As Variant
            With objTable
                ReDim arrData(0 To .Rows.Length - 1, 0 To .Rows(1).Cells.Length - 1)
                For r = 0 To .Rows.Length - 1
                    For c = 0 To .Rows(r).Cells.Length - 1
                        arrData(r, c) = .Rows(r).Cells(c).innerText
                    Next
                Next
            End With
        End With
        On Error Resume Next
        ' refer to local datatable as listobject  
        Set tblLocal = .ListObjects("mydatatable")  
        If Err.Number <> 0 Then
            ' local table does not exist, write table data to range and create list object from it  
            Set rngOut = .Range("A1").Resize(UBound(arrData, 1) + 1, UBound(arrData, 2) + 1)  
            rngOut.Value = arrData
            Set tblLocal = .ListObjects.Add(xlSrcRange, rngOut)
            tblLocal.Name = "mydatatable"  
        Else
            ' Local table listobject already exists  
            With objTable
                ' for each row (exlcluding headers) in web data  
                For r = 1 To UBound(arrData, 1)
                    ' column 1 of web data is our reference column  
                    strID = arrData(r, 0)
                    ' find reference in column 1 in listobject  
                    Set f = tblLocal.ListColumns(1).DataBodyRange.Find(strID, LookIn:=xlValues, LookAt:=xlWhole)
                    ' only if it was not found  
                    If f Is Nothing Then
                        ' create new ListRow  
                        Set lRow = tblLocal.ListRows.Add
                        ' and add data from current row to ListObject  
                        For c = 0 To UBound(arrData, 2)
                            lRow.Range(1, c + 1).Value = arrData(r, c)
                        Next
                    End If
                Next
            End With
        End If
        On Error GoTo Errhandler
        ' quit IE  
        objIE.Quit
    End With
    Exit Sub
Errhandler:
    If Not objIE Is Nothing Then objIE.Quit
    MsgBox "Es ist ein Fehler aufgetreten:" & vbNewLine & vbNewLine & Err.Description, vbExclamation  
End Sub
Viel Spaß
Grüße Uwe