1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63
|
Sub anadecroise(source As String, cible As String, nbfix As Integer)
'cette procèdure crée une table cible
'à partir de la table source
' elle fait le travail inverse d'une requête analyse croisée
'les premières colonnes spécifiées par nbfix restent inchangées
'la colonne (ipivot) suivante reprendra les intitulés des
' colonnes supérieures à nbfix
'la colonne suivante (dpivot) contient les valeurs transposées
Dim base As DAO.Database
Dim champ As DAO.Field
Dim depart As DAO.Recordset
Dim departdef As DAO.Fields
Dim boucle As Integer
Dim typechamp As Integer
Dim incohérent As Boolean
Dim sql As String
Dim sqlb As String
If source = cible Then Exit Sub
Set base = CurrentDb()
'ici la procédure s'arrête si la table source n'existe pas
Set depart = base.OpenRecordset(source)
Set departdef = base.TableDefs(source).Fields
'vérification du nombre de champ à transposer
If nbfix + 2 > departdef.Count Then
MsgBox "il doit y avoir au moins deux champs à transposer", vbCritical, "ERREUR"
Exit Sub
End If
'vérification du type des champs de source
typechamp = departdef(nbfix).Type
incohérent = False
For boucle = nbfix + 1 To departdef.Count - 1
Set champ = departdef(boucle)
If champ.Type <> typechamp Then incohérent = True
Next boucle
If incohérent Then
MsgBox "tous les champs transposés doivent avoir le même type", vbCritical, "ERREUR"
Exit Sub
End If
'création de la table cible et ajout de la première colonne à transposer
sql = "SELECT "
For boucle = 0 To nbfix - 1
sql = sql & departdef(boucle).Name & ","
Next boucle
sql = sql & "'" & departdef(nbfix).Name & "' as ipivot"
sql = sql & ", " & departdef(nbfix).Name & " as dpivot into " & cible & " from " & source & ";"
DoCmd.RunSQL (sql)
sql = "INSERT INTO " & cible & "("
For boucle = 0 To nbfix - 1
sql = sql & departdef(boucle).Name & ","
Next boucle
sql = sql & "ipivot,dpivot ) select "
For boucle = 0 To nbfix - 1
sql = sql & departdef(boucle).Name & ","
Next boucle
DoCmd.SetWarnings False
'ajout des données suivantes
For boucle = nbfix + 1 To departdef.Count - 1
sqlb = sql & "'" & departdef(boucle).Name & "' as ipivot," & departdef(boucle).Name & " as dpivot from " & source & ";"
DoCmd.RunSQL (sqlb)
Next boucle
DoCmd.SetWarnings True
End Sub |
Partager