Benutzer mit den meisten Antworten
Import aus Excel 2010 abschnitt bei 255 Zeichen

Frage
-
Hi,
Problem ist folgendes:
Bisher (Access 2002/2003/2007) hat der Import der Daten aus Excel funktioniert. Leider schneidet der Import die Textfelder bei 255 Zeichen ab. Dazu hab ich mich auch schon informiert, aber bisher keine gute Möglichkeit gefunden.
Es war so, dass die Tabellen bisher nur verknüft wurden, dass ist aber seit Office 2010 mit einem byDesign Abschneiden versehen.
Also habe ich versucht, die Tabellen zu importieren, was auch über die GUI ohne Probleme geht, alle Daten kommen mit.
Nun aber die Umsetzung per VBA. Da musste ich feststellen, dass dies mit einem DoCmd.TransferSpreadsheet funktioniert aber bei 255 Zeichen Schluss ist. Per GUI gings doch?
Andere Variante probiert, in der ich die Tabelle vorher definiere mit einem Memo Feld. Damit geht es weder über die GUI noch über VBA.
Zusammengefasst:
Import ohne bestehende Tabelle:
- GUI funktioniert (Spalte als Memo definiert)
- VBA geht nicht
Import mit bestehender Tabelle
- GUI geht nicht (die gleiche Tabelle verwendet, welche beim vorherigen Import generiert wurde)
- VBA geht nicht
Gibt es eine Möglichkeit beim Import per VBA die Tabelle genau wie im interaktiven Modus wie in der GUI zu importieren?
Es gibt natürlich die Variante, jede Zeile der Excel Tabelle einzeln auszulesen, was auch funtkioniert, aber bei größeren Datenmengen einfach viel zu lange dauert -> also nicht praktikabel, da hier je nach Benutzung locker mehrere 20k+ Texte exportiert und importiert werden sollen. (Beim Export wird einfach die copyfromrecordset Methode benutzt (da tritt dieses Problem nicht auf))
Antworten
-
Ok, ich konnte das Problem lösen, zwar nicht schön aber es funktioniert.
Da bei den zu Importierenden Texten die meisten nicht über 255 Zeichen sind, und nur einige ist es praktikabel diese "einzelnen" herauszufischen und gesondert zu importieren:
1. Erstellen der Zieltabelle mit PK und mit Text und Memo Feldern
2. Der normale Import über DoCmd.TransferSpreadsheet acImport, ...
3. Dann per SQL Query mit einem Recordset alle >=255 langen Texte suchen
4. Offsett des PK der Tabelle bestimmen (es ist besser die Tabelle bei jedem Import neu zu erstellen da dann der PK bei 1 beginnt ;))
5. Dieses RS verwenden um Excel per RS.fields("Ziel").Value = tExcelWorksheet.Cells(1).Cells(RS.PK-Offsett+1) anzusprechen
Oder hat jemand eine andere Lösung des Problems?
- Als Antwort markiert RealStein Donnerstag, 26. April 2012 11:16
-
Es ist zwar schon wieder eine Weile her, aber ich möchte die andere Lösungsmöglichkeit wie es nun umgesetzt wurde posten.
Da das Datenbankfeld ja auf 255 Zeichen begrenzt wird, wenn nicht in den ersten 8 Datensätzen ein längerer Eintrag zu finden ist.
Lösung:
In einer temporären Kopie der Excel Datei einen Dummy-Eintrag an erster Stelle erstellen (größer als 255 Zeichen), welcher nach dem Einlesen wieder entfernt wird.
- Als Antwort markiert RealStein Donnerstag, 18. Oktober 2012 07:31
Alle Antworten
-
Ok, ich konnte das Problem lösen, zwar nicht schön aber es funktioniert.
Da bei den zu Importierenden Texten die meisten nicht über 255 Zeichen sind, und nur einige ist es praktikabel diese "einzelnen" herauszufischen und gesondert zu importieren:
1. Erstellen der Zieltabelle mit PK und mit Text und Memo Feldern
2. Der normale Import über DoCmd.TransferSpreadsheet acImport, ...
3. Dann per SQL Query mit einem Recordset alle >=255 langen Texte suchen
4. Offsett des PK der Tabelle bestimmen (es ist besser die Tabelle bei jedem Import neu zu erstellen da dann der PK bei 1 beginnt ;))
5. Dieses RS verwenden um Excel per RS.fields("Ziel").Value = tExcelWorksheet.Cells(1).Cells(RS.PK-Offsett+1) anzusprechen
Oder hat jemand eine andere Lösung des Problems?
- Als Antwort markiert RealStein Donnerstag, 26. April 2012 11:16
-
Hallo!
Die Problemursache beim Verknüpfen wird die Datentyperkennung sein.
Ich testete folgendes:Wenn in den ersten 8 Zeilen kein Wert mehr als 255 Zeichen hat, wird in der verknüpften Tabelle ein Varchar(255) verwendet.
Fülle ich in der ersten Excel-Zeile in das Textfeld mehr als 255 Zeichen ein, wird ein Memo-Feld erzeugt.In der Registry kann man die zu prüfenden Zeilen von 8 auf eine größere Anzahl erhöhen.
Key: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\
REG_DWORD: TypeGuessRowsmfg
Josef
Code-Bibliothek für Access-Entwickler
AccUnit - Testen von Access-Anwendungen
Virtueller Access-Stammtisch
- Bearbeitet Josef Pötzl Donnerstag, 26. April 2012 14:26
-
On 26.04.2012 18:16, RealStein wrote:> Da bei den zu Importierenden Texten die meisten nicht über 255 Zeichen> sind, und nur einige ist es praktikabel diese "einzelnen"> herauszufischen und gesondert zu importieren:Das scheint mir nun doch ein bisschen kompliziert zu sein.Hattest Du auch schon mal versucht, das Excel Sheet in die Datenbankeinzubinden? Sind dann die Texte auch abgeschnitten?Du könntest auch versuchen, die zu importierenden Zellen als Range inExcel zu definieren und dann den Range zu linken.GrussHenry
-
Es ist zwar schon wieder eine Weile her, aber ich möchte die andere Lösungsmöglichkeit wie es nun umgesetzt wurde posten.
Da das Datenbankfeld ja auf 255 Zeichen begrenzt wird, wenn nicht in den ersten 8 Datensätzen ein längerer Eintrag zu finden ist.
Lösung:
In einer temporären Kopie der Excel Datei einen Dummy-Eintrag an erster Stelle erstellen (größer als 255 Zeichen), welcher nach dem Einlesen wieder entfernt wird.
- Als Antwort markiert RealStein Donnerstag, 18. Oktober 2012 07:31