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
Moinsen Knopf,
normalerweise erfüllt eine Kreuztabellenabfrage diesen Zweck - und das ganz ohne Code ;)
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
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!:)
ZitatJetzt will ich mich Schritt für Schritt vorarbeiten
Vielleicht bietet das ein Orientierung:
Grundlagen - SQL ist leicht (9) - Pivottabelle in Listtabelle umformen (http://www.ms-office-forum.net/forum/showthread.php?t=338193)
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
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.