Januar 24, 2021, 22:20:41

Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!


Daten aus Excel in Datenbank schreiben (Achtung Anfänger)

Begonnen von Berndi1970, Oktober 26, 2020, 10:02:50

⏪ vorheriges - nächstes ⏩

Berndi1970

Hallo!

Ich möchte gerne folgendes machen und habe keine Ahnung wie ich vorgehen soll.

Ich habe eine Excel-Tabelle, die in Form eines Kalenders für ca. 100 Personen für jeden Tag einen Zustand enthält.
Quasi so etwas wie einen Dienstplan.

Ich möchte nun als eine art Backup die Daten in eine Access-Datenbank schreiben und habe mir gedacht, dass ich einfach ein Feld mit allen Namen erstelle und ein Feld, in das ich die Daten des ganzen Jahres schreibe.

Das mit den namen habe ich so weit ganz gut hinbekommen, doch scheitere ich daran
1. Die Daten, die ich in ein mehrdimensionales Array geschrieben habe in die Datenbank zu schreiben
2. diesen Datensatz dem entsprechenden Namen zuzuordnen.

Wie muss ich da vorgehen?

Hier der Code, den ich mir zusammengebastelt habe und der nicht funktioniert:
Private Sub Write2Database(Name, Feld, Wert)
  Dim Datenbank As Database
  Dim Datensatz As Recordset
  Dim Tabelle As TableDef
  Dim namen As TableDefs
  Dim Feld1 As Field
  Dim Dateiname As String
 
  'On Error Resume Next
 
  Dateiname = "Q:\Datenbank.accdb"
  Set Datenbank = OpenDatabase(Dateiname)
  Set Datensatz = Datenbank.OpenRecordset(Name)
  With Datensatz
      .AddNew
      .Fields(Feld) = Wert
      .Update
      .Bookmark = .LastModified
  End With
  Datenbank.Close
End Sub



Sub array_erzeugen()

Dim SDate, EDate, Such As Date
Dim Z, X
Dim Comment As Object
Dim arr(366, 1)

SDate = DateValue(Worksheets(1).Cells(3, 2).Value)
EDate = DateValue(Worksheets(1).Cells(31, 192).Value)
X = 0

For Such = SDate To EDate

    With Worksheets(1).Range("A1:GJ54")
        Set Z = .Find(DateValue(Such), LookIn:=xlFormulas)

        If Not Z Is Nothing And _
           Z.Column = 1 Or _
           Z.Column = 33 Or _
           Z.Column = 65 Or _
           Z.Column = 97 Or _
           Z.Column = 129 Or _
           Z.Column = 161 Then _
           Set Z = .FindNext(Z)
         
        If Not Z Is Nothing Then
       
            arr(X, 0) = Worksheets(1).Cells(5, Z.Column).Value
            Set Comment = Worksheets(1).Cells(5, Z.Column).Comment
            If Not Comment Is Nothing Then arr(X, 1) = Worksheets(1).Cells(5, Z.Column).Comment.Text
           
        End If
   
    End With

    X = X + 1

Next

Call Write2Database("Namen", "Daten", arr)

End Sub

DF6GL

Hallo,


Set Datensatz = Datenbank.OpenRecordset(Name)
With Datensatz
      .AddNew
      .Fields(Feld) = Wert
      .Update
      .Bookmark = .LastModified


Hier wird versucht, in das Feld ("Feld"  == [Daten])  in der Tabelle "Name" ( == [Namen]) ein ganzen Array ("Arr") zu schreiben. Das geht so nicht. 

Das Array muss mit

For i = Lbound(Wert) to Ubound (Wert)

durchlaufen werden und jedes Array-Element einzeln in die Tabelle geschrieben werden.

Wozu soll .Bookmark dienen?



Berndi1970

Hallo und danke für die Antwort.

Oh, ich hatte irgendwie gehofft, man könne ein Arry wie ein JSON behandeln.
Da werde ich dann wohl ein anderes Format bauen müssen.

Das mit dem Bookmark habe ich aus einen Testscript, das ich im Internet gefunden habe.
Keine Ahnung was das ist oder wofür man es braucht.

Wie lautet die Antwort auf meine andere Frage?
Wie weise ich dann die Daten den Namen zu?

Gruß,

DF6GL

Hallo,

ZitatWie weise ich dann die Daten den Namen zu?


Naja, ein Access-Datensatz muss zwei Felder enthalten, eines für den Namen und eines für den Wert.

Bei Deinem Array sehe ich, dass nur ein Name mit den dazugehörenden 366 Werten gespeichert werden kann.

Am besten zeigst Du mal einen aussagekräftigen Ausschnitt des Excel-Sheets und den Aufbau der Access-Tabelle.
Vermutlich brauchst Du kein Array und kannst Die Werte aus den Excel-Zellen gleich in die Tabelle einfügen.

Berndi1970

Nun, das Excel-Sheet ist quasi ein Kalender mit einer Zelle pro Tag und zugewiesener Person.
In der Zelle kann entweder einer von acht verschiedenen Buchstaben drin stehen oder nichts.

Die Datenbank sieht momentan so aus, dass sie eine Tabelle enthält, in der in dem Feld "Namen" alle Namen drin stehen, wie sie in der Excel-Tabelle vorkommen. Sonst noch nix.

Ich will nun jeden einzelnen Zustand einer jeden einzelnen Zelle aus dieser Matrix auslesen und in weiteren Feldern (die noch zu erstellen wären) dem Namen zugordnet eintragen.

DF6GL

Hallo,

wenn anschließend Access-Methoden angewendet werden müssen

Zitateine Tabelle enthält, in der in dem Feld "Namen" alle Namen drin stehen.....
.... weiteren Feldern (die noch zu erstellen wären) dem Namen zugordnet eintragen.

dann bietet es sich an, das Ganze gleich in Access zu machen.

Wozu brauchst Du für diese Backup-Aufgabe eine Access-Tabelle mit Namen? Es reicht doch , die DAten, so wie sie in Excel stehen, in eine Access-Tabelle zu importieren, bzw. mittels Abfrage anzupassen und in eine Access-Tabelle zu schreiben.

Dazu in Access:


a) verknüpfe die xls-Datei(Sheet) als ext. Tabelle.
   Erstelle eine Tabelle mit Hilfe einer Tabellenerstellungsabfrage, die die Daten aus dem verknüpften Excel-Sheet liest, die Backup-Tabelle generiert und evtl. angepasst  füllt.

Für spätere Import-Vorgänge erstellst Du dann zusätzlich eine Anfügeabfrage, die die Übertragung durchführt.

b) Benutze die TransferSpeadSheet-Methode, um die Daten aus einer Excel-Liste direkt in eine Access-Tabelle zu transportieren. Hierbei können aber keine größeren Anpassungen gleichzeitig durchgeführt werden.



Lade mal eine Beispiel-Excel-Liste hier hoch (gezippt) .

Berndi1970

Das Problem bei deinem Vorschlag ist, dass es sich nicht um eine einfache Tabelle sondern eher um eine Art Excel-Anwendung handelt, bei der sehr viele Makros im Hintergrund arbeiten.

Bevor ich dir eine Kopie schicken kann, muss ich die erst einmal Datenschutztechnisch bereinigen.
Auch laufen die Makros nur in meinem Firmennetzwerk, da digital signiert.

Ich danke dir auf jeden Fall, dass du dich meiner annimmst.

DF6GL

Hallo,
Zitatbei der sehr viele Makros im Hintergrund arbeiten.

vielleicht liegt die verringerte Performance ja dadran...

Evtl. geht es auch schneller, wenn das Excel-Fenster unsichtbar gesetzt wird.






ebs17

Oktober 26, 2020, 19:13:59 #8 Letzte Bearbeitung: Oktober 26, 2020, 19:22:43 von ebs17
ZitatWith Worksheets(1).Range("A1:GJ54")
Wieviel Spalten sind das denn?
Nur mal so: Access kann maximal 255 Tabellenspalten verwalten, eine 1:1-Übernahme wie auch immer (Import, Verknüpfen) wird gnadenlos scheitern.

Da du wohl Neuling bist: Ab Excel 2010 ist Power Query verfügbar. Dieses verfügt z.B. über eine mächtige Unpivot-Funktionalität, womit man aus einer solchen Matrix eine ordentliche Tabelle (Liste, intelligente Tabelle) erzeugen kann. Letztere wäre dann mit Standardverfahren einfach in eine Access-DB übertragbar.


Zitateine Art Excel-Anwendung handelt, bei der sehr viele Makros im Hintergrund arbeiten
Solche Berechnungen schaltet man schlichtweg ab, wenn man sich nur um Daten kümmert.
Mit freundlichem Glück Auf!

Eberhard