Bonjour
Suite à une discussion sur le forum, je vous propose une petite routine.
Il arrive que l'on ait à éclater des fichiers, par exemple différencier les hommes des femmes par la civilité, extraire des régions, etc.
Cela peut se faire par des requêtes de créations multiples, mais cela peut-être long et fastidieux.
Je vous propose donc cette petite routine générique qui permettra en sélectionnant la table, le champ et le type de champ d'avoir autant de tables que de données différentes dans le champ souhaité.
Pour cela, il faut déclarer une donnée de type Enum dans un module
1 2 3 4 5
| Public Enum TypeChamp
phTexte = 1
phNum = 2
phDate = 3
End Enum |
Ensuite, dans le module coller la routine suivante (celle-ci est entièrement documenté).
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 65 66 67
| Public Sub EclatageTable(strTable As String, strChamp As String, bytTypeChamp As TypeChamp)
'---------------------------------------------------------------------------------------
' Procedure : EclatageTable
' Auteur : Philippe JOCHMANS - http://starec.developpez.com
' Date : 02/05/2011
' Commentaires : Routine d'éclatage de table
' Paramètres en entrée :
' strTable : Nom de la table qui doit être éclatée
' strChamp : Nom du champ de référence
' bytTypeChamp : Type de champ pour réaliser la requête adéquate
'
' Remarques : Ne pas oublier de cocher la bibliothèque Microsoft DAO 3.6
'---------------------------------------------------------------------------------------
' déclaration des variables
Dim db As DAO.Database
Dim rstChamp As DAO.Recordset ' recordset pour récupérer les informations sur le champ qui sert de référence à l'éclatage
Dim strSQL As String 'stockage des chaines SQL
Dim strSqlWhere As String ' clause Where de la requête SQL qui éclatera le fichier
' affectation
Set db = CurrentDb
' requête qui permettra de récupérer le nombre d'éléments différents du champs de référence
strSQL = "SELECT " & strChamp & " FROM " & strTable & " GROUP BY " & strChamp
' utilisation d'un recordset en fonction du champ de critère pour récupérer les différents critères d'éclatage
strSQL = "SELECT " & strChamp & " FROM " & strTable & " GROUP BY " & strChamp
Set rstChamp = db.OpenRecordset(strSQL)
While Not rstChamp.EOF
' génération de la clause Where de la requête de création en fonction du type de champ
Select Case bytTypeChamp
Case 1 ' champ de type texte
strSqlWhere = strChamp & "='" & rstChamp(strChamp) & "'"
Case 2 ' champ de type numérique
strSqlWhere = strChamp & "=" & rstChamp(strChamp)
Case 3 ' champ de type date
strSqlWhere = strChamp & "=#" & Format(rstChamp(strChamp), "mm/dd/yyyy") & "#"
End Select
' création des différentes tables
db.Execute "SELECT * INTO " & strTable & "_" & Replace(rstChamp(strChamp), "/", "_") & " FROM " & strTable & " WHERE " & strSqlWhere
' passage au critère suivant
rstChamp.MoveNext
Wend
' mise à jour de la fenêtre base de données
Application.RefreshDatabaseWindow
' libération des objets
rstChamp.Close
Set rstChamp = Nothing
MsgBox "Fin de traitement"
End Sub |
Par exemple, nous voulons à partir de la table Table1 créer une table différente par rapport aux différentes dates qui se trouvent dans le champ dte de type date.
Call EclatageTable("Table1", "dte", phDate)
Philippe
Partager