Bonjour !
T'as pas de bol aujourd'hui !
Je passais par là, et j'ai vu ta question... et j'ai eu envie de m'amuser une peu...
:p
Tu es prêt à copier-coller ?
Avant toutes choses, tu es prié de controler que tu as bien les références (Outils/Références) à
- Microsoft Scripting Runtime
- Microsoft Office x.xx Access Database Engine Object Library
D'abord, tu crées 5 modules de classe (Alt+F11 puis, Insertion/Module de classe)
et maintenant ... (fais attention au nom des classes !!)
CLASSE : myControlField
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 65
| '---------------------------------------------------------------------------------------
' Classe : myControlField
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet :
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
'Nécessite la bibliothèque DAO pour le DataTypeEnum
Public Name 'Nom du champ
Public DataType As dao.DataTypeEnum 'Type de données (DAO)
Public DataSize As Long 'Libellé du type de données
Public MaxLength As Long 'Longueur max trouvée dans le champ
Public Property Get DataTypeName() As String
'---------------------------------------------------------------------------------------
' Procedure : DataTypeName
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : renvoie le nom du type de données
'---------------------------------------------------------------------------------------
'
Select Case DataType
Case dbText
DataTypeName = "Text"
Case dbMemo
DataTypeName = "Mémo/HyperLien"
Case dbByte
DataTypeName = "Octet"
Case dbInteger
DataTypeName = "Entier"
Case dbLong
DataTypeName = "Entier Long"
Case dbSingle
DataTypeName = "Réel Simple"
Case dbDouble
DataTypeName = "Réel Double"
Case dbCurrency
DataTypeName = "Monétaire"
Case dbDecimal
DataTypeName = "Décimal"
Case dbDate
DataTypeName = "Date/Heure"
Case dbBoolean
DataTypeName = "Oui/Non"
Case dbAttachment
DataTypeName = "Pièce Jointe"
Case dbLongBinary
DataTypeName = "Objet OLE"
Case dbGUID
DataTypeName = "N° Réplication"
Case Else
DataTypeName = "-- UNKNOWN --"
End Select
End Property
Function GetRow(a_sSeparator As String) As String
Dim vTemp As Variant
vTemp = Array(Me.Name, Me.DataTypeName, Me.DataSize, Me.MaxLength)
GetRow = Join(vTemp, Left(Trim(a_sSeparator), 1))
End Function |
CLASSE : myControlFields
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 65 66 67 68 69 70 71 72 73 74 75 76
| '---------------------------------------------------------------------------------------
' Classe : myControlFields
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Collection de Champs pour le contrôle des tailles
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
Private m_oCollection As Collection
Public Function Count() As Long
'---------------------------------------------------------------------------------------
' Procedure : Count
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Nombre d'éléments strockés dans la collection
'---------------------------------------------------------------------------------------
'
Count = m_oCollection.Count
End Function
Public Function Item(a_vIndex As Variant) As myControlField
'---------------------------------------------------------------------------------------
' Procedure : Item
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Renvoie un élément de la collectino qui a été stocké au préalable.
' si l'argument pasé en paramètre (position ou nom) n'existe pas, la
' classe renvoie une erreur depuis cette procédure
'---------------------------------------------------------------------------------------
'
Set Item = m_oCollection.Item(a_vIndex)
End Function
Public Function Add(a_sNom As String, a_sType As DataTypeEnum, a_lTaille As Long, a_lMaxFounded As Long) As myControlField
'---------------------------------------------------------------------------------------
' Procedure : Add
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Création d'un objet myControlField et ajout à la collection
' La procédure est prévue pour renvoyer l'objet ainsi créé
'---------------------------------------------------------------------------------------
'
Dim oField As myControlField
Set oField = New myControlField
oField.Name = a_sNom
oField.DataType = a_sType
oField.DataSize = a_lTaille
oField.MaxLength = a_lMaxFounded
m_oCollection.Add oField, oField.Name
Set Add = oField
End Function
Private Sub Class_Initialize()
'---------------------------------------------------------------------------------------
' Procedure : Class_Initialize
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Constructeur de la classe. Initialisation de la collection
'---------------------------------------------------------------------------------------
'
Set m_oCollection = New Collection
End Sub
Private Sub Class_Terminate()
'---------------------------------------------------------------------------------------
' Procedure : Class_Terminate
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Destructeur de la classe. Destruction de la collection
'---------------------------------------------------------------------------------------
'
Set m_oCollection = Nothing
End Sub |
CLASSE : myControlTable
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99
| '---------------------------------------------------------------------------------------
' Classe : myControlTable
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Classe pour la gestion d'une table
' parcoure tous les champs de la table passée en paramètre et en stocke
' les informations
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
Private m_sNomTable As String
Private m_oFields As myControlFields
Property Let NomTable(a_sNomTable As String)
'---------------------------------------------------------------------------------------
' Procedure : NomTable
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : A la définition de la table, récupère les informations des champs et les
' ajoute à la collection des champs
'---------------------------------------------------------------------------------------
'
Dim iCount As Long
Dim sNom As String
Dim eType As dao.DataTypeEnum
Dim lTaille As Long
Dim lMax As Long
Set m_oFields = New myControlFields
m_sNomTable = a_sNomTable
For iCount = 0 To CurrentDb.TableDefs(a_sNomTable).Fields.Count - 1
sNom = CurrentDb.TableDefs(a_sNomTable).Fields(iCount).Name
eType = CurrentDb.TableDefs(a_sNomTable).Fields(iCount).Type
lTaille = CurrentDb.TableDefs(a_sNomTable).Fields(iCount).Size
lMax = MaxSize(a_sNomTable, sNom, eType)
m_oFields.Add sNom, eType, lTaille, lMax
Next
'Set oFld = Nothing
'Set oTable = Nothing
End Property
Function Fields() As myControlFields
'---------------------------------------------------------------------------------------
' Procedure : Fields
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Renvoie la collection des fields
'---------------------------------------------------------------------------------------
'
Set Fields = m_oFields
End Function
Property Get NomTable() As String
'---------------------------------------------------------------------------------------
' Procedure : NomTable
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Renvoie le nom de la table
'---------------------------------------------------------------------------------------
'
NomTable = m_sNomTable
End Property
Private Function MaxSize(a_sTableName As String, a_sFieldName As String, a_eDataType As DataTypeEnum) As Long
'---------------------------------------------------------------------------------------
' Procedure : MaxSize
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : fonction privée servant au calcul du nombre de caractères dans un champ
' texte, ou de la taille nécessaire au stockage des nombres présents
'---------------------------------------------------------------------------------------
'
Dim orst As dao.Recordset
Select Case a_eDataType
Case dbText
Set orst = CurrentDb.OpenRecordset("SELECT MAX(Len([" & a_sFieldName & "])) FROM [" & a_sTableName & "]", dbOpenSnapshot)
MaxSize = orst.Fields(0).Value
Case dbByte, dbInteger, dbLong, dbSingle, dbDouble, dbCurrency, dbDecimal
Set orst = CurrentDb.OpenRecordset("SELECT MAX(Abs([" & a_sFieldName & "])) FROM [" & a_sTableName & "]", dbOpenSnapshot)
Dim stemp As String
stemp = Hex$(orst.Fields(0).Value)
If Len(stemp) Mod 2 = 1 Then stemp = "0" & stemp
MaxSize = Len(stemp) \ 2
Case dbBoolean
MaxSize = 1
Case dbDate
MaxSize = 8
Case dbGUID
MaxSize = 16
Case Else
MaxSize = 999999
End Select
Set orst = Nothing
End Function |
CLASSE : myControlTables
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 65 66 67 68 69 70 71 72 73
| '---------------------------------------------------------------------------------------
' Classe : myControlTables
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet :
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
Private m_oCollection As Collection
Public Function Count() As Long
'---------------------------------------------------------------------------------------
' Procedure : Count
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet :
'---------------------------------------------------------------------------------------
'
Count = m_oCollection.Count
End Function
Public Function Item(a_vIndex As Variant) As myControlTable
'---------------------------------------------------------------------------------------
' Procedure : Item
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Renvoie un élément de la collection qui a été stocké au préalable.
' si l'argument pasé en paramètre (position ou nom) n'existe pas, la
' classe renvoie une erreur depuis cette procédure
'---------------------------------------------------------------------------------------
'
Set Item = m_oCollection.Item(a_vIndex)
End Function
Public Function Add(a_sNom As String) As myControlTable
'---------------------------------------------------------------------------------------
' Procedure : Add
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Création d'un objet myControlTable et ajout à la collection
' La procédure est prévue pour renvoyer l'objet ainsi créé
'---------------------------------------------------------------------------------------
'
Dim oTable As myControlTable
Set oTable = New myControlTable
oTable.NomTable = a_sNom
m_oCollection.Add oTable, oTable.NomTable
Set Add = oTable
End Function
Private Sub Class_Initialize()
'---------------------------------------------------------------------------------------
' Procedure : Class_Initialize
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Constructeur de la classe. Initialisation de la collection
'---------------------------------------------------------------------------------------
'
Set m_oCollection = New Collection
End Sub
Private Sub Class_Terminate()
'---------------------------------------------------------------------------------------
' Procedure : Class_Terminate
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Destructeur de la classe. Destruction de la collection
'---------------------------------------------------------------------------------------
'
Set m_oCollection = Nothing
End Sub |
et pour finir, la dernière :
CLASSE : myControl
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 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94
| '---------------------------------------------------------------------------------------
' Classe : myControl
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet :
'---------------------------------------------------------------------------------------
Option Compare Database
Option Explicit
'Utilité du Microsoft Scripting Runtime
Dim m_oTables As myControlTables
Private Sub Class_Initialize()
'---------------------------------------------------------------------------------------
' Procedure : Class_Initialize
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Constructeur
' Parcoure toutes les tables non systme de la base en cours
'---------------------------------------------------------------------------------------
'
Dim oTable As TableDef
Set m_oTables = New myControlTables
For Each oTable In CurrentDb.TableDefs
If (oTable.Attributes And dbSystemObject) Then
'rien à faire
Else
m_oTables.Add oTable.Name
End If
Next
End Sub
Private Sub Class_Terminate()
'---------------------------------------------------------------------------------------
' Procedure : Class_Terminate
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Destructeur
' Détruit l'objet myControlTables
'---------------------------------------------------------------------------------------
'
Set m_oTables = Nothing
End Sub
Function Tables() As myControlTables
'---------------------------------------------------------------------------------------
' Procedure : Tables
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Renvoie l'objet myControlTables
'---------------------------------------------------------------------------------------
'
Set Tables = m_oTables
End Function
Function ReportsTo(a_sFileName As String) As Boolean
'---------------------------------------------------------------------------------------
' Procedure : ReportsTo
' Auteur : Maxence HUBICHE (http://www.1formaxion.com)
' Date : 24/03/2011
' Objet : Génère un fichier texte avec le rapport complet
'---------------------------------------------------------------------------------------
'
Dim oFSO As Scripting.FileSystemObject
Dim oFile As Scripting.TextStream
Dim iCountTables As Long
Dim iCountFields As Long
Set oFSO = New Scripting.FileSystemObject
Set oFile = oFSO.CreateTextFile(a_sFileName, True, True)
oFile.WriteLine String(80, "=")
oFile.WriteLine "DEBUT DU RAPPORT"
oFile.WriteLine "Auteur : " & Environ("UserName")
oFile.WriteLine "Date : " & Now()
oFile.WriteLine "Base de données : " & CurrentDb.Name
oFile.WriteLine String(80, "=")
oFile.WriteBlankLines 3
For iCountTables = 1 To m_oTables.Count
oFile.WriteLine String(80, "-")
oFile.WriteLine "Table : " & m_oTables.Item(iCountTables).NomTable
oFile.WriteLine String(80, "-")
oFile.WriteLine "Champ" & vbTab & "DataType" & vbTab & "Taille" & vbTab & "Max"
For iCountFields = 1 To m_oTables.Item(iCountTables).Fields.Count
oFile.WriteLine m_oTables.Item(iCountTables).Fields.Item(iCountFields).GetRow(vbTab)
Next
Next
oFile.Close
End Function |
Voilà...
Et maintenant, comment on se sert de tout cela ?
Rien de plus simple !
Il te suffit d'un simple module, avec quelques lignes de code dedans ...
Par exemple :
Code :
1 2 3 4 5 6
| Sub test()
Dim x As myControl
Set x = New myControl
x.ReportsTo "c:\ctl.txt"
msgbox "Terminé !"
End Sub |
Et puis alors tu vas regarder ce que tu obtiens dans ton fichier c:\ctl.txt
vàlà :p