Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Import Excel=Access

Begonnen von Stapi, Juli 27, 2010, 11:23:03

⏪ vorheriges - nächstes ⏩

Stapi

Guten Morgen

Ich sitze seit einiger Zeit an einem Problem wo ich mal Hilfe oder Rat benötige. Angefügt habe ich ein Excel Dokument Beispiel was ich in eine Access Datenbank einlesen möchte, das geschieht auch soweit ganz gut (Datei / Daten import) nur und hier liegt mein Problem den als grün markierten Excel Datensatz liest er in Access als fünf Datensätze ein. Die in den ersten drei Zeilen stehende Meldungsnummer ist aber gültig für den ganzen bereich und sie wird nur in einem Datensatz mit eingelesen, wie könnte ich das ändern oder verbessern?

Danke

Gruß Stefan

[Anhang gelöscht durch Administrator]
Grüße aus dem schönen NRW
Stefan

Sulu

Hallo Stapi,

soweit ich das jetzt sehe, hast du in deiner Exceltabelle Zellen vereint. dieses kann Access nicht verarbeiten und macht daraus verschiedene Datensätze. Wenn du in der Exceltabelle Absätze einbauen willst, nutze doch Strg+Enter. Dann bleibt das in einer Zeile und Access liest das als einen Datensatz aus.

LG
Sulu

Stapi

Hallo Sulu

Soweit richtig. Aber das habe ich leider nicht Verstanden bzw die Funktion geht bei mir nicht.

Wenn du in der Exceltabelle Absätze einbauen willst, nutze doch Strg+Enter diese Funktion sagt in der online Hilfe etwas anderes aus

Da es sich hier gezeigt nur um einen ausschnitt handelt das richtige Dokument beinhaltet 5000 solcher Datensätze, die möchte ich nicht alle händich bearbeiten.

Gruß Stefan
Grüße aus dem schönen NRW
Stefan

Sulu

gut. 5000 Datensätze sind reichlich viel... Wie spuckt Access die Datensätze aus? schreibt er den ersten Teil in jede der 5 zeilen? wenn ja, könntest du danach gruppieren und den rest dabei zusammenfassen.

Aber beim Gruppieren bin ich selber nicht so ganz fit. database weiß da mehr, wenn das ein Ansatz ist.

Stapi

Access schreibt sie genau rein wie sie in der Excel liste stehen nur das sie in den resten drei Spalten die Zahl in den Datensatz schreibt wo sie auch steht mal an erster oder wie im Beispiel in Zeile 3. Mein Gedanke war da alle Daten in Excel gerahmt sind das über den weg zu machen aber hier fehlt mir der Ansatz der Umsetzung wenn das so überhaupt möglich ist.

Gruß Stefan
Grüße aus dem schönen NRW
Stefan

Sulu

Zitat von: Stapi am Juli 27, 2010, 13:46:52Access schreibt sie genau rein wie sie in der Excel liste stehen

Wie meinst du das? Hast du einen Screenshot? Vllt. hilft mir der noch weiter. Ansonsten habe ich gerade auch keine Idee mehr...

Stapi

Halo Sulu

Die angehängte Excel Mappe1 genau so liest sie Access ein, Zeile 1 in Exel ist Datensatz 1 in Access.

Und wenn du dir die Mappe anschaust wirst du sehen das in dem Bespiel nur in der Zeile 3 die Nummer steht, da ich aber später in access genau nach dier Nr suchen werden, würden die Datensätze wegfallen die ohne Nr sind und somit auch Informationen fehlen. Ich hoffe ich hab es verständlich genug geschrieben.

Stefan
Grüße aus dem schönen NRW
Stefan

Sulu

jetzt auf jdene Fall ;)

Verwendest du zufällig einen Zählenden Primärschlüssel? Dann könntest du dass nachträglich per Hand ändern... Aber sonst will mir bei deinem Problem wirklich nichts einfallen, als Handarbeit / Suchen und ersetzen in der Excel-Tabelle.
Ich hoffe, die anderen können dir mehr weiterhelfen.

LG
Sulu

Stapi

Danke Sulu

Hoffe auf Lösungsansätze die mir die Handarbeit ersparen,
denn sie müsten so alle paar Monate immer wieder erfolgen da änderungen oder ergänzungen erfolgen

Stefan
Grüße aus dem schönen NRW
Stefan

Sulu

Wäre es da nicht einfacher, die Änderungen direkt in der Datenbank vorzunehmen?
Es hat zwar den nachteil, dass da Änderungen nicht ohne weiteres Rückgängig zu machen sind, aber wenn man neues direkt immer da einträgt, sollte sich der Änderungsauwand minimieren...

LG
Sulu

PS: Nochmals viel Glück, dass jetzt möglichst schnell hinzubekommen.

Stapi

Richtig, ich kann änderungen oder ergänzungen im nachgang in der Datenbank machen, aber nur wenn das einlesen aus dem Excel Dokument vernünftig läuft ohne vor her alle Datensätze händisch an fassen zu müssen.

Gruß Stefan
Grüße aus dem schönen NRW
Stefan

Stapi

Hallo

Hat niemand eine Idee wie ich das vernünftig anstellen könnte ohne händisch in Exel die Daten zu bearbeiten ???   Für Tipps oder anregungen wäre ist sehr Dankbar.

Gruß Stefan
Grüße aus dem schönen NRW
Stefan

Sulu

Mir ist da gerade noch was eingefallen. Vielleicht könntest du die Excel-Tabelle via einem Makro bearbeiten.
Allerdings kann ich dir nicht sagen wie, weil ich nur weiß, dass es soetwas gibt.

LG
Sulu

Hondo

