Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1412to1416
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Probleme beim Einfügen von Tabellen aus Browser

Probleme beim Einfügen von Tabellen aus Browser
06.03.2015 11:20:30
Tabellen
Ich habe hier eine Webanwendung auf Java-Basis, die Tabellen darstellt. Teile daraus soll der Anwender kopieren und in ein Excel-Formular einfügen. Den Schritt des Einfügens wollte ich dabei per VBA automatisieren, um anschließend auch gleich die eingefügten Zellen richtig formatieren und wieder entsperren zu können ( Blattschutz ist aktiv).
Das Problem ist, dass je nach Excel-Version (2003 und 2007) der kopierte Bereich als HTML erkannt wird (d.h. ein simples ActiveSheet.Paste fügt die Tabelle mit richtigen Spalten ein), oder als Text (dann landet jede Zeile in einer einzigen Zelle). Das ganze ist innerhalb von Excel 2007 auch nicht vorhersehbar, denn nachdem man mehre Male Text eingefügt hat, führt ein erneutes Einfügen auf gleichem Wege dann plötzlich zu richtig formatierten Spalten.
Es kommt auch vor, dass beim Einfügen über
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:= False
automatisch ein Spaltenumbruch bei jeder Leerstelle im Text stattfindet. Das kann ich auch mit "Inhalte einfügen" nachvollziehen.
Es wäre jetzt ziemlich aufwändig, nach dem Einfügen erstmal zu prüfen, wie es gerade verarbeitet wurde, um dann ggf. nochmal Selection.TextToColumns anzuwenden.
Ich weiss auch im Vorwege nicht, ob ich ActiveSheet.PasteSpecial Format:="Text" oder nur ActiveSheet.Paste anwenden soll, denn was für ein Format jeweils vor dem Einfügen in der Zwischenablage ist, kann man ja vorher nicht prüfen, oder?
Ein weiteres Problem ist, dass immer dann, wenn ActiveSheet.Paste den Inhalt als Tabelle einfügt, im Tabellenblatt Symbole sichtbar sind, die wie ein abgerolltes Papier aussehen und beim Darüberfahren mit viewer.OnInjectionDone.('viewer') angezeigt werden. Wenn ich da draufklicke, öffnet sich der Microsoft Script-Editor mit einer leeren Ansicht.
Ich hoffe Ihr werdet aus meienr zugegebenermaßen etwas wirren Beschreibung halbwegs schlau. Besser kann ich es leider nicht in Worte fassen.
Vielleicht kommt es ja jemandem bekannt vor und er hat eine Idee, wie ich das lösen kann.

16
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
Tabellen aus Browser über Editor nach Excel
06.03.2015 13:46:27
Klexy
Ich kenn das Problem.
Bei Browser-Einfügungen in Excel gibt es mehrere Fallstricke:
- Excel-Version (wie du schon bemerkt hast)
- Browser-Marke und Version
Ich arbeite in solchen Fällen über einen Umweg.
Zuerst musst du sicherstellen, dass alle mit dem gleichen Browser arbeiten.
Dann kopiere ich es erstmal in einen Editor, wodurch die Formate verschwinden und auch die Papierröllchen und Ähnliches.
Wenn du das Ergebnis dann aus dem Editor rauskopierst, hast du immer eine einheitliche Formatierung, die jedes Excel auf die gleiche Art und Weise darstellt.
Von diesem Punkt aus kannst du eine identische Weiterverarbeitung per Makro laufen lassen.
P.S. Ich arbeite auch mit mehreren Browsern und mit Word als Zwischenspeicher. Dort hab ich dann verschiedene Makros, die aus den verschiedenen Browserdaten ein einheitliches Erscheinungsbild machen, das ich dann nach Excel kopiere und dort einheitlich weiterverarbeiten kann. Dieser Weg ist aber etwas aufwendiger und muss ggf. öfter angepasst werden. Dazu muss man aber fit im Word-Makro sein.

