collapse

* Benutzer Info

 
 
Willkommen Gast. Bitte einloggen oder registrieren. Haben Sie Ihre Aktivierungs E-Mail übersehen?

* Wer ist Online

  • Punkt Gäste: 26
  • Punkt Versteckte: 0
  • Punkt Mitglieder: 0

Es sind keine Mitglieder online.

* Forenstatistik

  • stats Mitglieder insgesamt: 13569
  • stats Beiträge insgesamt: 60025
  • stats Themen insgesamt: 8214
  • stats Kategorien insgesamt: 5
  • stats Boards insgesamt: 16
  • stats Am meisten online: 415

Autor Thema: Tabelle Transponieren  (Gelesen 134 mal)

Offline Knopf

  • Newbie
  • Beiträge: 19
Tabelle Transponieren
« am: Juni 09, 2017, 19:20:41 »
Hallo Experten!

Ich bin gerade erstmalig dabei eine Access Datenbank aufzubauen. Aktuell versuche ich mich daran eine Tabelle mittels VBA zu "transponieren", jedoch kann meine Quelltabelle nicht ausgelesen werden. Ich habe viele Beiträge zu diesem Problem gesehen, aber keine Lösung zu meinem Problem. Mein Makro sieht wie folgt aus:

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

....
Hiermit will ich die Funktion aufrufen:

Private Sub Transpon_Click()

Dim Tabelle1 As String
Dim Tabelle2 As String

Call TransposeTable(Tabelle1, Tabelle2)
End Sub


Bei  Set rsBasis = db.OpenRecordset(strSourceObj) erhalte ich die Fehlermeldung, dass die Tabelle nicht gefunden werden konnte...
Es handelt sich um eine importierte Tabelle, aber keine verknüpfte. Ich nutze Access 2016.
Ich hoffe ihr könnt mir helfen. Vielen Dank schonmal!!

liebe Grüße
Knopf
 

Offline el_gomero

  • Access-Profi
  • **
  • Beiträge: 421
  • Wissen ist Macht - weiss nichts - Macht nichts
Re: Tabelle Transponieren
« Antwort #1 am: Juni 09, 2017, 19:36:30 »
Moinsen Knopf,

normalerweise erfüllt eine Kreuztabellenabfrage diesen Zweck - und das ganz ohne Code ;)
Gruß
Jürgen


Hilfe nach bestem Wissen, ohne Anspruch auf Richtigkeit und Vollständigkeit.
*feedback erwünscht*
Bitte Tipps lesen
 

Offline DF6GL

  • Global Moderator
  • Access-Oberguru
  • *****
  • Beiträge: 22795
Re: Tabelle Transponieren
« Antwort #2 am: Juni 09, 2017, 20:16:50 »
Hallo,

ungeachtet dessen zu Deinem Fehler:

Dim Tabelle1 As String
Dim Tabelle2 As String
Dim retc As Boolean

Tabelle1 = "MeineErsteTabelle"
Tabelle2 = "MeineZweiteTabelle"


retc= TransposeTable(Tabelle1,Tabelle2)

und btw:

Dim I As Long, J As Long
Dim intNumRecs As Long
Dim intNumFields As Long

Offline Knopf

  • Newbie
  • Beiträge: 19
Re: Tabelle Transponieren
« Antwort #3 am: Juni 09, 2017, 21:29:03 »
Vielen Dank für eure Antworten.

@Jürgen: Mein Ziel ist es, nur die Spaltennamen zu transponieren...soweit ich weiß geht das mit der Kreuztabelle nicht. Meine Tabelle sieht so aus:

Name    KW1     KW2    KW3
abc         1           2         3

und so soll sie aussehen:

Name  KW    Anzahl
abc     KW1      1
abc     KW2      2
abc     KW3      3
Jetzt will ich mich Schritt für Schritt vorarbeiten^^

@ Franz: Es hat funktioniert! :O Danke!:)

 

Offline ebs17

  • Access-Meister
  • ***
  • Beiträge: 744
Re: Tabelle Transponieren
« Antwort #4 am: Juni 10, 2017, 08:03:23 »
Zitat
Jetzt will ich mich Schritt für Schritt vorarbeiten
Vielleicht bietet das ein Orientierung:
Grundlagen - SQL ist leicht (9) - Pivottabelle in Listtabelle umformen
Mit freundlichem Glück Auf!

Eberhard
 

Offline Knopf

  • Newbie
  • Beiträge: 19
Re: Tabelle Transponieren
« Antwort #5 am: Juni 10, 2017, 10:52:20 »
Hallo Eberhard,

vielen Dank für deine Antwort. Ich habe die Vorgabe bekommen mit VBA zu arbeiten, nicht SQL und zudem habe ich noch variable Spaltennamen...
Meine Ausgangstabelle: (Ändert sich wöchentlich, also fortlaufende Kalenderwoche)
Nr  Name    KWn+1     KWn+2    KWn+3
  1     abc         1           2         3

Meine Zieltabelle:
Nr   Name  KW        Anzahl
  1    abc     KWn+1      1
  2    abc     KWn+2      2
  3    abc     KWn+3      3

Bei meiner Suche bin ich auf dieses Makro gestoßen:
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 Long, J As Long
    Dim intNumRecs As Long
    Dim intNumFields As Long

    TransposeTable = False 'Default-Rueckmeldung
    'Recordset für Basis-Tabelle initialisieren
    Set db = CurrentDb()
    Set rsBasis = db.OpenRecordset(strSourceObj)
    rsBasis.MoveLast
   
   
    '1.------------------------------------------------------------------------------------
    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
    '2.-------------------------------------------------------------------------------------
    '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
    '3.--------------------------------------------------------------------------------------
    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
    '4.----------------------------------------------------------------------------------------
    '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
    '5.----------------------------------------------------------------------------------------
    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

 Das funktioniert jetzt, macht aber nicht das was ich mir vorstelle^^ Ab dem 3. Punkt (da wird es erst interessant) komme ich nicht weiter. Es werden die Records gezählt. Ich müsste jetzt aber die Spaltennamen (1-2) anwählen und festlegen, dann einen neuen Spaltennamen für "KW" erstellen. Wie mache ich das?
Vielen Dank für eure Hilfe!
lg
Knopf
 

Offline Knopf

  • Newbie
  • Beiträge: 19
Re: Tabelle Transponieren
« Antwort #6 am: Juni 10, 2017, 20:05:21 »
Damit meine zweite Frage nicht untergeht habe ich sie in einem neuen Beitrag gestellt:

http://www.access-o-mania.de/forum/index.php?topic=22463.0

Diesen Beitrag schließe ich.