2 Stimmen

Importieren einer Excel-Datei, die bei vorhandenen Daten Null zurückgibt

Ich versuche, eine Excel-Datei Excel97-2003 (nur das erste Blatt) in eine Access-Datenbank zu importieren. Dazu verwende ich folgenden Code:

Dim cnnExcel As New ADODB.Connection
Dim rsExcel As New ADODB.Recordset
With cnnExcel
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=" & strFileSelected & ";" & "Extended Properties=Excel 8.0"
    .CursorLocation = adUseClient
    .Open
End With

rsExcel.Open "SELECT * FROM [Sheet1]", cnnExcel

Alle Spalten in der Excel-Datei sind Zeichenfolgen und haben den Typ "Allgemein" (kein spezielles Format), wenn man sie mit Excel2003 öffnet, und die 3 anderen Spalten sind Datumsangaben. Mein Problem ist, dass ich für Werte, die in der Zelle vorhanden sind, Null erhalte, z.B. wenn der erste Wert eine Zeichenkette ist, wird er als Null zurückgegeben, wenn in dieser Spalte eine ganze Zahl steht und umgekehrt. Gibt es eine Lösung für dieses Problem?

Dankeschön

1voto

Renaud Bompuis Punkte 16227

Lösung 1

Mit Ihrem Code konnte ich problemlos Daten aus einer Excel-Tabelle laden.
Überprüfen Sie jedoch bitte Ihre SQL-Abfrage, sie sollte etwa so lauten:

rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel

Die Regeln für die FROM Teil wie folgt:

  • Abfrage von für ein ganzes Arbeitsblatt: SELECT * FROM [SheetName$] beachten Sie die $
  • Abfrage aus einem Bereich:
    SELECT * FROM [SheetName$A1:C5]
  • Abfrage aus einem benannten Bereich:
    SELECT * FROM NameRange
  • Abfrage von einem Arbeitsblatt, das nicht alphanumerische Zeichen enthält:
    SELECT * FROM ['This;is.My SheetName$']

Der Code funktioniert auf meinem Rechner:

Dim cnnExcel As Object
Dim rsExcel As Object
Set cnnExcel = CreateObject("ADODB.Connection")
Set rsExcel = CreateObject("ADODB.RecordSet")
With cnnExcel
    .Provider = "Microsoft.Jet.OLEDB.4.0"
    .ConnectionString = "Data Source=D:\Query1.xls;Extended Properties=Excel 8.0"
    .CursorLocation = 3
    .Open
End With

rsExcel.Open "SELECT * FROM [Sheet 1$]", cnnExcel
Debug.Print rsExcel.RecordCount '  Prints the number of rows containing data '
Do
    Debug.Print "Col1: " & rsExcel.Fields(0) & "  - Col2: " & rsExcel.Fields(1)
    rsExcel.MoveNext
Loop While Not rsExcel.EOF
rsExcel.Close

Lösung 2

Möglicherweise haben Sie mehr Erfolg, wenn Sie die Excel-Arbeitsmappe direkt bearbeiten.
Nehmen wir an, Sie haben eine Tabelle MyTable in Ihrer Access-Datenbank, in die Sie die Felder importieren möchten myA , myB y myC (die den richtigen Datentyp haben, den Sie erwarten!) den Inhalt Ihrer Excel Sheet 1 die entsprechende Spalten hat.

Der vereinfachte VBA-Code würde wie folgt aussehen:

Sub ImportData(fname As String)
    Dim xlo As Object
    Dim xlWb As Object
    Dim xlWs As Object
    Dim colA, colB, ColC As Variant
    Dim db As DAO.Database
    Dim rs As DAO.Recordset
    Dim thereIsData As Boolean
    Dim row As Integer

    ' Open Excel sheet, try to re-use Excel if it is open '
    On Error Resume Next
    Set xlo = GetObject("Excel.Application")
    If xlo Is Nothing Then Set xlo = CreateObject("Excel.Application")
    On Error Goto 0
    Set xlWb = xla.Workbooks.Open(fname)
    Set xlWs = xlWb.Worksheets(1)  ' Sheet 1'

    ' Open table where the results will be stored '
    Set db = CurrentDb()
    Set rs = db.OpenRecordset("MyTable", dbOpenDynaset)
    Do
       colA = xlWs.Cells(row, 1).Value
       colB = xlWs.Cells(row, 2).Value
       colC = xlWs.Cells(row, 3).Value
       ' We will stop at the first empty row '
       thereIsData = Not (IsBlank(colA) And IsBlank(colB) And IsBlank(colC))
       If thereIsData Then
            ' Add the Excel data to the table '
            rs.AddNew
                rs!myA = colA
                rs!myA = colB
                rs!myA = colC
            rs.Update
       End If
       row = row + 1
    Loop While thereIsData
    rs.Close
    ' Cleanup '
    Set rs = Nothing
    Set db = Nothing
    Set xlWs = Nothing
    Set xlWb = Nothing
    xla.DisplayAlerts = False
    xla.Quit
    Set xls = Nothing
End Sub

'-----------------------------------------------------------------------------  
' True if the argument is Nothing, Null, Empty, Missing or an empty string .  
'-----------------------------------------------------------------------------  
Public Function IsBlank(arg As Variant) As Boolean  
    Select Case VarType(arg)  
        Case vbEmpty  
            IsBlank = True  
        Case vbNull  
            IsBlank = True  
        Case vbString  
            IsBlank = (arg = vbNullString)  
        Case vbObject  
            IsBlank = (arg Is Nothing)  
        Case Else  
            IsBlank = IsMissing(arg)  
    End Select  
End Function

0voto

lori_m Punkte 5367

Ich denke, Sie müssen zunächst alle Zahlen in Ihren Excel-Daten in das Textformat umwandeln (als Text formatierte Zahlen haben standardmäßig ein grünes Dreieck in der Ecke, das mit den Optionen zur Fehlerprüfung unterdrückt werden kann). Mir sind zwei Möglichkeiten bekannt, dies zu tun, eine für einzelne Spalten und eine für größere Bereiche:

Methode 1) Wählen Sie eine einzelne Spalte aus, wählen Sie dann die Registerkarte Daten > Text in Spalten, klicken Sie zweimal auf Weiter, wählen Sie im dritten Schritt die Option Text und klicken Sie auf Fertig stellen.

Methode 2) Kopieren Sie die gesamte Tabelle oder das Blatt, wählen Sie Zellen formatieren und klicken Sie auf Text für das Zahlenformat. Nun können Sie den Text entweder durch Anklicken des Symbols in der Office-Zwischenablage oder durch Einfügen der Tabelle in den Notizblock und Kopieren und Einfügen zurück in Excel einfügen. (Die Office-Zwischenablage können Sie aktivieren, indem Sie auf den Pfeil unten rechts im Abschnitt Zwischenablage auf der Registerkarte Start klicken)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X