Anzeige
AW: Tabellen aus Browser über Editor nach Excel
06.03.2015 13:50:11
Martin
Einheitlicher Browser - das wird schwierig. Im Betrieb gibt es sowohl Excel 2007 als auch 2003. Demnächst wohl auch 2010.
Der Umweg über einen Editor (Notepad?) klingt interessant und sollte das Problem lösen. Hast Du vielleicht einen VBA Beispielcode dafür?

AW: Tabellen aus Browser über Editor nach Excel
06.03.2015 14:23:10
Klexy
Wenn ich die strukturlose Suppe dann in Excel hab, mach ich mit Hilfe von Formeln wieder eine entsprechende Tabellenstruktur draus. Wenn in der Zelle links eine vierstellige Zahl ist, dann ist das in der darunterliegenden Zelle bis zum ersten Semikolon der Name - so ungefähr.
Die Formeln werden zwar per Makro generiert, sind aber bei jeder Tabelle anders und helfen dir nicht als Beispiel. Ich verwende im ersten Schritt immer den Makro-Rekorder.

Anzeige
AW: Tabellen aus Browser über Editor nach Excel
06.03.2015 14:46:24
Martin
mir geht es insbesondere darum, wie per Makro der Editor aufgerufen wird und die Inhalte dort rein und wieder zurück in Excel kopiert werden. Bei meinen bisherigen Versuchen mit dem Makro Editor wurden dort keine Befehle aufgezeichnet für Operationen außerhalb von Excel.

AW: Tabellen aus Browser über Editor nach Excel
06.03.2015 15:58:53
mumpel
Hallo!
Weshalb erstellst Du nicht per Java oder PHP eine Exceldatei? (z.B. CSV)? Liese sich dann viel einfacher importieren.
Gruß, René

AW: Tabellen aus Browser über Editor nach Excel
06.03.2015 16:31:56
Klexy
Da muss ich passen.
Ich markier das im Browser per Hand, kopier es händisch in den Editor und wieder raus.
Erst in Excel lass ich Makros rumpeln.

Anzeige
Anderer Ansatz?
06.03.2015 16:36:27
Michael
Hallo Martin,
zu den bisher genannten Problemen kommt ja noch hinzu, daß es mitunter hakelig ist, in einem Browser etwas zu markieren.
1. Existiert die JAVA-Applikation im Haus? Kann man hier keine csv-Datei erzeugen und importieren?
2. Muß der Anwender etwas markieren oder ist der Bereich der zu kopierenden Daten auch programmiertechnisch erfaßbar? Dann würde es sich anbieten, die Seite nicht mit dem Browser zu öffnen und händisch zu kopieren, sondern die URL mittels HttpRequest aufzurufen und hier die Daten rauszuziehen. Das wäre naturgemäß browserunabhängig.
Falls es mit kopieren sein muß, könnte eine Textbox Abhilfe schaffen. Die tut nämlich brav, und man kann *immer* auf Text als Text zugreifen.
Ich habe schnell ne Beispieltabelle zusammengebastelt: https://www.herber.de/bbs/user/96217.xls
Der Anwender kopiert die Daten in die Textbox, und darauf kannst Du via VBA zugreifen, ohne mit externen Programmen hantieren zu müssen.
Allerdings mußte ich feststellen, daß es mit X2007 tut, aber mit X2000 nach 255 Zeichen abgeschnitten wird. Wie es mit 2003 ist, weiß ich nicht.
Aber selbst mit 2000 gibt es Abhilfe: http://support.microsoft.com/kb/213841/de
Abgesehen davon: die meisten Sachen laufen ja klaglos auf allen Excel-Versionen; es sollte zeitlich überschaubar sein, eine Versionsabfrage reinzusetzen und die zwei, drei hakeligen Funktionen entsprechend zu kodieren.
Happy Exceling,
Michael

Anzeige
AW: Anderer Ansatz?
06.03.2015 17:38:34
Klexy
Dann wird aber alles in eine einzige Zelle kopiert. Ich bezweifle, dass das eine Erleichterung ist.
Eveltuell kann man auch ohne den Umweg über den Editor die unformatierten Inhalte auch mit Einfügen / Inhalte einfügen / Text ins Excel bringen, um es anschließend weiterzuverarbeiten, also im Browser kopieren und dann mit
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
in Excel einfügen.
Könnte aber sein, dass das nicht immer funktioniert.

