Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1660to1664
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

Import Code/ Frage

Import Code/ Frage
20.12.2018 11:58:29
Bernd
Hallo,
zu folgendem Code von "Sepp" habe ich eine Frage:
Die Tabellenblätter aus anderen Dateien werden anstandslos importiert, sofern es klassische Tabelle mit Spaltenköpfen sind. Sobald aber z. B. Textpassagen wie Überschriften in den Quelldaten enthalten sind , werden diese nicht zuverlässig oder sogar gar nicht übernommen. Auch bei Leerzellen wird gerne ein "K" eingetragen.In den Spaltenköpfen tauchen auch "#" auf.
Kann man diesen Bereich des Codes noch verbessern? Originalformatierung muss nicht unbedingt sein, aber "Vollständigkeit" wäre schon schön!
Danke und Gruß
Bernd
' **********************************************************************
' Modul: Modul1 Typ: Allgemeines Modul
' **********************************************************************
Option Explicit
Sub import()
Dim objADO As Object
Dim vntItem As Variant
Dim vntFiles() As String, strTable As String, strFile As String, strPath As String
Dim lngI As Long, lngN As Long, lngNext As Long, lngCalc As Long
Const cstrRef As String = "A1:AM6000" 'Importbereich
On Error GoTo ErrExit
With Application
.ScreenUpdating = False
.EnableEvents = False
lngCalc = .Calculation
.Calculation = -4135
.DisplayAlerts = False
End With
With Application.FileDialog(msoFileDialogFilePicker)
.InitialFileName = "E:\Forum" 'Startverzeichnis
.Title = "Dateien zum Import auswählen"
.ButtonName = "Import Starten"
.InitialView = msoFileDialogViewList
.AllowMultiSelect = True
.Filters.Clear
.Filters.Add "Excel Dateien", "*.xls; *.xlsx; *.xlsm", 1
.Filters.Add "Alle Dateien", "*.*", 2
.FilterIndex = 1
If .Show = -1 Then
Redim vntFiles(.SelectedItems.Count - 1)
For Each vntItem In .SelectedItems
vntFiles(lngI) = vntItem
lngI = lngI + 1
Next
End If
End With
If lngI > 0 Then
With ThisWorkbook.Sheets("Tabelle1") 'Name der Tabelle in dieser Datei - anpassen!
.Range("A1:AN" & .Rows.Count) = ""
lngNext = 2
For lngI = 0 To UBound(vntFiles)
DoEvents
strPath = Mid(vntFiles(lngI), 1, InStrRev(vntFiles(lngI), "\") - 1)
strFile = Mid(vntFiles(lngI), InStrRev(vntFiles(lngI), "\") + 1)
Application.StatusBar = "Import aus '" & strPath & "' - Datei: '" & strFile & _
"' - ( " & lngI + 1 & " von " & UBound(vntFiles) + 1 & " )"
DoEvents
strTable = GetSheetNames(vntFiles(lngI))(0)
Set objADO = ExcelTable(vntFiles(lngI), strTable, cstrRef)
If lngI = 0 Then
For lngN = 1 To objADO.Fields.Count
.Cells(1, lngN) = objADO.Fields.Item(lngN - 1).Name
Next
End If
.Cells(lngNext, 1).CopyFromRecordset objADO
.Cells(lngNext, 40).Resize(objADO.RecordCount, 1) = vntFiles(lngI)
lngNext = lngNext + objADO.RecordCount
objADO.Close
Next
.Columns.AutoFit
End With
MsgBox "Import aus " & IIf(UBound(vntFiles) = 0, "einer Datei", UBound(vntFiles) + 1 & " Dateien") & _
" erfolgreich abgeschloßen!", vbInformation
End If
ErrExit:
With Err
If .Number 0 Then
MsgBox "Fehler in Prozedur:" & vbTab & "'import'" & vbLf & String(60, "_") & _
vbLf & vbLf & IIf(Erl, "Fehler in Zeile:" & vbTab & Erl & vbLf & vbLf, "") & _
"Fehlernummer:" & vbTab & .Number & vbLf & vbLf & "Beschreibung:" & vbTab & _
.Description & vbLf, vbExclamation + vbMsgBoxSetForeground, _
"VBA - Fehler in Prozedur - import"
.Clear
End If
End With
With Application
.ScreenUpdating = True
.EnableEvents = True
.Calculation = lngCalc
.DisplayAlerts = True
.StatusBar = False
End With
On Error GoTo 0
Set objADO = Nothing
End Sub
Private Function ExcelTable(ByRef Path As String, ByRef Table As String, ByRef SourceRange As  _
String, Optional WhereString As String = "") As Object
' requires the function FileExists()
Dim SQL As String
Dim Con As String
If Not FileExists(Path) Then Exit Function
SQL = "select * from [" & Table & "$" & SourceRange & "] " & WhereString
If Mid(Path, InStrRev(Path, ".") + 1) = "xls" Then
Con = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Extended Properties=Excel 8.0;" _
& "Data Source=" & Path & ";"
ElseIf Mid(Path, InStrRev(Path, ".") + 1) Like "xls?" Then
Con = "Provider=Microsoft.ACE.OLEDB.12.0;" _
& "Extended Properties=""Excel 12.0;HDR=YES"";" _
& "Data Source=" & Path & ";"
Else
Exit Function
End If
Set ExcelTable = CreateObject("ADODB.Recordset")
ExcelTable.Open SQL, Con, 3, 1
End Function
Private Function GetSheetNames(ByVal FileName As String) As Variant
'original by Bob Phillips, adapted by j.ehrensberger
' requires the function FileExists()
Dim objADO_Connection As Object, objADO_Catalog As Object, objADO_Tables As Object
Dim lngIndex As Long, intLength As Integer, intPos As Integer, intStart As Integer
Dim strConString As String, strTable As String
Dim vntTmp() As Variant
If Not FileExists(FileName) Then
GetSheetNames = 0
Exit Function
End If
If Mid(FileName, InStrRev(FileName, ".") + 1) = "xls" Then
strConString = "Provider=Microsoft.Jet.OLEDB.4.0;" & "Extended Properties=Excel 8.0;" & _
"Data Source=" & FileName & ";"
ElseIf Mid(FileName, InStrRev(FileName, ".") + 1) Like "xls?" Then
strConString = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Extended Properties=""Excel 12.0;HDR= _
YES"";" _
& "Data Source=" & FileName & ";"
Else
Exit Function
End If
Set objADO_Connection = CreateObject("ADODB.Connection")
objADO_Connection.Open strConString
Set objADO_Catalog = CreateObject("ADOX.Catalog")
Set objADO_Catalog.ActiveConnection = objADO_Connection
For Each objADO_Tables In objADO_Catalog.Tables
strTable = objADO_Tables.Name
intLength = Len(strTable)
intPos = 0
intStart = 1
'Worksheet name with embedded spaces enclosed by single quotes
If Left(strTable, 1) = "'" And Right(strTable, 1) = "'" Then
intPos = 1
intStart = 2
End If
'Worksheet names always end in the "$" character
If Mid$(strTable, intLength - intPos, 1) = "$" Then
Redim Preserve vntTmp(lngIndex)
vntTmp(lngIndex) = Mid$(strTable, intStart, intLength - (intStart + intPos))
lngIndex = lngIndex + 1
End If
Next objADO_Tables
If lngIndex > 0 Then GetSheetNames = vntTmp
objADO_Connection.Close
Set objADO_Catalog = Nothing
Set objADO_Connection = Nothing
End Function
Private Function FileExists(FileName As String) As Boolean
Dim objFSO As Object
Set objFSO = CreateObject("Scripting.FileSystemObject")
FileExists = objFSO.FileExists(FileName)
Set objFSO = Nothing
End Function

5
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Import Code/ Frage
20.12.2018 13:19:36
Luschi
Hallo Bernd,
nur einem geposteten Vba-Code blind vertrauen und darauf hoffen, daß er für immer und ewig funktioniert, ist keine gute Idee. Hättest Du Dich intensiver mit AdoDB beschäftigt (und bei Google findet man dazu 'zig Infoseiten, dann wärst Du über solche Begriffe bei 'Extended Properties' gestolpert:
- HDR=Yes bzw. HDR=No
- IMEX=0 bzw. IMEX=1
- MAXSCANROWS=15
- READONLY=False bzw. READONLY=True
Außerdem gibt es Einschränkungen bei den Überschriften, wenn die zu importierende Tabelle solche hat hat:
- bestimmte Sonderzeichen (wie z.B. das '#') sind nicht erlaubt
- Leerzeichen am Ende des Feldnamens (Überschrift)
- u.e.a.m.
Ich habe z.Z. ein Problem auf dem Tisch, da haben die Zelleninhalte manchmal mehr als 4500 Zeichen, und da weigert sich z.B. AdoDB unter Excel 2003 beharrlich diese Tabelle überhaupt in ein Recordset zu lesen.
Da Du keine Beispieldatei mitlieferst, belasse ich es bei diesen theoretischen Erklärungen.
Gerade bei AdoDB ist jede Kleinigkeit wichtig, um die Daten erfolgreich aus einer anderen Exceldatei aus-/einlesen zu können.
Gruß von Luschi
aus klein-Paris
Anzeige
AW: Import Code/ Frage
20.12.2018 14:37:40
Bernd
Hallo,
mir ist schon klar, dass dieser Code hier nicht trivial ist. Meinen VBA-Level habe ich auch oben angegeben. Dennoch habe ich die Hoffnung, dass mir jemand konkret weiterhilft und nicht noch alles verkompliziert.
Danke
Bernd
AW: Import Code/ Frage
20.12.2018 14:38:31
Bernd
Hallo,
mir ist schon klar, dass dieser Code hier nicht trivial ist. Meinen VBA-Level habe ich auch oben angegeben. Dennoch habe ich die Hoffnung, dass mir jemand konkret weiterhilft und nicht noch alles verkompliziert.
Danke
Bernd
AW: Import Code/ Frage
20.12.2018 16:59:32
Luschi
Hallo Bernd,
so richtig helfen kann man Dir nur, wenn Du bereit bist, eine Demodatei der Exceltabelle hier hochzuladen, aus der die Daten per AdoDb ausgelesen werden sollen; 10-15 Datensätze einschließlich der Überschriften würden ausreichen, wenn diese Daten inhaltlich dem Original entsprechen.
Enthalten die Überschriften
- Leerzeichen vorn, mittig, hinten
- jegliche Art von Sonderzeichen (# : / \ usw.)
- Umlaute
dann sollten auch die Demoüberschriften solche Zeichen enthalten.
Sollte es Spalten gegen, wo Zahlen, Text, Datumsangaben gemischt vorkommen, dann auch dies in den Demodaten berücksichtigen.
Gruß von Luschi
aus klein-Paris
Habe mein aufgezeigtes Problem inzwischen gelöst; per Vba:
- Original-Exceldatei kopiert
- Spalte mit den vielen Zeichen (mehr als 255 pro Zelle) gelöscht
- Kopie abgespeichert und geschlossen
- Zugriff per AdoDB auf Kopie klappt jetzt
- nach Abschluß der Datenauswertung Dateikopie wieder gelöscht.
- erstaunlicherweise stören Kommentare in den Spaltenüberschriften (auch mit Bild) nicht
Anzeige
AW: Import Code/ Frage
20.12.2018 17:58:09
Bernd
Hallo Luschi.
mittlerweile hätte ich noch einen Code, der vielleicht deutlich leichter zu handhaben ist und der eigentlich für mich genügt, wenn man ihn noch ein wenig flexibler macht.
Bei der beigefügten Vorlage ist das Importsheet fest codiert und der Import erfolgt in das aktuelle Sheet.
Ich würde gerne das Zielsheet in der Datei fest vorgeben und die Quelldatei sollte aus einem beliebigen Verzeichnis frei wählbar sein (per Dialog).
Toll. wäre es, wenn auch Formate eingelesen werden würden, aber das muss nicht, weil das dann doch wohl Probleme machen kann.
Musterdateien habe ich hochgeladen:
https://www.herber.de/bbs/user/126238.xlsm
https://www.herber.de/bbs/user/126239.xlsx
Option Explicit
Public Function GetDataClosedWB(SourcePath As String, _
SourceFile As String, sourceSheet As String, _
SourceRange As String, TargetRange As Range) As Boolean
'Holt einen Bereich aus einer _geschlossenen_ Arbeitsmappe
'Nur in VBA zu verwenden; nicht aus einer Tabellenzelle heraus
'© t.ramel@mvps.org
' wird durch die HoleDaten aufgerufen
Dim strQuelle       As String
Dim Zeilen          As Long
Dim Spalten         As Byte
On Error GoTo InvalidInput
strQuelle = "'" & SourcePath & "[" & SourceFile & "]" & sourceSheet & "'!" & Range( _
SourceRange).Cells(1, 1).Address(0, 0)
Zeilen = Range(SourceRange).Rows.Count
Spalten = Range(SourceRange).Columns.Count
With TargetRange.Cells(1, 1).Resize(Zeilen, Spalten)
.Formula = "=IF(" & strQuelle & "="""",""""," & strQuelle & ")"
.Value = .Value
End With
GetDataClosedWB = True
Exit Function
InvalidInput:
MsgBox "Die Quelldatei oder der Quellbereich ist ungültig!", vbExclamation, "Get data from  _
closed Workbook"
GetDataClosedWB = False
End Function

Public Sub HoleDaten()
' Die Funktion arbeitet mit der obrigen GetDataClosedWB zusammen
Dim Pfad            As String
Dim Dateiname       As String
Dim Blatt           As String
Dim Bereich         As String
Dim Ziel            As Range
Pfad = "L:Eigene DateienHajoInternetTest2009"
Dateiname = "Beispiel Forum 30.xlsm" ' aus welcher Datei soll er holen?
Blatt = "Tabelle1"  ' von welcher Tabelle soll er holen?
Bereich = "A1:B9"   ' aus welchem Bereich soll er holen?
Set Ziel = ActiveSheet.Range("A1")  ' in welchen Bereich soll er kopieren? Genauer gesagt:  _
Bei welcher Zelle soll er anfangen, Datein reinzukopieren? Bsp: ActiveCell geht auch
If GetDataClosedWB(Pfad, Dateiname, Blatt, Bereich, Ziel) Then
MsgBox "Daten importiert"
End If
End Sub

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige