Hallo zusammen,
ich muesste eine in Access2010 importierte Umsatz-Tabelle in ein 'Datensatzkonformes Layout' bringen:
! Produkt ! Land ! 2010KW01 ! 2010KW02 ! .... ! 2011KW52 !
------------------------------------------------------------------
! Tisch ! Belgien ! 212 ! 356 ! .... ! 260 !
! Tisch ! Tuerkei ! 412 ! 584 ! .... ! 376 !
! Stuhl ! Luxemb ! 26 ! 35 ! .... ! 17 !
Und das Ergebnis soll wie folgt aussehen:
! Produkt ! Land ! Jahr/KW ! Wert !
--------------------------------------------
! Tisch ! Belgien ! 2010KW01 ! 212 !
! Tisch ! Belgien ! 2010KW02 ! 356 !
! . ! . ! . ! . !
! . ! . ! . ! . !
! . ! . ! . ! . !
! Tisch ! Belgien ! 2011KW52 ! 26o !
! Tisch ! Tuerkei ! 2010KW01 ! 412 !
! Tisch ! Tuerkei ! 2010KW02 ! 584 !
! . ! . ! . ! . !
! . ! . ! . ! . !
! . ! . ! . ! . !
! Tisch ! Tuerkei ! 2011KW52 ! 376 !
! Stuhl ! Luxemb ! 2010KW01 ! 26 !
! Stuhl ! Luxemb ! 2010KW02 ! 35 !
! . ! . ! . ! . !
! . ! . ! . ! . !
! . ! . ! . ! . !
! Stuhl ! Luxemb ! 2011KW52 ! 17 !
Ich recherchiere schon seit Tagen...; kann aber nichts finden. Hat hier jemand eine Idee? Makro, VBA, Abfrage oder Kreuztabelle, Pivot, SQL ?
Vielen Dank
Gruß
Jan
Etwa so:
Sub umformung()
Dim db As DAO.Database
Dim rs As DAO.Recordset
Dim i As Long
Set db = CurrentDb
Set rs = db.OpenRecordset("Quelltabelle", dbOpenSnapshot)
With rs
For i = 2 To .Fields.Count - 1
db.Execute "INSERT INTO Zieltabelle (Produkt, Land, [Jahr/KW], [Wert])" & _
" SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i).Name & _
" FROM Quelltabelle", dbFailOnError
Next
.Close
End With
Set rs = Nothing
Set db = Nothing
End Sub
Wenn Du aber von datenbankkonform sprichst, solltest Du statt so etwas wie "2010KW01" besser ein richtiges Datum, z.B. den Wochenersten 03.01.2010 speichern. Das hätte eine Menge Vorteile in der weiteren Verarbeitung.
MfGA
ebs
Hallo EBS,
Die Umformung lief zwar im ersten Moment nicht, aber nachdem ich die Zeile:
ALT: " SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i).Name & _
NEU: " SELECT Produkt, Land, '" & .Fields(i).Name & "', " & .Fields(i) & " " & _
geändert habe, funktioniert das Ganze schon relativ gut.
Allerdings stimmt das Ergebnis noch nicht, die Routine nimmt immer wieder nur die Werte aus Zeile-1 der Quelltabelle:
Produkt Land Jahr/KW Wert
Tisch Belgien 2010KW01 212
Tisch Tuerkei 2010KW01 212
Stuhl Luxemb 2010KW01 212
Tisch Belgien 2010KW02 356
Tisch Tuerkei 2010KW02 356
Stuhl Luxemb 2010KW02 356
Tisch Belgien 2011KW52 260
Tisch Tuerkei 2011KW52 260
Stuhl Luxemb 2011KW52 260
Irgendeine Idee, womit man die Routine dazu bewegt, die darauffolgenden Werte der nächsten Spalten der Quelltabelle auszulesen?
@ EBS, aber bis hierher schon mal ein ganz grosses DANKE für deine Antwort und dem Code!!!
Gruß
Jan
ZitatDie Umformung lief zwar im ersten Moment nicht ...
Was war das Problem genau? Fehlermeldung?
Vermutlich müssen die Feldbezeichnungen in eckige Klammern gesetzt werden, führende Ziffern in der Bezeichnung könnten ein Problem sein.
Zitatwomit man die Routine dazu bewegt, die darauffolgenden Werte der nächsten Spalten der Quelltabelle auszulesen?
Halte Dich an das Original.
Du hast in der Anfügeanfrage den Feldnamen (stellvertretend für die ganze Spalte) durch einen Feldwert (ersten Feldwert) ersetzt.
db.Execute "INSERT INTO Zieltabelle (Produkt, Land, [Jahr/KW], [Wert])" & _
" SELECT Produkt, Land, '" & .Fields(i).Name & "', [" & .Fields(i).Name & _
"] FROM Quelltabelle", dbFailOnErrorTestweise kann man sich die erzeugte SQL-Anweisung ins Direktfenster ausgeben lassen und auf Plausibilität prüfen:
Dim sSQL As String
sSQL = "INSERT INTO ..."
Debug.Print sSQL
db.Execute sSQL, dbFailOnErrorDamit kannst Du Dir auch verdeutlichen, was Deine Korrektur erzeugt.
MfGA
ebs
Hallo ebs17,
Jupieeeeeee - es funktioniert ... Die Einsetzung von eckigen Klammern sind "der Bringer"!
1. Fehlermeldung vorher: Laufzeitfehler '3075': Syntaxfehler (fehlender Operator) in Abfrageausdruck '2010KW01'.
2. Wie das mit dem Debug.Print funktioniert, weiss ich noch nicht - dieser Befehl wird aber in meinem VBA-Excel-Buch erklärt. Das werde ich mir dann jetzt einmal zu Gemüte führen.
Also, vielen vielen Dank ebs17
Gruß
Jan
Debug.Print bewirkt eine Ausgabe ins Direktfenster.
Mit Strg + G kannst Du das Direktfenster öffnen und die Ausgabe betrachten.
MfGA
ebs