Hallo,
eventuell wäre es sinnvoll die einzelnen ZELLEN Zeilenweise aus dem Excel Dokument einzulesen per Excel Automatisation.
Einziger Knackpunkt könnte die Performance sein.

Ich meine es gibt im Forum schon ein Beispiel dazu.

Andreas

Hondo

#14
Hallo,
ich habe mal ein etwas umfassenderes Beispiel für dich wie man es machen könnte.
Der Ablauf:
Temporäre Datenbank erstellen, darin Importtabelle erstellen und die Daten aus Excel zeilenweise importieren.
In dieser Temporären Tabelle kann man dann bequem die Daten bearbeiten, auf Doubletten überprüfen, Formatänderungen durchführen etc.
Danach die bereinigten Datensätze mit dem noch geöffneten Recordset in das Arbeitsbackend übernehmen.

Hier der Code, die erste Funktion und die API Deklarationen müssen in ein Modul.

Gruß Andreas

Option Compare Database
Option Explicit


Public objXL As Object
Public boolXL As Boolean
Public boolXL2 As Boolean

Private Const SW_SHOWNORMAL = 1

Private Declare Function apiFindWindow Lib "user32" Alias _
                                      "FindWindowA" (ByVal strClass As String, _
                                                     ByVal lpWindow As String) As Long

Private Declare Function apiSendMessage Lib "user32" Alias _
                                       "SendMessageA" (ByVal Hwnd As Long, ByVal Msg As Long, ByVal _
                                                                                              wParam As Long, lParam As Long) As Long

Private Declare Function apiSetForegroundWindow Lib "user32" Alias _
                                               "SetForegroundWindow" (ByVal Hwnd As Long) As Long

Private Declare Function apiShowWindow Lib "user32" Alias _
                                      "ShowWindow" (ByVal Hwnd As Long, ByVal nCmdShow As Long) As Long



Function fIsAppRunning(ByVal strAppName As String, _
                      Optional fActivate As Boolean) As Boolean
   Dim lngH As Long, strClassName As String
   Dim lngX As Long, lngTmp As Long
   Const WM_USER = 1024
   On Local Error GoTo fIsAppRunning_Err
   fIsAppRunning = False
   Select Case LCase$(strAppName)
       Case "excel": strClassName = "XLMain"
       Case "word": strClassName = "OpusApp"
   End Select

   lngH = apiFindWindow(strClassName, vbNullString)
   If lngH <> 0 Then
       apiSendMessage lngH, WM_USER + 18, 0, 0
       lngX = apiIsIconic(lngH)
       If lngX <> 0 Then
           lngTmp = apiShowWindow(lngH, SW_SHOWNORMAL)
       End If
       If fActivate Then
           lngTmp = apiSetForegroundWindow(lngH)
       End If
       fIsAppRunning = True
   End If
fIsAppRunning_Exit:
   Exit Function
fIsAppRunning_Err:
   fIsAppRunning = False
   Resume fIsAppRunning_Exit
End Function



Sub Excel_Import()
   Dim ExcelApp As Object
   Dim ExcelRuns As Boolean

   If fIsAppRunning("Excel") Then
       Set objXL = GetObject(, "Excel.Application")
       boolXL = False
   Else
       Set objXL = CreateObject("Excel.Application")
       boolXL = True
   End If
   ExcelRuns = True
   objXL.Workbooks.Add ("Pfad_und_Name_Excel_Datei.xls")

   '1. Schritt: Temporäre DB erstellen und Daten importieren
   Set DBtemp = CreateNewDatabase("Datenbankname", "Tabellenname")
   Set rstemp = DBtemp.OpenRecordset("Select * from Datenbankname")

   If ExcelRuns Then
       Set ExcelApp = GetObject(, "Excel.Application")
       boolXL2 = False
   Else
       Set ExcelApp = CreateObject("Excel.Application")
       boolXL2 = True
   End If
   ExcelApp.Workbooks.Open FileName:=NameExcelDatei, ReadOnly:=True
   With ExcelApp.ActiveWorkbook.Worksheets(1)
       For i = 1 To .UsedRange.Rows.Count
           rstemp.AddNew
           rstemp!Numerisches_Feld = CDbl(.Cells(i, Zellennummer))
           rstemp!String_Feld = CStr(.Cells(i, Zellennummer).Value)
           rstemp!Bool_Format = True
           rstemp.Update
       Next i
   End With
   If boolXL2 Then ExcelApp.Application.Quit
   Set ExcelApp = Nothing

   '2. Schritt: Daten in Arbeitsbackend übernehmen
   'Dazu einfach in einer Schleife über rstemp die Daten in das Arbeitsbackend übernehmen

   'Code für Fehlerroutiene:
   If boolXL Then objXL.Application.Quit
   Set objXL = Nothing

End Sub



Function CreateNewDatabase(dbName As String, tabName As String, Optional strTable As String) As Database
   Dim wrkDefault As DAO.Workspace
   Dim dbNew As DAO.Database

   If IsNull(strTable) Or strTable = "" Then
       strTable = "CREATE TABLE " & tabName & " (Feld1, Feld2, ....)"
   End If

   ' Standardarbeitsbereich bestimmen.
   On Error GoTo CreateNewDatabase_Error

   Set wrkDefault = DBEngine.Workspaces(0)
   On Error Resume Next
   If Dir(CurrentProject.Path & "\" & dbName & ".mdb") <> "" Then Kill CurrentProject.Path & "\" & dbName & ".mdb"

   Set dbNew = wrkDefault.CreateDatabase(CurrentProject.Path & "\" & dbName & ".mdb", dbLangGeneral, dbEncrypt)
   dbNew.Execute strTable
   Set CreateNewDatabase = dbNew
End Function