Code inverser une analyse croisée issu de la FAQ
Bonjour,
Je pars d'une table FRANCE avec un champ NumRegion et des champs Année (de 2006 à 1900) soit une 100aines de colonnes. Chaque colonne contient des Notes.
Je souhaite obtenir une table "cible" issue d'une analyse "décroisée" avec 1 champ NumRegion , 1 champ année (qui se démultiplie), et 1 champ Note (valeur transposée).
J'ai travaillé sur le code de la FAQ,
Code:
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 64
| Private Sub Commande0_Click()
Dim FRANCE As String
Dim cible As String
Dim nbfix As Integer
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
Set base = CurrentDb()
'If FRANCE = cible Then Exit Sub
'ici la procédure s'arrête si la table source n'existe pas
Set depart = base.OpenRecordset("FRANCE")
Set departdef = base.TableDefs("FRANCE").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 " & "FRANCE" & ";"
Debug.Print sql
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 " & "FRANCE" & ";"
DoCmd.RunSQL (sqlb)
Next boucle
DoCmd.SetWarnings True
End Sub |
Selon la FAQ les 1ères colonnes spécifiées par nbfix restent inchangée; en l'occurence NumRegion. La colonne ipivot représente la colonne suivante à nbfix et qui reprend les intitulés des colonnes supérieures, soit ma colonne Année. La colonne dpivot contient les valeurs transposées, soit mes notes.
Mais je n'obtiens pas les résultats escomptés : j'ai une table assez bizarre avec 2 colonnes :
ipivot qui contient en valeur la légende "NumRegion" + mes intitulés Années
dpivot qui contient la valeur de NumRegion.
Pour mieux comprendre je joins la bd avec la table "cible" créée à partir du code (situé dans le formulaire1). La table Millésime montre ce que je souhaite obtenir en terme de résulats.