Excel et les bases de données
Si l'on se place du point de vue informatique, le travail des comptables nationaux présente deux caractéristiques essentielles :
• il porte sur des données nombreuses ;
• les comptes se présentent sous la forme de tableaux.
Pour travailler sur des données nombreuses, les bases de données sont l'outil idéal, pour travailler sur des tableaux il est difficile d'imaginer mieux qu'un tableur. Un logiciel qui permettrait de combiner ces deux outils serait donc particulièrement bien adapté au travail du comptable national. Or, il se trouve qu'Excel, qui est fondamentalement un tableur, permet également de travailler en relation avec des bases de données. Si l'on ajoute à cette propriété remarquable la capacité de programmation, on obtient un outil qui peut s'avérer extrêmement puissant entre les mains d'un comptable national expérimenté.
Excel peut donc travailler avec de nombreuses bases de données. Notons, cependant, que l'un des inconvénients des bases de données actuelles est l'inexistence d'un format de fichier universel, si bien qu'il est parfois difficile d'utiliser les résultats produits par un gestionnaire de base de données avec un autre gestionnaire de bases de données. Ceci peut s'avérer un inconvénient non négligeable pour les comptables nationaux amenés à travailler dans différents pays. Aussi, l'une des solutions possibles est l'utilisation de fichiers textes de format CSV.
Les fichiers CSV sont des fichiers texte contenant des données séparées par un pointvirgule. Il s'agit ici du format européen car le format américain utilise la virgule comme séparateur (d'où le nom Comma Separator Values). Les fichiers CSV permettent de stocker des données qui pourront être utilisées aussi bien par Excel que par n'importe quel gestionnaire de bases de données.
Utiliser des fichiers CSV dans Excel présente quatre grands avantages :
• il est possible de travailler avec des fichiers contenant plus d'enregistrements que le nombre de lignes des feuilles de calcul Excel ;
• il est possible d'appliquer des requêtes SQL à ces fichiers, ce qui permet d'utiliser Excel comme un gestionnaire de bases de données ;
• ces fichiers sont, comparativement à d'autres formats, très compacts. C'est particulièrement vrai pour les fichiers organisés en hypercubes qui contiennent essentiellement des codes, c'est-à-dire des textes ;
• les fichiers permettent d'échanger facilement des données avec d'autres programmes car le format CSV est universel.
Les fichiers CSV n'ont cependant pas que des avantages. Ainsi, on ne peut pas les modifier aussi facilement avec des requêtes SQL que des fichiers utilisant d'autres formats. En effet, les enregistrements étant de longueur variable et écrits les uns à la suite des autres, il n'est pas possible, par exemple, de remplacer un enregistrement par un autre plus long sans modifier totalement le fichier. Aussi, la méthode normale pour corriger un enregistrement dans un fichier CSV est-elle d'annuler l'ancien enregistrement par un enregistrement de signe contraire avant de passer le nouvel enregistrement. Cette contrainte n'est pas nécessairement un inconvénient en comptabilité nationale car elle oblige à conserver la trace des corrections, comme c'est le cas en comptabilité d'entreprise. L'autre inconvénient est l'existence de deux formats de fichiers CSV, le format d'origine avec la virgule comme séparateur de données et le point pour séparer la partie décimale des nombres, le format européen qui utilise le point-virgule comme séparateur de données et la virgule pour les décimales. Il sera donc nécessaire dans la définition de ces fichiers de spécifier quel est le séparateur décimal.
Nous ne traiterons ici que des fichiers CSV structurés en hypercubes. Le moyen le plus simple de créer un petit fichier CSV est de l'écrire dans une feuille Excel et de le sauvegarder au format CSV. La première ligne doit contenir les noms des variables et les suivantes les enregistrements. Par exemple, le fichier peut être constitué de la manière suivante :
Il peut être sauvegardé au format CSV avec le menu Enregistrer sous en sélectionnant l'option CSV (séparateur point-virgule).
Mais, le plus souvent, on dispose d'un tableau Excel que l'on souhaite transformer en fichier CSV structuré en hypercube. Supposons, par exemple, que nous souhaitions transformer le tableau ci-dessous en fichier CSV.
L'hypercube possède trois dimensions : DA, OP, AE. On pourra générer dans le répertoire c:\User\Essais un fichier CSV nommé , structuré en hypercube, à l'aide de la macro suivante :
Dans cette macro, l'instruction
Open "" For Output As #1 ouvre dans le répertoire C:\User\Essais un fichier texte de nom . La clause Output indique que l'on va écrire dans ce fichier texte, si un fichier du même nom existait déjà il serait écrasé. La clause As #1 indique que le fichier sera repéré dans toute la macro par son numéro qui est ici 1. Nous aurions pu choisir pour numéro tout entier compris entre 1 et 511.
L'instruction Print #1, "DA;OP;AE;VAL" sert à écrire dans le fichier dont le numéro est 1, c'est-à-dire dans le fichier , le texte DA;OP;AE;VAL. Ce texte est placé dans la première ligne du fichier et il permet de déterminer le nom des champs de données. Remarquons que les noms des champs sont séparés par un point-virgule car nous travaillons ici en format européen.
On va ensuite constituer le texte qui sera envoyé dans le fichier et qui correspond à une ligne de données. Les différentes variables sont concaténées grâce à l'opérateur &. Des points-virgules correspondant aux séparateurs de données sont insérés entre les variables. On a introduit la condition If va <> 0 car il est inutile de saisir des enregistrements avec des valeurs nulles. A la fin, il est obligatoire de fermer le fichier par l'instruction Close #1 pour pouvoir l'utiliser par la suite.
Il est souvent intéressant, lorsqu'on travaille avec des données issues de plusieurs sources, de pouvoir regrouper en un seul plusieurs fichiers CSV. Cela est particulièrement facile lorsque les fichiers ont la même structure. Supposons, par exemple, que nous cherchions à regrouper le fichier avec les fichiers et présentés ci-dessous :
Le programme ci-dessous permet de créer un fichier qui regroupe les trois fichiers.
Nous avons utilisé ici deux modes d'accès aux fichiers CSV, le mode écriture pour le fichier et le mode lecture pour les fichiers et . Le mode écriture est caractérisé par output et le mode lecture par input. Il existe aussi le mode append pour ajouter des enregistrements à un fichier existant. La différence entre le mode output et le mode append est que le mode output écrase le fichier existant et que le modeappend conserve les enregistrements existants.
Remarquons, dans ce programme, comment est gérée la première ligne qui correspond aux intitulés des variables. Elle est, en effet, envoyée tout d'abord dans le fichier de sortie, puis, dans chaque fichier de lecture, la première ligne est lue par l'instruction Line input mais n'est pas écrite. Dans le cas contraire, on se retrouverait avec plusieurs lignes d'intitulés parmi les données.
Nous trouvons le fichier suivant :
Le moyen le plus simple pour lire un petit fichier CSV est de l'ouvrir avec Excel, dans ce cas il apparaîtra avec les champs placés dans des colonnes distinctes. Mais les fichiers CSV qui contiennent plus d'enregistrements que le nombre de lignes d'Excel ne peuvent être lus de cette manière, il faut donc utiliser d'autres méthodes et parmi elles l'utilisation d'un tableau croisé dynamique apparaît comme l'une des plus simples. Pour le montrer, nous allons donc lire notre fichier avec un tableau croisé dynamique.
Pour utiliser un tableau croisé dynamique avec une source de données externe, il faut disposer d'une connexion avec cette source. La première fois, il faudra la créer et, pour cela, il faut aller dans le menu Données d'Excel et sélectionner Autres sources, puis Depuis Microsoft Query. Apparaît alors le cadre suivant qui peut présenter une liste plus ou moins longue de noms.
Sélectionnons donc Nouvelle source de données et cliquons sur OK. Le cadre suivant apparaît :
Entrons le nom retenu dans la première ligne puis sélectionnons l'option MicroSoft Text Driver (*.txt,*.csv) comme suit :
Cliquons sur le bouton Connexion puis décochons Utilisation du répertoire en cours Cliquons sur le bouton Sélectionner le répertoire, nous pouvons alors choisir d'abord le lecteur puis le répertoire.
Cliquons sur OK puis à nouveau sur OK deux fois, nous voyons apparaître le cadre suivant :
Dans notre exemple le fichier est le seul disponible mais ce n'est pas nécessairement le cas et il faut alors sélectionner le fichier que nous voulons lire.
Ciquons sur Options, apparaît alors un cadre dans lequel nous cliquons sur Définir Format.
Dans la liste des fichiers, sélectionnons le fichier CSV que nous voulons utiliser, ici . Cochons la case indiquant que le nom des colonnes se trouve dans la première ligne, puis dans Format sélectionnons Personnalisé et entrons le point-virgule comme séparateur. Dans la partie droite du cadre, cliquons sur Deviner. Nous voyons alors apparaître la liste des champs du fichier . Pour chaque champ, nous pouvons définir son type et, pour les champs correspondant à du texte, sa longueur. Ensuite, il faut répondre OK à chaque cadre qui apparaît jusqu'à revenir à l'assistant Query pour choisir les colonnes. Cliquons sur la flèche pour sélectionner les champs du fichier CSV que nous voulons utiliser.
Cliquons alors sur Suivant nous voyons alors apparaître un cadre qui nous permet de filtrer les données. Si nous désirons conserver toutes les données nous cliquons sur Suivant puis à nouveau sur Suivant car trier préalablement les données n'a aucun intérêt dans un tableau croisé dynamique. On clique enfin sur Terminer puis sur Suivant. On arrive alors sur le cadre suivant :
En cliquant sur le bouton Terminer, on se retrouve dans le tableau croisé dynamique.
[ODBC]
DBQ=C:\USERS\ESSAIS
DefaultDir=C:\USERS\ESSAIS
Driver={Microsoft Text Driver (*.txt; *.csv)}
DriverId=27
FIL=text
MaxBufferSize=2048
MaxScanRows=8
PageTimeout=5
SafeTransactions=0
Threads=3
UserCommitSync=Yes
Ce fixier indique que la connexion se fait avec un fichier texte, DriverId=27 indique que le séparateur est le point-virgule, DBQ indique le nom du répertoire où se situe le fichier CSV que nous voulons lire. Il est possible de créer son propre fichier DSN avec un éditeur de texte, par exemple le bloc-notes de Windows, de l'adapter à ses besoins et de le placer là où on le souhaite.
Le fichier se trouve, et doit impérativement se trouver, dans le même répertoire que les fichiers CSV. Il se présente sous la forme suivante :
[]
ColNameHeader=True
Format=Delimited(;)
MaxScanRows=0
CharacterSet=ANSI
Col1=DA Char Width 255
Col2=OP Char Width 255
Col3=AE Char Width 255
Col4=VAL Float
[]
ColNameHeader=True
Format=Delimited(;)
MaxScanRows=0
CharacterSet=ANSI
Col1=DA Char Width 255
Col2=SI Char Width 255
Col3=PR Char Width 255
Col4=VA Float
Dans cet exemple, nous avons la description de deux fichiers CSV. Tous les fichiers que nous voulons utiliser doivent impérativement se trouver dans le fichier , les uns à la suite des autres, comme dans l'exemple. Les différents types de variables sont les suivants :
Char : caractère
Currency : monnaie
Date: date
Float : décimal double précision
Integer : entier long
LongChar : caractère long
Short : entier court
Single : décimal simple précision
Là encore, on peut créer soi-même son fichier avec un éditeur de texte et le placer dans le même répertoire que les fichiers CSV. Créer soi-même les fichiers DSN et peut être une bonne solution pour être certain de contrôler la connexion et la définition des champs des fichiers.
Cliquons sur Suivant puis sur Lire les données. Apparaît alors un cadre qui montre la liste des noms de connexions crées avec l'assistant. Si l'on a créé soit-même un fichier DSN, il faut cliquer sur le bouton Chercher et naviguer dans les répertoires pour le trouver. En cliquant sur le nom de la connexion on fait apparaître le cadre de création d'un tableau croisé dynamique. En cliquant sur le nom du fichier DSN on voit apparaître la liste des fichiers contenus dans le répertoire où se trouvent les fichiers CSV. En cliquant sur l'un d'eux, on se retrouve dans le cadre de création d'un tableau croisé dynamique.
Quand on travaille avec de gros fichiers CSV il est intéressant, dans le tableau croisé dynamique, de décocher l'option Enregistrer les données et la mise en forme. En effet, lorsque cette option est sélectionnée les données sont enregistrées avec le classeur Excel, ce qui peut donner un classeur occupant une mémoire importante. Décocher cette option permet de rendre le classeur Excel indépendant des données du fichier CSV.
L'un des grands intérêts de l'utilisation des fichiers CSV avec les tableaux croisés dynamiques est d'ouvrir l'accès aux requêtes SQL et donc au monde des bases de données relationnelles. Supposons, par exemple, que nous cherchions à regrouper les activités du fichier en utilisant la table de passage ci-dessous qui montre comment passer du niveau G de la nomenclature au niveau F :
Enregistrons cette table au format CSV dans le répertoire Essais sous le nom puis fermons le classeur Excel. Ouvrons le fichier avec un éditeur de texte et ajoutons la définition du nouveau fichier :
[]
ColNameHeader=True
Format=Delimited(;)
MaxScanRows=0
CharacterSet=ANSI
Col1=AEG Char Width 20
Col2=AEF Char Width 20
La première manière consiste à modifier la requête SQL se trouvant dans le cadre Commande. On pourra ainsi écrire la requête SQL suivante :
SELECT f.DA, f.OP, f.AE, t.AEF, f.VAL
FROM f, t
WHERE
Après avoir cliqué sur OK, nous pouvons modifier le tableau croisé dynamique en y intégrant la dimension AEF.
La seconde méthode consiste à cliquer sur le bouton QUERY puis sur OK. Nous parvenons alors dans Microsoft Query. Dans le menu, cliquons sur table pour pouvoir ajouter le fichier :
Nous allons établir un lien entre le champ AE du fichier Fichier et le champ AEG du fichier TablePas car ces deux champs se correspondent. Pour cela, nous sélectionnons le champ AEG et nous le faisons glisser sur AE de manière à faire apparaître un lien entre les deux. Si nous cliquons sur l'icône SQL, nous accédons à la requête SQL que nous sommes en train de créer et que nous pouvons éventuellement modifier.
En cliquant sur OK puis, dans le menu Fichier en sélectionnant Renvoyer les données vers Microsoft Excel puis Suivant nous retombons sur les menus des tableaux croisés dynamiques. Nous pouvons, par exemple, retenir la disposition suivante :
Nous obtenons le tableau ci-dessous qui nous donne une agrégation au niveau F de la nomenclature.
Nous pouvons maintenant travailler avec ce tableau dynamique en sélectionnant, par exemple, une année.
Il est possible de travailler sur des fichiers CSV sans passer par les tableaux croisés dynamiques. Pour cela, on peut utiliser les possibilités d'interrogation des bases de données que donne Visual Basic. Avant toute chose il convient de paramétrer Visual Basic. Si le groupe Développeur n'est pas disponible au menu, il faut aller dans Fichiers, puis dans Options et Personnaliser. Dans la partie droite du cadre, il faut alors cocher Développeur puis cliquer sur OK.
Allons dans le menu Outils et choisissons l'option Références, le cadre ci-dessous s'ouvre alors :
Nous devons sélectionner dans la liste les éléments suivants :
• Microsoft ActiveX Data Objects 6.1 Library
• Microsoft ActiveX Data Objects Recordsets 6.0 Library
• Microsoft ADO Ext. for DDL and Security
Dans notre macro, nous devons définir la connexion à notre source de données et un objet Recordset, objet qui est destiné à recevoir les enregistrements générés par notre requête SQL. Nous allons donc définir deux variables, l'une destinée à définir la connexion et que nous appellerons, par exemple, Connex, et l'autre pour définir le recordset et que nous appellerons Record. Pour cela nous utiliserons les instructions suivantes :
Dim Connex As ADODB.Connection
Dim Record As ADODB.Recordset
Set Connex = New ADODB.Connection
Set Record = New ADODB.Recordset
Puisqu'une connexion se définit par le nom du répertoire où se trouvent les données, il est pratique de placer le nom de ce répertoire dans une variable que nous appellerons RepertNom. La connexion sera définie de la manière suivante :
Repertnom = "C:\User\Essais\"
Connex.ConnectionString = _
"ODBC;DBQ=" & Repertnom & ";DefaultDir=C:\; " & _
"Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _
"DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;MaxBufferS"
sel = " SELECT f.DA,f.AE,f.OP,f.VAL "
fro = " FROM f " sel & fro, Connex
L'instruction ouvre le recordset Record et exécute la requête placée dans la chaîne de caractères définie par la concaténation des variables sel et fro, la base de données utilisée étant celle définie par la connexion Connex. Remarquons que nous avons laissé des espaces à la fin des variables sel et fro afin que la concaténation n'agrège pas des instructions. Le résultat de la requête, c'est-à-dire les enregistrements recherchés, a été placé dans l'objet recordset Record que nous devons lire. Supposons que nous cherchions à afficher le résultat dans la feuille Données, nous lirons le recordset de la manière suivante :
Set f = Sheets("Données") Record.MoveFirst
i = 1
Do While Not
f.Cells(i, 1) = Record("DA")
f.Cells(i, 2) = Record("AE")
f.Cells(i, 3) = Record("OP")
f.Cells(i, 4) = Record("VAL")
i = i + 1
Record.MoveNext
Loop
Record.Close
Connex.Close
Pour lire le recorset on se place d'abord sur le premier enregistrement en utilisant l'instruction MoveFirst puis on fait une boucle qui va lire les enregistrements suivants jusqu'à la fin qui est signalée par (EOF voulant dire End of file). Record("DA") renvoie la valeur du champ DA, Record.MoveNext permet de passer à l'enregistrement suivant, Loop marque la fin de la boucle, Record.Close ferme le recordset et Connex.Close ferme la connexion. Si on lance ce programme on obtient sur la feuille Données les enregistrements de . Notons que les intitulés des champs n'apparaissent pas car ils ne font pas partie des enregistrements.
Le programme complet est le suivant :
Sub Lire() Dim Connex As ADODB.Connection Dim Record As ADODB.Recordset Set Connex = New ADODB.Connection Set Record = New ADODB.Recordset Repertnom = "C:\User\Essais\" Connex.ConnectionString = _ "ODBC;DBQ=" & Repertnom & ";DefaultDir=C:\; " & _ "DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;MaxBufferS" sel = " SELECT f.DA,f.AE,f.OP,f.VAL " fro = " FROM f " sel & fro, Connex Set f = Sheets("Données") Record.MoveFirst i = 1 Do While Not f.Cells(i, 1) = Record("DA") f.Cells(i, 2) = Record("AE") |
f.Cells(i, 3) = Record("OP")
f.Cells(i, 4) = Record("VAL")
i = i + 1
Record.MoveNext
Loop
Record.Close
Connex.Close
End Sub
On peut également faire une présentation plus sophistiquée. Par exemple, supposons que nous voulions remplir le tableau suivant avec les résultats de la requête :
Nous pouvons commencer par nommer les cellules correspondant aux titres en lignes et en colonnes avec les noms des champs correspondants :
Pour cela, après avoir sélectionné les bonnes références dans le menu Outils de Visual Basic, on peut écrire le programme suivant :
Sub Lire()
'Nécessite d'avoir sélectionné dans Tools References les options suivantes :
'Microsoft ActiveX DataObjects 6.1 Library
'Microsoft ActiveX DataObjects Recordset 6.0 Library
'Microsoft ADO Ext. 6.0 for DDL and Security
Dim Connex As ADODB.Connection
Dim Record As ADODB.Recordset
Dim cmdCommand As ADODB.Command
Rep = "C:\User\Essais\" ' Nom du répertoire où se trouve la base de données
Set f = Workbooks("Pré").Sheets("Présentation")
Application.ScreenUpdating = False
f.Range("Résultats").ClearContents ' Ouvre la connexion Set Connex = New ADODB.Connection Set Record = New ADODB.Recordset Connex.ConnectionString = _ "ODBC;DBQ=" & Rep & ";DefaultDir=C:\; " & _ "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _ "DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;MaxBufferS" sel = " SELECT f.DA,f.AE,f.OP,f.VAL " fro = " FROM f " sel & fro, Connex Record.MoveFirst c = Range(da).Column f.Cells(l, c) = va Record.MoveNext Loop Record.Close Connex.Close Set cmdCommand = Nothing Application.ScreenUpdating = True End Sub |
Nous obtenons :
Dans le programme, la boucle permet de lire les données du fichier et de les placer dans le tableau de présentation. La variable da reprend le contenu du champ DA et ajoute "_" parce que le nom "DA2000" n'est pas un nom acceptable dans Excel car il peut être confondu avec la référence d'une cellule, il a été remplacé par "DA2000_".
La variable l reprend le numéro de ligne de la plage dont le nom est contenu dans la variable ae, la variable c reprend le numéro de colonne de la plage dont le nom est contenu dans la variable da, la valeur est placée dans la cellule définie par la ligne l et la colonne c.
Notons dans ce programme que la plage contenant les résultats a été effacée au préalable par l'instruction ClearContents. Notons également que l'instruction Application.ScreenUpdating a été utilisée pour bloquer l'affichage pendant l'exécution du programme afin de ne pas la ralentir par des mises à jour d'écran répétées.
Il est possible avec Visual Basic de générer un fichier CSV à partir d'une requête SQL. Il suffit pour cela de décrire au préalable dans tous les fichiers utilisés.
Supposons que nous cherchions à créer à partir du fichier un fichier CSV qui ne contienne que les valeurs agrégées au niveau F. Le programme se présentera alors de la manière suivante :
Sub Agreger() 'Nécessite d'avoir sélectionné dans Tools References les options suivantes : 'Microsoft ActiveX DataObjects 6.1 Library 'Microsoft ActiveX DataObjects Recordset 6.0 Library 'Microsoft ADO Ext. 6.0 for DDL and Security Dim Connex As ADODB.Connection Dim cmdCommand As ADODB.Command Dim Ctexte As String * 990 Set Connex = New ADODB.Connection With Connex .ConnectionString = _ "ODBC;DBQ=" & Rep & ";DefaultDir=C:\; " & _ "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _ "DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;MaxBufferS" End With Open Rep & "\" For Output As #1 Print #1, "DA;AEF;OP;VAL" Close #1 sel = " SELECT f.DA,t.AEF,f.OP,sum(f.VAL) as VAL " fro = " FROM f, t " whe = " WHERE " gro = " GROUP BY f.DA,t.AEF,f.OP " Ctexte = " INSERT INTO " & sel & fro & whe & gro Set cmdCommand = New ADODB.Command Set cmdCommand.ActiveConnection = Connex |
With cmdCommand
.CommandText = Ctexte
.CommandType = adCmdText
.Execute
End With
Connex.Close
Set cmdCommand = Nothing
End Sub
Une requête SQL ne peut générer un fichier CSV que dans le répertoire défini par la connexion. Pour générer un fichier CSV en dehors de ce répertoire, on peut combiner deux techniques, la première consiste à placer le résultat de la requête dans un recordset, la seconde consiste à créer le fichier CSV en lisant le recorset.
Supposons, comme précédemment, que nous cherchions à créer à partir du fichier un fichier CSV qui ne contienne que les valeurs agrégées au niveau F. Le programme se présentera alors de la manière suivante :
Sub Lire() Dim Connex As ADODB.Connection Dim Record As ADODB.Recordset Set Connex = New ADODB.Connection Set Record = New ADODB.Recordset Repertnom = "C:\User\Essais\" Connex.ConnectionString = _ "ODBC;DBQ=" & Repertnom & ";DefaultDir=C:\; " & _ "Driver={Microsoft Text Driver (*.txt; *.csv)}; " & _ "DriverId=27;Extensions=txt,csv,tab,asc;FIL=text;MaxBufferS" sel = " SELECT f.DA,t.AEF,f.OP,sum(f.VAL) as VAL " fro = " FROM f, t " whe = " WHERE " gro = " GROUP BY f.DA,t.AEF,f.OP " sel & fro & whe & gro, Connex Open "C:\User\Essais1\" For Output As #1 Print #1, "DA;AE;OP;VAL" Set f = Sheets("Données") Record.MoveFirst enr = da & ";" & aef & ";" & op & ";" & va If va <> 0 Then Print #1, enr Record.MoveNext |
Loop
Record.Close
Connex.Close
Close #1
End Sub
Nous obtenons alors le fichier suivant :
Il est également possible de travailler avec de véritables bases de données, par exemple de type Access. Pour cela, le mieux est certainement de créer la base de données et ses tables en utilisant le logiciel Access puis de travailler avec elles à partir d'Excel. La manière de travailler sera, toutefois, légèrement différente de celle que nous avons présentée pour les fichiers CSV. L'exemple ci-dessous correspond au chargement d'une table Access structurée en hypercube à partir d'un tableau Excel.
Sub SaisieQuest()
'Suppose avoir sélectionné dans Tools/References :
'Microsoft ActiveX Data Objects 2.8 Library
'Microsoft ActiveX Data Object Recordsets 2.8 Library
'Microsoft Ado Ext for DDL and Security
Dim Ctexte As String * 300
Dim cnnConn As ADODB.Connection
Dim rstRecordset As ADODB.Recordset
Dim cmdCommand As ADODB.Command
Rep = "H:\MyDocuments\QuestGNI\" ' Nom du répertoire où se trouve la base de données NomBase = "" ' Nom de la base de données
' Ouvre la connexion.
Set cnnConn = New ADODB.Connection
With cnnConn
.ConnectionString = _
".OLEDB.4.0"
.Open Rep & NomBase
End With
Set cmdCommand = New ADODB.Command
Set cmdCommand.ActiveConnection = cnnConn
Set rstRecordset = New ADODB.Recordset
'----------------------------------------------------------------------------------- anq = Sheets("Saisie").Cells(3, 2) ' Année du questionnaire RepD = "O:\CN\GNP-GNI questionnaire " & anq & "\received\" ' Nom du répertoire de données For Each pays In Array("Pays1", "Pays2", "Pays3") ' Liste des pays For k = 8 To 38 '------------------------------------------------------------------------------------- ' Commence par vider la table QDATA avant d'ajouter les nouveaux enregistrements ' La table est vidée pour le pays et l'année saisies With cmdCommand .CommandText = "delete from QDATA where PAYS='" & pays & "' and ANQ='" & anq & "'" .CommandType = adCmdText .Execute End With Set f = Sheets("Quest" & anq & " (" & pays & ")") ' Feuille des données de l'année du questionnaire For i = 7 To 44 coli = f.Cells(i, 1) If coli <> 0 Then coesa = f.Cells(i, 3) For j = 4 To 9 anda = Mid(f.Cells(4, j), 1, 4) 'Saisie des années de la série avec limitation de l'année à 4 caractères va = Val(" " & f.Cells(i, j)) 'Saisie des valeurs avec élimination des espaces entrés comme des 0 Ctexte = "insert into QDATA values('" & pays & "','" & anq & "','" & "','" & anda & "','" & coli & "','" & coesa & "'," & va & ")" If va <> 0 Then With cmdCommand .CommandText = Ctexte .CommandType = adCmdText .Execute End With End If Next j End If Next i ActiveWindow.Close ' Ferme le questionnaire 'Next pays ' Ferme la connexion et vide les variables cnnConn.Close Set cmdCommand = Nothing Set rstRecordset = Nothing Set cnnConn = Nothing End Sub |