Office Forum
www.Office-Loesung.de
Access :: Excel :: Outlook :: PowerPoint :: Word :: Office :: Wieder Online ---> provisorisches Office Forum <-
Transponieren von Tabellen und Abfragen
zurück: Datensatz an Exceltabelle anhängen weiter: Arbeiten mit Dateien aus ACCESS heraus..für Anfänger Unbeantwortete Beiträge anzeigen
Neues Thema eröffnen   Neue Antwort erstellen     Status: Tutorial Facebook-Likes Diese Seite Freunden empfehlen
Zu Browser-Favoriten hinzufügen
Autor Nachricht
stpimi
Moderator Access


Verfasst am:
21. Jul 2005, 09:44
Rufname:
Wohnort: Graz

Transponieren von Tabellen und Abfragen - Transponieren von Tabellen und Abfragen

Nach oben
       

Manchmal wird gewünscht, für einen Bericht die Datensätze nebeneinander und die Spalten untereinander zu haben. Dazu habe ich in einem Newsletter von SmartTools Publishing vom Mai 2004 folgende VBA-Lösung mit Hilfstabelle gefunden:

Zitat:
Transponieren von Tabellen und Abfragen

Versionen: Access 97, 2000, 2002/XP und 2003

Fuer viele Auswertungen waere es sinnvoll, Tabellen oder Abfragen zu transponieren, so dass die Feldnamen zeilenweise
und die Feldinhalte spaltenweise ausgegeben werden. Access selbst stellt dafür leider keine interne Funktion bereit,
aber mit Hilfe einer kleinen VBA-Funktion, die wir Ihnen in diesem Tipp der Woche vorstellen, laesst sich diese Aufgabe
schnell erledigen:
  1. Legen Sie ein neues Modul an und speichern Sie es unter dem Namen "modTranspose".

  2. Waehlen Sie das Menue EXTRAS-VERWEISE an und setzen Sie einen Verweis auf "Microsoft DAO 3.5x Object Library"
    (Access 97) beziehungsweise auf "Microsoft DAO 3.6x Object Library" (ab Access 2000).

  3. Geben Sie die folgende Funktion ein:
    Code:
    Function TransposeTable(strSourceObj As String, _
                            strTranspTable As String) As Boolean
        Dim db As DAO.Database
        Dim rsBasis As DAO.Recordset
        Dim rsTranspose As DAO.Recordset
        Dim tdfNewDef As DAO.TableDef
        Dim fldNewField As DAO.Field
        Dim I As Integer, J As Integer
        Dim intNumRecs As Integer
        Dim intNumFields As Integer

        TransposeTable = False 'Default-Rueckmeldung
        'Recordset für Basis-Tabelle initialisieren
        Set db = CurrentDb()
        Set rsBasis = db.OpenRecordset(strSourceObj)
        rsBasis.MoveLast
        '1. Spalte für Feldnamen
        intNumRecs = rsBasis.RecordCount
        If intNumRecs > 254 Then
            Beep
            MsgBox "Tabelle " & strSourceObj & " beinhaltet mehr als 254 " & _
                   "Datensaetze...", vbOKOnly + vbExclamation, "!!! Problem !!!"
            rsBasis.Close
            Exit Function
        End If
        intNumFields = rsBasis.Fields.Count - 1
        For I = 0 To intNumFields
            If rsBasis.Fields(I).Type = dbMemo Or _
               rsBasis.Fields(I).Type = dbLongBinary Then
                Beep
                MsgBox "Tabelle " & strSourceObj & " beinhaltet spezielle " & _
                       "Felder, " & "die nicht komplett übernommen werden " & _
                       "können...", vbOKOnly + vbInformation, "!!! Hinweis !!!"
            End If
        Next I
        'Ziel-Tabelle anlegen/loeschen...
        DoCmd.Hourglass True
        DoEvents
        On Error Resume Next
        Set tdfNewDef = db.TableDefs(strTranspTable)
        If Err = 0 Then 'Tabelle ist vorhanden, loeschen
            DoCmd.SetWarnings False
            DoCmd.DeleteObject acTable, strTranspTable
            DoCmd.SetWarnings True
        End If
        Set tdfNewDef = db.CreateTableDef(strTranspTable)
        For I = 0 To rsBasis.RecordCount
            Set fldNewField = tdfNewDef.CreateField(CStr(I + 1), dbText)
            tdfNewDef.Fields.Append fldNewField
        Next I
        Err = 0
        db.TableDefs.Append tdfNewDef
        If Err <> 0 Then
            DoCmd.Hourglass False
            Beep
            MsgBox "Tabelle " & strTranspTable & " konnte nicht angelegt " & _
                   "werden..." & vbCrLf & vbCrLf & "Fehler: " & _
                   CStr(Err.Number) & "/" & Err.Description, _
                   vbOKOnly + vbExclamation, "!!! Probblem !!!"
            rsBasis.Close
            Exit Function
        End If
        'Recordset für Ziel-Tabelle initialisieren
        '1. Spalte mit Feldnamen fuellen
        Set rsTranspose = db.OpenRecordset(strTranspTable)
        For I = 0 To rsBasis.Fields.Count - 1
            With rsTranspose
                .AddNew
                .Fields(0) = rsBasis.Fields(I).Name
                .Update
            End With
        Next I
        'ab 2. Spalte mit Daten fuellen
        rsBasis.MoveFirst
        rsTranspose.MoveFirst
        For J = 0 To rsBasis.Fields.Count - 1
            For I = 1 To rsTranspose.Fields.Count - 1
                With rsTranspose
                    .Edit
                    .Fields(I) = rsBasis.Fields(J)
                    rsBasis.MoveNext
                    .Update
                End With
            Next I
            rsBasis.MoveFirst
            rsTranspose.MoveNext
        Next J
        'und fertig...
        TransposeTable = True
        rsBasis.Close
        rsTranspose.Close
        DoCmd.Hourglass False
    End Function

  4. Speichern Sie das Modul.