AW: Anderer Ansatz?
09.03.2015 20:29:58
Martin
Hallo Klexi,
beim direkten Einfügen in eine Zelle mittels
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
kommt es manchmal zu Text in einer einzigen Zelle. Das könnte ich per Text in Spalten - Makro aufteilen, aber... mitunter macht Excel das Aufteilen auf mehrere Spalten bereits automatisch. Das ist der Kern des Problems.
Ich kann den Report aus der Webseite auch als Excel-Export abrufen und dann dort kopieren und in mein Tool einfügen. Ich wollte das eigentlich vermeiden, weil es für den Anwender ein paar Klicks mehr sind. Aber wahrscheinlich ist das doch die beste Methode.

Anzeige
AW: Anderer Ansatz?
09.03.2015 20:32:51
Martin
Danke Michael, die Variante mit der Textbox behalte ich mal im Hintergrund.
Da die java-Webanwendung auch csv und xls augeben kann, werde ich erstmal das probieren, auch wenn der User dann ein paar Klicks mehr machen muss.

AW: Anderer Ansatz?
09.03.2015 20:54:56
Martin
Danke Michael!
Ich behalte die Textbox-Lösung mal im Hinterkopf. Einstweilen ist es wohl einfacher, der User zieht einen Excel-Report aus der Webanwendung und kopiert dort die Daten. Sind zwar ein paar Klicks mehr, ist aber im Ergebnis wohl doch einfacher.

und noch besser
10.03.2015 22:01:14
Michael
Hallo Martin,
wenn man mit vertretbarem Aufwand zu einer Lösung kommt, mit der alle leben können, isses ja ok.
Mir ist im Nachhinein allerdings noch was durch den Kopf gegangen, was ich Dir nicht vorenthalten möchte:
Die Textbox ist ja eigentlich nur ne "Zwischenlösung", inspiriert vom Zwischenschritt über die Textverarbeitung.
Warum eigentlich nicht die komplette Information direkt per button aus der Zwischenablage ziehen?!
Datei anbei: https://www.herber.de/bbs/user/96285.xls
Es stehen ein paar weiterführende links zum Thema drin.
Ich setze bei der ganzen Geschichte voraus, daß Du in VBA genug Kenntnisse hast, um eine String in die einzelnen Bestandteile zu zerlegen. Das "TextInSpalten" funzt ja gut, aber eben nur, wenn Du die Informationen auch zeilenweise vorliegen hast.
Mir ging es letztlich bereits bei der Textbox darum, daß Du *einen* String erhältst, den Du weiterzerdröseln kannst, und zwar *immer einen String* und nicht manchmal dies und manchmal jenes.
Wie das geht (und vor allem zur Entscheidung, ob nicht doch der browserunabhängige httprequest tut), sieh Dir mal den thread an:
http://stackoverflow.com/questions/18163560/excel-vba-http-request-download-data-from-yahoo-finance
Interessant ist der Code unter "try this revised code"; im oberen Teil siehst Du, wie man einen langen String mit den kompletten Daten in ein Array von Zeilen (mit "split" nach vbLF, dem Zeilenumbruch) und diese wiederum in ein array einzelner Werte zerlegt. Analog geht es auch mit dem String aus der Zwischenablage.
Im unteren, wie man den request macht. Das Ding ist sauschnell, setzt aber eben voraus, daß Du die gewünschten Daten programmtechnisch irgendwie eingrenzen kannst. Und: das tut nicht, wenn JS dynamische Inhalte liefert.
Happy Exceling,
Michael

Anzeige
AW: und noch besser
12.03.2015 15:58:22
Martin
Hallo Michael,
ganz herzlichen Dank! Ich habe das jetzt nach einigem Tüfteln und Probieren so gelöst:

