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,
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.
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
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.
Partager