Die Funktion "TransposeTable()" erwartet als ersten Parameter den Namen einer Tabelle oder einer Abfrage und als
zweiten Parameter den Namen einer Tabelle, in der das transponierte Ergebnis abgelegt werden soll.
Das Funktionsergebnis ist "True", wenn die Tabelle/Abfrage erfolgreich in die angegebene Zieltabelle geschrieben wurde.
Andernfalls wird "False" zurueckgemeldet.

Zur Arbeitsweise der Funktion "TransposeTable()": Da beim Transponieren die normalerweise zeilenweise angeordneten
Datensaetze spaltenweise ausgeben werden und somit pro Datensatz jeweils ein Feld noetig ist, können nur Tabellen
oder Abfragen transponiert werden, die maximal 254 Datensaetze liefern. Ein Feld ist standardmaessig für die
Feldnamen in der 1. Spalte reserviert, so dass nur besagte 254 Datensaetze transponiert werden können. Grund für
diese Einschraenkung ist Access, das pro Tabelle nicht mehr als 255 Felder erlaubt. Spezialfelder wie Memo- oder OLE-
Felder können nicht transponiert werden, da eine Transponierung in der Ziel-Tabelle nur Felder vom Datentyp
"Text" zulaesst.

Im ersten Schritt pruefen wir also die Quell-Tabelle/-Abfrage daraufhin, ob sie mehr als 255 Datensaetze umfasst
und ob sie spezielle Felder (Memo, OLE) beinhaltet, die nicht transponiert werden können. Wenn Sie eine Tabelle
oder Abfrage mit mehr als 254 Datensaetzen im Ergebnis zu transponieren versuchen, zeigt die Funktion eine
entsprechende Fehlermeldung an und bricht den Vorgang ab.
Reichen 254 Datensaetze für Ihre Anforderungen nicht aus, müssen Sie gegebenenfalls den Datenbestand über mehrere
Abfragen und den Einsatz entsprechender Kriterien auf jeweils maximal 254 Datensaetze aufteilen und jede Abfrage
einzeln transponieren. Auf Spezialfelder macht die Funktion mit einer entsprechenden Warnmeldung aufmerksam und
ignoriert diese Felder beim Transponieren. Moechten Sie die Warnmeldung vermeiden, erstellen Sie eine Abfrage, die nur
die "normalen" Felder (Text, Zahl, Datum/Zeit, Ja/Nein) der Tabelle auswaehlt.

Anschliessend geht es daran, die Ziel-Tabelle anzulegen. Ist diese vorhanden, wird sie zunaechst automatisch geloescht
und komplett neu angelegt, um sicherzustellen, dass sie korrekte Ergebnisse aufnehmen kann. Um die sonst zeilenweise
angeordneten Datensaetze spaltenweise ausgeben zu können, definieren wir danach für die Ziel-Tabelle zunaechst ein
zusaetzliches Feld, das die Feldnamen in der 1. Spalte anzeigt. Anschliessend wird pro Datensatz ein weiteres Feld
angelegt. Ueber die TableDefs-Auflistung der Datenbank fügen wir dann die Definition der für die spaltenweise
Wiedergabe der Datensaetze notwendigen Felder hinzu.
Anschliessend legen wir pro Feld einen Datensatz für die spaltenweise Ausgabe an und übertragen dabei die Feldnamen
des Ausgangs-Objektes in die 1. Spalte der Ziel-Tabelle. In einer Schleife fuellen wir dann schliesslich die Datensaetze
ab der 2. Spalte mit den Daten aus den Datensaetzen des Basis-Objektes.

Bitte beachten Sie beim Einsatz dieser Loesung noch folgendes: Wenn die Ziel-Tabelle vorhanden ist, wird sie
über die Funktion "TransposeTable()" automatisch ohne Rueckfrage geloescht! Sollten Sie die Inhalte noch
benoetigen, benennen Sie sie vorher einfach im Datenbankfenster um. Die Transponierung kann je nach Umfang
des Datenbestandes geraume Zeit in Anspruch nehmen. Es können durchaus einige Minuten vergehen, bis alle Daten umgesetzt sind!

_________________
Lg, Michael

Dein Feedback hilft auch anderen - vergiß es nicht!
Willi Wipp
Moderator


Verfasst am:
21. Apr 2006, 09:59
Rufname:
Wohnort: Raum Wiesbaden


Re: Transponieren von Tabellen und Abfragen - Re: Transponieren von Tabellen und Abfragen

Nach oben
       

Hi stpimi,

schoene Loesung!

Nachfragen zum Thema bitte hier Transponieren von Tabellen und Abfragen {Nachgefragt} stellen.

_________________
Eine kurze Rueckmeldung waere nett
SL Willi Wipp

(Anleitung fuer das Anhaengen von Dateien: Klicke links auf [www], Gaeste muessen sich dafuer anmelden)
Neues Thema eröffnen   Neue Antwort erstellen Alle Zeiten sind
GMT + 1 Stunde

Diese Seite Freunden empfehlen

Seite 1 von 1
Gehe zu:  
Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum nicht posten
Du kannst Dateien in diesem Forum herunterladen

Verwandte Themen
Forum / Themen   Antworten   Autor   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge Access Tabellen & Abfragen: mehrere Abfragen in einem Formular zum Auswerten 2 bpointz 1086 27. Mai 2004, 10:39
bpointz mehrere Abfragen in einem Formular zum Auswerten
Keine neuen Beiträge Access Tabellen & Abfragen: Löschabfrage -> findet Tabellen nicht (GELÖST) 14 DAU 5674 26. Mai 2004, 13:18
DAU Löschabfrage -> findet Tabellen nicht (GELÖST)
Keine neuen Beiträge Access Tabellen & Abfragen: Frontend und Backend: kann nicht auf die Tabellen zugreifen 1 mhw 803 25. Mai 2004, 12:25
Robsl Frontend und Backend: kann nicht auf die Tabellen zugreifen
Keine neuen Beiträge Access Tabellen & Abfragen: Zwei Tabellen zusammenfügen und Nullwerte überschreiben 1 m.hataj 1304 13. Mai 2004, 18:10
faßnacht(IT); Zwei Tabellen zusammenfügen und Nullwerte überschreiben
Keine neuen Beiträge Access Tabellen & Abfragen: kriterium - datensatz nur in einer von zwei tabellen 3 budking82 1000 11. Mai 2004, 12:59
budking82 kriterium - datensatz nur in einer von zwei tabellen
Keine neuen Beiträge Access Tabellen & Abfragen: Abfrage erstelen, die zwei tabellen vergleicht 2 pucky 802 27. Apr 2004, 10:53
ProLogistik Abfrage erstelen, die zwei tabellen vergleicht
Keine neuen Beiträge Access Tabellen & Abfragen: Abgleich von 2 tabellen in access 2003 4 Fierce 1719 16. Apr 2004, 08:27
el_gomero Abgleich von 2 tabellen in access 2003
Keine neuen Beiträge Access Tabellen & Abfragen: datensatz aus mehreren Tabellen im formular anzeigen 1 SixPack 1197 29. März 2004, 10:53
Willi Wipp datensatz aus mehreren Tabellen im formular anzeigen
Keine neuen Beiträge Access Tabellen & Abfragen: neue Tabellen erzeugen; kopieren 7 DiplomandSPS 1323 25. März 2004, 10:01
fridgenep neue Tabellen erzeugen; kopieren
Keine neuen Beiträge Access Tabellen & Abfragen: Tabellen verknüpfen 1 darkblue82 802 05. März 2004, 12:00
lothi Tabellen verknüpfen
Keine neuen Beiträge Access Tabellen & Abfragen: 2 Textboxen und 2 Kombifelder mit UND (ODER) abfragen 1 Gast 486 03. März 2004, 09:57
lothi 2 Textboxen und 2 Kombifelder mit UND (ODER) abfragen
Keine neuen Beiträge Access Tabellen & Abfragen: Problem mit Abfragen & Beziehungen! 1 zulupower 691 25. Feb 2004, 18:20
faßnacht(IT); Problem mit Abfragen & Beziehungen!
 

----> Diese Seite Freunden empfehlen <------ Impressum - Besuchen Sie auch: Microsoft Excel Tricks