Dim MyData As DataObject
Dim sResult As String
Dim oResult As Variant, oData As Variant, R As Long, C As Long
Application.ScreenUpdating = False
'neues Tabellenblatt einfügen
Sheets.Add after:=Sheets(Sheets.Count)
Sheets(Sheets.Count).Name = "temp"
'Einfügen des aus der Eventanzeige kopierten Bereichs
Set MyData = New DataObject
On Error GoTo Leer
MyData.GetFromClipboard
sResult = MyData.gettext
oResult = Split(sResult, vbLf)
For R = 0 To UBound(oResult)
oData = Split(oResult(R), vbLf)
For C = 0 To UBound(oData)
ActiveSheet.Cells(R + 1, C + 1) = oData(C)
Next
Next
'MsgBox "Anzahl Zeilen= " & UBound(oResult)
Set oResult = Nothing
Leer: If Err  0 Then
tempBlatt_loeschen
MsgBox (CStr("Bitte kopieren Sie zunächst die Daten im Reporting" & vbCrLf & "" &  _
vbCrLf _
& "Markieren Sie dabei die Daten beginnend mit dem ersten Wochentag (ohne die Tabellenü _
berschriften)")): Err.Clear
Exit Sub
End If
Wenn die Zwischenablage leer ist, crasht es bei "sResult = MyData.gettext" mit einem Fehler 'Ungültige FORMATETC-Struktur'. Deshalb der error Handler, wobei ich mir nie so ganz sicher bin: Muss ich den danach noch wieder ausschalten, und wie?
Am liebsten wäre es mir, wenn man gezielt prüfen könnte, ob die Zwischenablage nicht leer ist. Aber dazu habe ich bislang nichts gefunden, es schein alle so zu machen.
Die Nachbearbeitung mache ich mit Selection.TextToColumns. Ich habe jetzt nur noch das Problem, dass es dabei zu falschen Ergebnissen kommt, wenn der User die Daten nicht aus dem Browserfenster kopiert hat, sondern den Umweg über einen Excel-Report geht. In diesem Fall hat die Zwischenablage einen anderen Aufbau mit mehr Leerzeichen. Aber dann witd auch mehr als eine Spalte belegt, und das kann ich ja wiederum durch eine Abfrage prüfen, ehe ich Selection.TextToColumns anwende.
Nochmals vielen Dank und freundliche Grüße
Martin

Anzeige
AW: und noch besser
12.03.2015 17:17:35
Michael
Hallo Martin,
schön, schön.
Ich muß zugeben, daß ich mit dem Errorhandling nicht so ganz fit bin. In der letzten Tabelle waren ja ein paar links, u.a. zu online-excel.de, wo Du einige Tutorials findest, u.a. zum Errorhandling.
Google mal: excel vba clipboard data type
Einer der ersten Treffer ist:
http://stackoverflow.com/questions/1108947/excel-vba-macro-check-content-of-clipboard-before-pasting
So weit, so gut. Wir sollten hier nichts mehr schreiben, demnächst wird der Beitrag sicher geschlossen.
Hat Spaß gemacht!
Happy Exceling,
Michael

Anzeige
Nachtrag
13.03.2015 10:22:00
Michael
Hallo Martin,
es hat mir jetzt doch keine Ruhe gelassen...
Split teilt einen String gemäß einem anzugebenden Trennzeichen in Teilstrings auf, die man wiederum in ein Array ablegen kann. Das tust Du mit der Zeile: oResult = Split(sResult, vbLf)
Nachdem Du textinspalten nimmst, reicht dieses eine split völlig aus; das zweite wäre nur dafür da, jede einzelne Zeile weiter aufzusplitten, etwa nach Leerzeichen.
Ich formuliere die Schleife mal um, teste sie aber nicht weiter:

For R = 0 To UBound(oResult)
ActiveSheet.Cells(R + 1, 1) = oResult(R)
Next
Das müßte eigentlich ausreichen.
Schöne Grüße,
Michael

Anzeige
AW: Nachtrag
16.03.2015 14:37:05
Martin
ja, das funktioniert.
Ich suche jetzt noch, ob im String ein Tabstop Chr(9) enthalten ist (= Zwischenablage stammt aus kopierten Excel-Zellen), und wende dann andere Parameter für Selection.TextToColumns an.
Insofern funktioniert mein Tool jetzt mit beiden Varianten. Problem gelöst, und nochmals herzlichen Dank für Deine Hilfe!

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige