Visual Basic
Visual Basic
VBA
CHAPITRE 1 : PRESENTATION DE L’INTERFACE VBA ..................................... 4
1. Introduction ................................................................................................................................................... 4
1. Introduction
Je vais commencer par donner un descriptif assez schématique des différentes fenêtres et
propriétés utiles pour une bonne appréhension de l’outil VBA dans son ensemble. Ce
descriptif n’est évidemment pas exhaustif et je laisse le soin à chacun de découvrir par lui-
même cet environnement.
Affiche la définition
Cette fenêtre nous renseigne sur le types de variables qui sont renvoyés par les propriétés et
méthodes et surtout sur son appartenance à une classe car comme nous le verrons tous les
objets Excel sont contenus dans une collection qui elle-même est une sous partie d’un autre
objet jusqu’à l’application entière Excel (principe des vases communicants)
Cette fenêtre est utile pour vérifier la syntaxe d’une variable string par exemple en cas
d’erreur, car dans certains cas la variable string peut être une combinaison de variable et de
déclaration fixe qui doivent répondre à un protocole bien défini (par exemple c’est le cas
d’une requête dynamique dans une base Access)
Pour accéder à cette information il faut faire précéder la déclaration de cette variable d’un
point d’interrogation. De plus si l’on souhaite établir des traces d’une variable MaVariable
à travers tout le code pour s’assurer du bon déroulement, il suffit de placer dans notre code
la syntaxe suivante debug.print MaVariable.
Permet d’introduire des modules, des modules de classe et des Userforms dans vote projet
(un simple clic droit dans la fenêtre d’explorateur de projet fait très bien l’affaire)
Les autres sous menus ne sont que des redondances de ce qui précède.
5.1 Références
Ce sous menu présente toutes les références associées a votre projet, par exemple si vous
avez besoin d’utiliser des connexions à une table Access il vous faudra cocher « Microsoft
ADO Ext 2.8 for DLL and Library » afin de pouvoir utiliser l’aide express et les outils
relatifs au base Access. Il est important de noter que s’il manque une référence à votre
projet le débogueur vous présentera une fausse erreur d’interprétation sur n’importe quelle
partie du code (non compréhension de la variable de type string par exemple). Dans ce cas
il faut juste aller dans les références et rajouter celle manquante.
5.2 Options
Permet de définir des choix pour le paramétrage de quelques fenêtres, Mode ancrage des
fenêtres de code ou autres, utilisation de l’info express, info bulle automatique, etc…
Il peut être judicieux de cocher dans l’onglet éditeur la case « Déclaration des variables
obligatoires » mais on peut aussi rajouter en tout début de code l’expression Option
explicit qui aura les mêmes conséquences
1 - L’objet Application
Le principal problème de VBA et sa rapidité mais il existe quelques propriétés et méthodes
qui permettent d’améliorer cet inconvénient.
ScreenUpdating=false
Pour des raisons essentiellement de rapidité il peut être intéressant de figer l’écran
lorsqu’on est amené à sélectionner plusieurs feuilles dans un même classeur cela permet
d’éviter les scintillements dus aux changements de feuilles de calcul.
DisplayAlerts = false
Cette propriété permet de supprimer les messages d’alertes d’Excel tel que ceux renvoyés
par Excel lors de la suppression d’une feuille par exemple (fenêtre de validation des
actions).
Ce qui faut immédiatement retenir c’est que généralement les noms qui se termine par un
« s » signifie que cet objet représente la collection d’objet et non pas l’objet lui-même.
Workbooks représente donc la collection des classeurs ouverts. L’ordre des classeurs dans
la collection est l’ordre d’ouverture des classeurs. Il ne faut pas confondre l’appel
2. 1 Les méthodes
Add
Permet d’ajouter un nouveau classeur à la collection. Le classeur crée devient le classeur
actif. On accède aux membres de la collection par un indice workbooks(index) ou le nom
workbooks(« Nom du classeur »)
Close
Si on ne spécifie pas un classeur alors tous les classeurs composant cette collection seront
fermés.
Open
Ouvre un classeur Excel
Workbook.open(FileNAme,UpdateLink,readonly,Format,Password,WriteResPassword,Ign
oreReadOnlyrecommended, Origin, Delimiter,Editable, Notify, Converter, AddtoMRU)
Seul Filename est obligatoire.
OpenText
Permet d’ouvrir un fichier text
Names
C’est une collection de name c’est-à-dire que cette collection contient toutes les cellules
typées contenues dans le classeur actif. Pour accéder aux noms de l’objet name, on déclare
une variable MaVariable de type name et on écrit MaVariable.name.
FullName
Permet d’afficher ou de connaître le chemin du classeur actif
La collection Sheets est une collection regroupant tous les onglets d’un classeur quelque
soit son type : feuille de calcul (objet worksheet), feuille graphique (objet Chart), etc….
C’est à travers cette collection que l’on pourra ajouter, supprimer, comptabiliser, déplacer,
cacher, activer des feuilles de tout genre.
Move(Before, After)
Déplace la feuille en question (à noter que l’expression correcte est : Sheets(index ou
NomDeSheet).Move Before:=Sheets(position voulue)
Visble=xlsheethidden
Masque la sheet dans l’objet workbook mais l’utilisateur peut encore la voir dans
Format\Feuille\Afficher\ alors que la formule suivante
Visble=xlsheetveryhidden
Masque la sheet pour l’utilisateur, elle n’est visible que par le code on peut la faire
réapparaître par Visble=xlsheetvisible
4 Les Cellules
Row, Column
Renvoie le numéro de ligne ou de colonne de la cellule
End(xlDown, xlUp).row
Indique par exemple la dernière (resp la première) ligne de la cellule non vide en dessous
(au-dessus) de la cellule sélectionnée.
End(xlToRight,xlToLeft).column
Indique la dernière colonne non vide à droite (resp à gauche) de la cellule sélectionnée.
Le typage des cellules est très utilisé lui aussi car il permet de situer l’objet uniquement
avec le nom associé à la cellule. Vous devez sélectionner une cellule puis dans la Zone
« Zone nom » donner un nom à votre cellule.
Ensuite pour accéder à cette cellule vous devez utiliser soit Range(« NomDeCellule »)
Ou [NomDeCellule]
CurrentRegion
Indique la zone non disjointe autour d’une range de référence (ici Macell)
Très utile si vous voulez travailler dans une zone définie ou pour délimiter une zone de
travail
Address
Renvoie l’adresse de l’objet sélectionné. Ceci simplifie parfois beaucoup les choses et
permet de situer entièrement l’objet avec une seule variable.
Offset (Ligne,Colonne)
On se décale de Ligne et colonne par rapport à la range de référence.
AutoFit
Ajuste la largeur de colonne et la hauteur en fonction du contenu. Si l’on veut
redimensionner la feuille entière il suffit d’écrire Cells.Columns.Autofit.
Pour affecter une expression qui ne résulte pas d’une fonction ou d’une propriété à une
variable de type string il faut la placer entre guillemets (chaîne de caractère constante)
MaVariable = « Faculté, Paris XIII »
Sinon on peut directement l’affecter à celle-ci (propriété name d’une feuille ou d’un
classeur)
MaVariable = Activeworkbook.name
Il est possible de mixer les expressions et les variables dans une même expression de type
string avec l’opérateur de concaténation « & » de la façon suivante :
MaVariable = « Ce Classeur est enregistré sous : « & Activeworkbook.path
On peut aussi utiliser l’opérateur « + » mais je le déconseille.
Ces variables sont dites de longueur variable et peuvent être constituées d’environ deux
milliards de caractères, dans un souci d’économie de mémoire et donc de performance il est
possible de limiter le nombre de caractères (de 1 à 65 400 exactement) par la syntaxe :
Din Mavariable as string * longueur avec longueur = nombre de caractères voulus
Si Mavariable reçoit une chaîne de caractère supérieur à longueur, les éléments à partir de
longueur +1 ne seront pas pris en compte, celle-ci sera rognée. Si Mavariable reçoit une
chaîne de caractère inférieur à longueur alors VBA comblera la chaîne de caractères avec
des espaces vides.
Trim(MaVariable)
Supprime les espaces vides de MaVariable très utile si MaVariable est insérée à l’intérieur
d’un Select Case.
Ucase(MaVariable)
Met Mavariable en majuscule, cela permet de se délester du problème de la casse rentré par
l’utilisateur.
Len(Mavariable)
Permet de connaître la longueur d’une chaîne de caractères, cette fonction retourne une
valeur numérique de type Long.
Instr(Début,String1,String2,TypeComparaison)
Permet de savoir si string2 est compris dans string1 en commençant par le debut ième
caractère, cette fonction retourne une variable de type Long.(= 0 signifie que String2
n’appartient pas à String1
Au même titre que les variables de type string vous pouvez affecter à une variable de type
numérique des résultats de fonctions ou de propriété ainsi que des formules.
VB intègre de nombreuses fonctions permettant de manipuler des valeurs numériques, en
voici quelques unes :
Abs(nombre) :
Renvoie la valeur absolue d’un nombre
Int(nombre) :
Renvoie la partie entière d’un nombre
RoundUp(nombre,précision)
Arrondie le nombre au nombre supérieur à précision chiffre après la virgule
Si nombre = 12.137, RoundUp(12.137,2)=12.14. Il existe la même fonction avec
RoundDown.
Syntaxe
Dim MyDate as date
Ce type de variable peut recevoir des dates comprises entre le 1er janvier 100 et le 31
décembre 99999 Elles sont stockées sous 8 octets.
La aussi il existe de nombreuses fonctions permettant de manipuler des dates.
Now() ou today()
Retourne la date d’aujourd’hui.
Weekday(MyDate)
Renvoie un variant qui correspond au jour de la semaine
Weekday(MyDate)=1 , signifie que Mydate est un dimanche et ainsi de suite jusqu’au
samedi. On peut se servir de cette fonction pour éviter de comptabiliser les weekends
Mydate = if(weekday(today()-1=1 ; today()-3 ;today()-1) on exclut de mydate les samedi et
dimanche.
Ce type de variables est utilisé pour stocker le résultat d’expression logique. Elle renvoie
donc les valeur « true » ou « false »
Dim Mavariable as boolean
Elle peut être aussi le résultat d’une fonction qui renvoie une variable de type integer dans
ce cas 0 sera la valeur false et 1 la valeur true. Généralement ces variables sont utilisées
dans les boucles de répétition while
La syntaxe pour les déclarations de constantes est un peu différente, il faut noter que par
exemple les tableaux n’acceptent pas d’autres types pour la définition de la dimension.
Const Mavariable as Integer = 5
Une fois qu’une valeur a été définie à une constante celle-ci ne peut-être modifiée
Elles font référence à un objet que vous pouvez spécifier et occupent 4 octets en mémoire.
La syntaxe est un peu différente car en plus de la déclaration de type il faut lui affecter un
objet précis par l’usage du mot clé Set
Dim MaVariable as object
Set MaVariable = Expression
Où expression est une expression renvoyant un objet de l’application.
Pour annuler l’affectation à un objet et libérer la mémoire allouée à cet objet, il faut affecter
à cette variable objet la valeur nothing avec l’instruction suivante :
Les tableaux ne sont que des vecteurs de données. On peut donc vectoriser toutes variables
y compris des tableaux.
A noter que l’on ne peut pas définir les variables tableaux dans les modules de classe en
propriété public, il faut dans ce cas définir des objets de type Collection. Il existe une
contrainte dans l’utilisation de tableaux, c’est que la dimension des tableaux doit être
exprimée par une constante, ce qui en cas de non connaissance au préalable du nombre
d’objets peut-être préjudiciable. Normalement la dimension des tableaux est initialisée à
zéro mais l’on peut modifier cette règle en plaçant en dehors de toute procédures
l’expression
Option base 1
La syntaxe est la suivante
Si l’on ne connaît pas le nombre d’éléments, la première solution est dans un premier temps
de comptabiliser et stocker cette information dans une variable et de redimensionner le
tableau avec l’instruction :
Ces variables sont intéressantes car elles permettent de regrouper différents types de
données sous un même objet. Ces variables s’adaptent bien dans le cas ou l’on souhaite
définir un objet dont les composantes peuvent avoir plusieurs formes. L’exemple
généralement utilisé est celui relatif à une personne. A travers l’objet Personne de type
Type. On peut définir son adresse (string), son âge (integer), sa couleur de cheveux, etc…
Attention : On ne peut pas définir ce type de variable dans un module de classe ou dans
une procédure, on doit le déclarer dans la section des déclarations d'un module. Tout code
situé en dehors d'une procédure est dit « de niveau module ». Les déclarations doivent
apparaître avant les procédures.
Fonctions Définition
CByte(mavar) Convertit mavar en une variable de type Byte
CDate(mavar) La variable mavar sera de type Date
CDbl(mavar) Convertit mavar en une variable de type Double
CStr(mavar) Convertit mavar en une variable de type String
Les variables sont caractérisées par leur accessibilité dans le programme ce que l’on appelle
leur portée et leur durée de vie. En effet une variable peut conserver sa valeur tant qu’une
procédure s’exécute et être réinitialisée lorsque la procédure est terminée ou conserver sa
valeur entre les différents appels de procédures.
Elles doivent être déclarées à l’extérieur de toutes fonctions ou procédures, dans la section
déclaration d’un module. Elles peuvent être privées ou publiques. Si on les déclare de
niveau module avec le mot clé Private elles ne seront lisibles que par les procédures du
module, si on les déclare par le mot clé Public cela signifie qu'elles seront disponibles pour
toutes les procédures de tous les modules de toutes les applications.
Il faut savoir que ce n’est pas absolument nécessaire de connaître la syntaxe d’un appel de
fonction car il y a toujours l’aide en ligne et l’enregistreur de macro (Outil/Macro/Nouvelle
Macro) pour nous tirer d’un mauvais pas mais le code issu d’un enregistrement n’est jamais
très efficient il faut l’adapter à la situation.
Dans un premier temps nous allons voir l’utilisation du code dans un module
Les procédures Sub sont une série d’instructions entourées des mots clés
Sub NomDeMaProcedure([ByVal] | [ByRef] arg1 as type, [ByVal] | [ByRef] |
[Optional]arg2 as type)
Instructions
End sub
Si vous exécutez l’exemple ci-dessus, la valeur retournée par msgbox sera 2, alors que si
vous omettez l’instruction ByVal elle sera de 5.
Le mode Optional signifie que cette valeur lors de l’appel de la procédure peut-être omis,
mais il doit être situé en dernière position dans la liste des arguments. Cela permet de
surcharger une procédure. L’appel de cette procédure se fait grâce à l’emploi du mot clé
Call et la liste des arguments doit être mis en parenthèse OU Call peut être omis mais dans
ce cas les arguments ne doivent pas être mis entre parenthèses
Les fonctions Sub ne retournent pas de valeur, ni d’objet elles sont faites pour
exécuter une tâche.
Ces procédures sont une série d’instructions exécutant une tâche déterminée au sein du
projet et renvoyant une valeur ou un objet qui sera ensuite exploité au sein du programme.
Elle est structurée de la façon suivante
Dans le cas de passage d’objet par une fonction il faut précéder celle-ci du mot clé SET.
Function() as type permet de spécifier le type de la valeur retournée par la fonction, même
remarque que précédemment pour la liste d’arguments et donc même conséquences. On
pourra aussi l’utiliser comme n’importe quel fonction Excel en faisant
Insertion/functions/Liste personalisée
Les boucles d’instructions servent à améliorer la lisibilité de votre code et à répéter une
série d’instruction. Il en existe plusieurs
La variable i (appelée variable d’incrément) est à chaque passage dans la boucle augmentée
de Pas. Si l’argument Step Pas est omis la variable est incrémentée de 1 par défaut.
La boucle Do..Loop
Même chose que pour l’instruction While mais dans ce cas il existe une instruction qui
permet de sortir de cette Loop, il s’agit de Exit Do
Exemple
Dim MyRange as range
[celluleType].CurrentRegion.Select
For each MyRange in Selection
MyRange.Font.ColorIndex=3
Next
Exemple
If Condition Then
Série d’instructions1
Else
Série d’instructions2
End if
If ….Then….elseif then….end if
Exemple
If Condition1 then
Instruction1
Elseif condition2 then
Instruction2
Else
Instruction3
End if
Select Case
Cette structure permet d’envisager différentes valeurs pour une même expression et de
spécifier les instructions selon chaque cas envisagé.
1. Première approche
Si vous essayez de passer par l’activateur de macro automatique, voici ce que donnera le
code généré par Excel, ce code n’est pas très efficient mais il permet au moins de visualiser
les objets utiles pour l’utilisation d’une pivot table (PivotFields, AddDataFields,
CurrentPage,etc…). L’ennui c’est que l’on ne peut pas créer ce tableau croisé dynamique
facilement en tant qu’objet lui-même et il n’y a pas de variables déclarées.
Range("A1").Select
ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _
"Datas!R1C1:R1408C20").CreatePivotTable TableDestination:="", TableName:= _
"Tableau croisé dynamique1", DefaultVersion:=xlPivotTableVersion10
ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1)
ActiveSheet.Cells(3, 1).Select
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Portfolios")
.Orientation = xlRowField
.position = 1
End With
ActiveWindow.SmallScroll Down:=-27
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields( _
"Nominal Activity")
.Orientation = xlPageField
.position = 1
End With
With ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Center")
.Orientation = xlPageField
.position = 1
End With
ActiveSheet.PivotTables("Tableau croisé dynamique1").AddDataField ActiveSheet. _
PivotTables("Tableau croisé dynamique1").PivotFields("Delta"), "Somme de Delta" _
, xlSum
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Center"). _
CurrentPage = "KM"
End Sub
SourceData : argument de type variant facultatif Il peut s'agir d'un objet Range, d'un
tableau de plages ou d'une constante de texte représentant le nom d'un autre rapport. Pour
une base de données externe, SourceData est un tableau de chaînes contenant la chaîne de
requête SQL.
TableDestination : objet de type variant facultatif, s’il n’est pas spécifié celui-ci sera la
cellule active.
Dans l’exemple ci-dessous, DataSheet est une worksheet, ZoneTable est un objet Range
(ensemble de cellules spécifiées) et Mytable sera le nom de mon tableau
Pour associer le nom choisi Mytable à une pivot table on doit définir la syntaxe ci-dessous :
Pour construire une pivot Table, il faut bien sûr que la zone qui a servi de point de départ
possède des noms d’en-tête de colonne. Une fois la pivotTable définie il faut bien sûr lui
donner des attributs avec l’aide de quelques propriétés et méthodes.
PivotFields(nameChamp)
Cette méthode renvoie un objet qui représente soit un seul champ de tableau croisé
dynamique, soit une collection de champ visibles et masqués. Cela permet en quelque sorte
de spécifier au préalable le champ sur lequel nous allons travailler.
.Orientation=xlPivotFieldOrientation
Cela rajoute le champ NameChamp à la pivotTable à l’endroit spécifié, il en existe
quatre types principaux.
xlPageField : rajout en en-tête de Pivot
xlRowField : rajout en ligne
xlColonneField : rajout en colonne
xlDataField : rajout dans le zone Data
xlDifferenceFrom
xlIndex
xlNoAdditionalCalculation
xlPercentDifferenceFrom
xlPercentOf
xlPercentOfColumn
xlPercentOfRow
xlPercentOfTotal
xlRunningTotal
Il est important de noter que ces propriétés ne sont valides que pour des champs de
données (Zone Data)
Pour naviguer dans ces champs, il faut définir maintenant des objets PivotItem avec la
syntaxe suivante :
Dim MyPvtItem as PivotItem
Si l’on veut naviguer par exemple dans le champ ChampName il faut utiliser :
Syntaxe utilisée
For each MyPvtItem in .PivotFields(ChampName).PivotItems
Instructions
Next MyPvtItem
Nous pouvons aussi utiliser une autre méthode qui consiste à se servir des propriétés
RowRange, ColumnRange, PageRange
Ces propriétés permettent de naviguer respectivement dans les lignes, les colonnes et les
en-têtes de page du tableau croisé dynamique. Elles possèdent toutes des propriétés propres
comme la fonction Count qui donne le nombre de ligne, de colonne et d’en-tête.
ColumnGrand
Cette propriété a la valeur True si le rapport de tableau croisé dynamique affiche des totaux
généraux de colonnes, le type de donnée est un boolean (true, false)
RowGrand
Cette propriété a la valeur True si le rapport de tableau croisé dynamique affiche des totaux
généraux de lignes, le type de donnée est un boolean (true, false)
GetData Et GetPivotData
Ces deux méthodes permettent de rapatrier des données dans la pivot Table par rapport à
des critères de sélections choisis. La syntaxe est la suivante :
GetPivotData(Caption,, « champ1 », donnée1, « champ2 »,donnée2)
ASTUCE
Si vous ne voulez pas avoir des sous totaux de ligne dans votre tableau croisé dynamique, il
faut pour chaque Champ mettre dans la propriété SubTotals 12 fois false . Le code pourrait
être le suivant :
Astuce
With MyTable
.PivotFields("Champ1").Subtotals = Array(False, False, False, False, False, False,
False, False, False, False, False, False)
End With
Les objets Charts sont des feuilles graphiques (alors que les WorkSheets sont des feuilles
de calculs Excel). Pour ajouter une feuille graphique à votre classeur actif, il suffit comme
pour le cas des feuilles de calcul de se servir de la méthode Add sur l’objet Workbook.
Alors qu’un objet ChartObjects est aussi un graphique mais il est incorporé dans une
feuille de calcul (il appartient donc à l’objet Worksheet). Nous allons voir que nous
pouvons passer de l’un à l’autre par l’usage d’une méthode. Les objets Charts sont définis
principalement par l’objet SériesCollection qui contient toutes les Séries du graphique et les
Séries sont elles-mêmes définies par la collection Points .
La méthode ci-dessous permet de fabriquer de toute pièce un graphique, elle est issue d’un
objet Chart. Par cette méthode on ne maîtrise pas les SériesCollection.
SetSourceData(Source, PlotBy)
Voir la définition précédente.
Location(Where, Name)
Permet de passer d’un objet ChartsObject à un objet Charts et vice-versa.
Série et SériesCollection
C’est l’objet principal des graphes. La collection SeriesCollection représente toutes les
séries du graphique. On peut donc ajouter une série à l’aide de la méthode Add.
NewSeries
Cette méthode permet de rajouter une série à la Collection SériesCollection. A mon sens
cette méthode est à privilégier par rapport aux autres.
Les feuilles VBA sont un point de programmation à na pas négliger car elles donnent une
allure plus professionnelle à vos développements et permettent une interaction entre
l’utilisateur final et le code. En effet les feuilles sont des zones dans lequel vous pouvez
mettre des activeX tels que des cases à cocher, des zones de texte ou des boutons de
commande. L’utilisation des feuilles VBA s’avère utile dans le cas où l’on souhaite passer
des informations avec un certain formalisme à notre code, par exemple à l’aide d’une
Listbox nous pouvons délimiter le choix des utilisateurs ou par l’intermédiaire de cases à
cocher dont nous maîtrisons les effets.
Je ne vais pas énumérer tous les types ci-dessus, seulement les plus usuels
Case à cocher
Contrôle Frame
Contrôle Label
Option button
Contrôle Commande
Bouton
Je ne vais donner ici que les principales fonctions nécessaires à l’utilisation des userforms.
C’est un schéma de procédure d’utilisation de ce genre de feuilles personnalisées. Il faut
avant toute chose donner un nom à notre feuille personnalisée (propriété (name) de la
userform par exemple MyFeuillePerso), ensuite il faut placer les contrôles souhaités dans
notre feuille et leur attribuer le code nécessaire à leur utilisation.
Load MaFeuillePerso
Permet une mise en mémoire de la feuille dans notre projet
MaFeuillePerso.Show
Permet de visualiser à l’écran la feuille finie
Unload MyFeuillePerso
Cette fonction libère la mémoire de l’ordinateur. Une fois cette méthode invoquée il nous
est plus possible de faire apparaître à nouveau cette feuille à moins de la recharger en
mémoire, cette fonction est à invoquer uniquement en fin de procédure.
ListCount
Renvoie le nombre d'entrées de liste d'un contrôle. Si aucun élément n'est sélectionné, la
valeur de la propriété ListCount est 0.
ListIndex
La propriété ListIndex contient un index de la ligne sélectionnée dans la liste. Les valeurs
de la propriété ListIndex sont comprises entre –1 et le nombre total de lignes de la liste
moins 1 (c'est-à-dire, ListCount – 1).
RemoveItem
Permet de retirer un membre de la listBox à partir de son ListIdex, si vous avez incrémenté
une variable i qui parcourt l’ensemble des éléments de votre ListBox alors la syntaxe global
est :
MaUserForm.MaListBox.RemoveItem i
RowSource
Permet de spécifier une source dans un fichier Excel mais cette source n’admet pas l’objet
Range, il faut sélectionner la feuille Excel où se trouve les données au préalable et ensuite
lui affecter les valeurs
RowSource = « A1 :A3 »
Ou directement dans la fenêtre Propriété RowSource Feuil1 !a1 :a3
Selected
Renvoie ou définit l'état de sélection des éléments dans un contrôle ListBox
Si vous avez incrémenté une variable i qui parcours l’ensemble des éléments de votre
ListBox alors la syntaxe global est : MaUserForm.MaListBox.Selected (i)
Dans ce chapitre je ne vais pas référencer toutes les fonctionnalités des objets DAO (Data
Access Object) ou ADODB (ActiveX Data Object) car ce serait trop long mais juste vous
donner des bases afin d’exploiter des données contenues dans des bases ACCESS et de
savoir les exporter sous Excel.
Nous verrons les étapes successives à effectuer afin d’obtenir des informations contenues
dans une table :
- Il faut avant tout établir la référence avec les objets ADO
- Il faut établir une connexion avec la table
- Définir un objet recordset qui va contenir les informations
Nous en avons déjà parlé en préambule de ce cours, lorsque nous souhaitons faire des
développements avec une source externe il faut établir une référence (ou un lien) entre ces
objets et Excel. Celui-ci se fait à travers le champ Outils\Références (ici il s’agit de cocher
Microsoft ActiveX Data Objects 2.8 library ou une version antérieure)
Maintenant que la référence à été ajoutée nous allons pouvoir avoir accès à toutes les
fonctionnalités des objets ADO et notamment les connexions.
Le mot clé New signifie que nous avons crée un pointeur sur un objet ADODB.connection
et que la place en mémoire lui a été allouée.
Il faut à présent lui définir le chemin de connexion, ici nous allons attaquer la base exemple
d’ACCESS : FPWIND
MyConnect.ConnectionString = _
"Provider=Microsoft.Jet.OLEDB.4.0;DataSource=C:\Program Files\Microsoft
Office\Office10\1036\FPNWIND.mdb"
Le chemin peut-être mis dans une variable chaîne de caractère et bien sûr être affecté à la
propriété ConnectionString de l’objet ADODB.Connection
Une fois la connexion avec la table ACCESS activée il faut établir le dialogue avec elle et
ceci se fait par l’intermédiaire de la requête SQL (Structured Query Language)
Explications: La table Clients est composée de différents champs dont Ville. L’étoile
signifie que l’on souhaite faire remonter tous les champs de cette table Clients. Mais on
pourrait très bien ne spécifier que certains champs de la table avec une variable ou une
chaîne de caractères. La déclaration aurait été :
MySQL = »SELECT Champ1, Champ2, Champ3 FROM Clients Ville=’Mexico D.F’ »
Ou
Mavariable = »Champ1, Champ2, Champ3 de type string
MySQL = « SELECT « & Mavariable & « FROM Clients Ville=’Mexico D.F’ »
De plus les éléments sélectionnés doivent se mettre entre simple côte si c’est une constante.
Ville=’Mexico D.F’
Dans le cas d’une variable on doit rajouter des doubles côtes :
Ville=’” & Mavariable & “’
Afin de pouvoir stocker les informations renvoyées par la requête nous avons besoin de
déclarer un objet recordset :
Un recordset est un ensemble d'enregistrements. Chaque entrée de cet ensemble contient les
données relatives à un enregistrement. L'illustration suivant schématique une telle entité
Pour vous déplacer dans cette structure, une notion de curseur vous est fournie. Le
curseur est une entité que vous pouvez, via différentes méthodes, balader sur les
enregistrements. Ces méthodes sont au nombre de cinq : MoveFirst, MovePrevious,
MoveNext, MoveLast et enfin Move (qui déplace le curseur sur un enregistrement bien
particulier). Attention, deux cases du RecordSet sont particulières : la première et la
dernière, respectivement appelées "Begin Of File" et "End Of File". Elles permettent de
savoir si oui, ou non, nous sommes en dehors des éléments retournés par la requête de
sélection.
Ensuite nous devons faire le lien entre la requête et la table avec la fonction OPEN
Myrs.Open MySQL, MyConnect
Maintenant il nous reste plus qu’à nous balader dans notre recordset qui est un véhicule
contenant toutes les informations dont nous avons besoin, nous y accédons par
l’intermédiaire des champs (Fields). Les champs sont accessibles soient par leur nom soient
par leur numéro. Les champs disponibles sont listés de zéro à Fields.Count-1 (count est
une propriété de Fields)
Lorsque le processus est fini il faut impérativement fermer nos variables objets et les
effacer aussi en mémoire.
Myrs.close
Set Myrs = Nothing
Vous serez peut-être amenés à vouloir introduire dans votre table des données de manière
dynamique ou de modifier des données pour mettre à jour par exemple l’adresse d’un de
vos clients ou son changement de téléphone
Il y a deux façons d’insérer des données dans une table, soit avec la méthode AddNew à
déconseiller car si vous avez une table qui contient plusieurs millions ou quelques milliers
de records celle-ci sera très lente mais la syntaxe est la suivante :
Syntaxe d’insertion
With Myrs
.AddNew
for i =0 to .Fields.Count-1
.Fields(i) = MaValeur
Next i
End With
Sinon une méthode plus élégante et beaucoup plus rapide consiste à utiliser la méthode
INSERT
MySQL = "INSERT INTO Clients (Champ1, Champ2, Champ3,…, ChampN) VALUES
(""Valeur1"",""Valeur2",""Valeur3"",…,""ValeurN"")"
Ensuite la prise en compte de cette requête se fait par l’intermédiaire de la fonction Exécute
de la connexion
Lorsque vous souhaitez mettre à jour un champ de la table seulement vous devez utiliser
soit la méthode de l’objet Recordset Update soit la méthode Exécute de la connexion
explicitée ci-dessous
Si on ne spécifie pas les conditions alors tous les enregistrements de la table subiront cette
mise à jour.
Si vous effectuez des changements dans votre table, notamment avec les méthodes insert et
updates (mise à jour) vous devez valider cette transformation car sinon celle-ci ne sera pas
prise en compte dans la table. La validation se fait par l’intermédiaire de la méthode
CommitTrans de votre objet Connexion
MyConnect.CommitTrans
Si on contraire vous souhaitez annuler la transformation parce que par exemple vous n’êtes
pas satisfait du retour de votre macro ou si vous avez détecté une erreur, vous pouvez le
faire par la méthode RollBackTrans
MyConnect.RollBackTrans
6. Les QueryTables
Les Querytables sont des requêtes pour importer des données externes (Web, base de
données, etc..) vers Excel. Il me semble que cette méthode est un peu plus rapide que la
précédente mais je ne l’ai pas expertisée sur des bases de données importantes, elle répond
à une syntaxe bien particulière :
Vous devez au préalable avoir déclarer un objet ADODB.recordset, et bien évidemment
une instruction SQL pour la requête. Ensuite avec la connexion que vous avez déclarée
vous devez exécuter votre requête
With MyConnect
MyConnect.ConnectionString = " Chaîne de connexion"
MyConnect.Open
Set MyRecordset = .Execute(MySQL)
End with
Ensuite pour récupérer les données il ne vous reste plus qu’à invoquer la méthode Refresh
de l’objet QueryTable
MyQueryT.Refresh
A noter que le résultat de cette QueryTable peut aussi être la source d’autres QueryTable ou
PivotTable dans ce cas il est préférable de mettre la propriété BackGroundQuery à False
pour passer la main à la procédure qu'une fois toutes les données récupérées dans la feuille
de calcul.