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 : Sélectionner tout - Visualiser dans une fenêtre à part
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.