Utilisation de l'objet OWC PivotTable
dans un UserForm Excel
Date de publication : 20/06/2007
Par
SilkyRoad (silkyroad.developpez.com)
Cet article présente l'utilisation du contrôle OWC PivotTable dans un UserForm.
Les exemples ont été testés avec:
* Excel2007, WinXP et OWC11.
* Excel2002, WinXP et OWC10.
I. Introduction
II. Description générale
II-A. La fenêtre 'Liste des champs'
II-B. Les zones du PivotTable
II-C. La barre d'outils
II-D. Les connexions
II-D-1. Les fenêtres de connexion
II-D-2. Les connexions manuelles
II-D-3. Les connexions automatisées
III. Les évènements
III-A. BeforeContextMenu
III-B. Click
III-C. CommandExecute
IV. Les procédures du classeur démo
V. Téléchargement
I. Introduction
Le complément Microsoft Office Web Components (OWC ou Composants Web) est une collection de contrôles
permettant de publier sur le
Web des feuilles de calcul, des graphiques, des bases de données et des tableaux croisés dynamiques.
Ces contrôles peuvent aussi être utilisés dans les applications bureautiques Office, et notamment dans
les UserForms.
Si le complément Microsoft Office Web Components n'est pas disponible sur le poste de travail,
téléchargez les composants en fonction de votre version d'Office.
Complément d'Office 2003 : composants Web Office OWC11
Office XP Tool: Web Components OWC10
Ensuite, faites un clic droit dans votre UserForm et sélectionnez l'option
Contrôles supplémentaires.
Cochez la ligne
Microsoft Office PivotTable xx.x et cliquez sur le bouton
OK pour
valider.
xx.x dépend de votre version d'Office:
11.0 (OWC11) pour Office 2003 et Office 2007.
10.0 (OWC10) pour Office 2002.
Le contrôle PivotTable est désormais disponible dans la boîte à outils.
La démo présentée dans cet article utilise le contrôle
PivotTable afin de créer et manipuler
un tableau croisé dynamique dans un UserForm.
Tout comme un classique TCD de l'application Excel, cet outil permet d'effectuer des calculs
(somme, nombre, nb, moyenne, produit, max, min, ecarttype, var) et d'analyser de façon Dynamique
vos sources de données.
Le contrôle OWC PivotTable ne remplace pas les tableaux croisés dynamiques de la feuille
, mais peut être un support complémentaire si vous souhaitez effectuer des calculs
directement depuis un UserForm.
Dans cet exemple, les données sont stockées dans la Feuil2 du même classeur, mais
vous pouvez facilement l'adapter et
utiliser une source externe (table Access, fichier texte, feuille d'un classeur Excel fermé ...)
II. Description générale
II-A. La fenêtre 'Liste des champs'
La fenêtre contient tous les champs qui peuvent être utilisés dans les zones du
PivotTable.
Il existe trois types de champs:
* Les jeux de champs
* Les champs
* Les totaux
Les
jeux de champs sont les éléments supérieurs des noeuds extensibles.
Les
Champs sont les éléments inférieurs des jeux de champs.
Le noeud
Totaux (Totals) regroupe les champs de calcul automatiques
(Somme, Moyenne, Min, Max, Variance...) et les champs de calcul personnalisés.
Les jeux de champs et les champs sont issus de la requête effectuée dans la base de données.
Pour les données de type Date, le jeu de champs contient automatiquement des champs spécifiques
(année, trimestre, mois, semaine, jour...) pour faciliter les filtres et les regroupements.
II-B. Les zones du PivotTable
Le PivotTable est constitué de 4 zones:
* Les champs de ligne
* Les champs de colonne
* Les champs de filtre
* Les totaux et les champs de détails
Pour construire votre TCD, faites glisser/déposer les champs de la fenêtre 'Liste des champs'
vers les zones du PivotTable.
II-C. La barre d'outils
1. Bouton 'A propos de Microsoft Office Web Components'.
Affiche des informations générales sur la version, le Product ID, le copyright du contrôle OWC.
2. Permet de copier la zone sélectionnée dans le PivotTable.
3. Trie la colonne sélectionnée par ordre croissant.
4. Trie la colonne sélectionnée par ordre décroissant.
5. Filtre automatique.
6. Affiche les éléments les plus hauts et les plus bas.
Sélectionnez une cellule du tableau croisé dynamique pour que le bouton soit actif.
Ensuite, cliquez sur le bouton et choisissez le filtre à appliquer.
7. Applique un calcul automatique.
Affichez le détail d'un champ (14) et sélectionnez une cellule pour activer le bouton.
8. Sous-total.
9. Champ calculé.
10. Affiche la sélection sous forme de pourcentage.
11. Réduire.
12. Développer.
13. Masque les détails.
14. Affiche les détails.
15. Actualisation des données.
16. Export vers Excel (pas réussi à faire fonctionner cette transaction).
17. Commandes et options pour la mise en forme du PivotTable.
18. Affiche la fenêtre 'Liste des champs'.
Faites ensuite glisser les champs dans les différentes zones du PivotTable afin de
créer le tableau croisé dynamique.
19. Ouvre la fenêtre d'aide des PivotTable. Le fichier d'aide contient de
nombreuses informations au sujet de ce contrôle.
20. Bouton personnalisé.
Il est possible d'ajouter des boutons personnels dans la barre d'outils, par exemple:
| Vba |
Private Sub CommandButton5_Click()
Dim Tb
Dim NouveauBouton
Set Tb = PivotTable1.Toolbar
On Error Resume Next
Tb.ImageList.ListImages.Add , "NomImage", LoadPicture(ThisWorkbook.Path & "\bouton.ICO")
If Err.Number > 0 Then
MsgBox "L'image 'bouton.ICO' n'a pas pu être chargée: Vérifiez le chemin"
Exit Sub
End If
On Error GoTo 0
Set NouveauBouton = Tb.Buttons.Add(Tb.Buttons.Count + 1, "Bouton01", , , "NomImage")
NouveauBouton.TooltipText = "Info-bulle du nouveau bouton."
Tb.Buttons.Add Tb.Buttons.Count, , , 3
PivotTable1.Refresh
CommandButton5.Enabled = False
End Sub
|
II-D. Les connexions
II-D-1. Les fenêtres de connexion
Lorsque le contrôle est inséré dans votre UserForm, cliquez sur le lien pour établir
la connexion avec la base de données.
Cliquez sur le bouton de connexion (
Edit).
Cliquez sur le bouton
Nouvelle source.
Choisissez
DSN ODBC dans le type de source et cliquez sur le bouton
Suivant.
Sélectionnez le format de la base (ici
MS Access Database) et cliquez sur le
bouton
Suivant.
Recherchez la base Access sur votre disque dur et validez en cliquant sur le bouton
OK.
Sélectionnez la table contenant les données sources et cliquez sur le bouton
Suivant.
Personnalisez les informations (nom, description...) et cliquez sur le bouton
OK pour
enregistrer la connexion.
II-D-2. Les connexions manuelles
Pour lier le PivotTable aux données sources, vous pouvez aussi renseigner directement les
propriétés
ConnectionString et
DataMember.
Exemple de connexion à une table Access:
ConnectionString:
Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="DSN=MS Access Database;DBQ=C:\DOCUMENTS AND SETTINGS\mimi\dossier\maBase.mdb;DefaultDir=C:\DOCUMENTS AND SETTINGS\mimi\dossier;DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;";Initial Catalog=C:\DOCUMENTS AND SETTINGS\mimi\dossier\maBase.mdb
DataMember:
`C:\DOCUMENTS AND SETTINGS\mimi\dossier\maBase.mdb`.`Table1`
Vous pouvez aussi créer une requête dans la table source.
Indiquez ce type de syntaxe dans la propriété
CommandText:
SELECT Champ1,Champ2 FROM Table1
Exemple de connexion à un classeur Excel:
Il est possible de se connecter à un classeur Excel à condition que les données soient
correctement structurées (la première ligne sert à indiquer le nom des champs, à partir de
la première colonne et les informations ne sont pas éparpillées dans la feuille).
ConnectionString:
Provider=MSDASQL.1;Persist Security Info=True;Extended Properties="DSN=Fichiers Excel;DBQ=C:\Documents and Settings\mimi\dossier\PivotTable_UserForm_XL2002.xls;DefaultDir=C:\Documents and Settings\mimi\dossier;DriverId=790;MaxBufferSize=2048;PageTimeout=5;";Initial Catalog=C:\Documents and Settings\mimi\dossier\PivotTable_UserForm_XL2002
Nota: L'extension
.xls n'est pas spécifiée dans le paramètre
Initial Catalog.
DataMember:
`C:\Documents and Settings\mimi\dossier\PivotTable_UserForm_XL2002`.`Feuil2$`
Ou pour une plage nommée:
`C:\Documents and Settings\mimi\dossier\PivotTable_UserForm_XL2002`.`PlageNommee`
Nota: L'extension
.xls n'est pas spécifiée.
CommandText:
SELECT * FROM [Feuil2$]
Ou pour une plage nommée:
SELECT * FROM [PlageNommee]
II-D-3. Les connexions automatisées
La connexion peut aussi être paramétrée par macro. Il s'agit en fait d'automatiser le renseignement
des propriétés présentées dans le chapitre précédent.
Cela facilitera ensuite le déplacement du classeur sans devoir réécrire manuellement le chemin dans
la propriété ConnectionString.
Pour l'exemple qui nous intéresse (les données sources sont dans la Feuil2 du classeur), utilisez:
| Vba |
Cible = Left(ThisWorkbook.FullName, Len(ThisWorkbook.FullName) - 4)
PivotTable1.DisplayFieldList = False
PivotTable1.ConnectionString = _
"Provider=MSDASQL.1;Persist Security Info=True;Extended Properties=" & Chr(34) & _
"DSN=Fichiers Excel;DBQ=" & ThisWorkbook.FullName & ";DefaultDir=" & ThisWorkbook.Path & _
";DriverId=790;MaxBufferSize=2048;PageTimeout=5;" & Chr(34) & _
";Initial Catalog=" & Cible
PivotTable1.CommandText = "SELECT * FROM [Feuil2$]"
|
III. Les évènements
Le contrôle PivotTable dispose de plusieurs évènements pour interagir avec les actions de
l'utilisateur.
Quelques exemples:
BeforeContextMenu
Survient lors de l'utilisation du menu contextuel (clic droit) dans le PivotTable.
Click
Survient lorsque l'utilisateur clique dans le PivotTable.
CommandExecute
Survient après la sélection d'une commande de la barre de menus ou de la barre d'outils.
OnConnect
Survient lorsque le PivotTable se connecte à la source de données.
PivotTableChange
Survient lorsqu'un champ, un jeu de champs ou un total est ajouté ou supprimé du PivotTable.
Query
Survient lorsque le PivotTable fait une requête dans la source de données.
SelectionChange
Survient à chaque sélection dans le PivotTable.
ViewChange
Survient à chaque fois que le PivotTable est redessiné.
Les sous chapitres suivants décrivent les évènements utilisés dans le classeur démo.
III-A. BeforeContextMenu
L'évènement BeforeContextMenu gère le menu contextuel (clic
droit dans le PivotTable).
Vous pouvez:
* Désactiver totalement le clic droit.
* Ajouter des transactions personnalisées dans le menu, avec
la possibilité de masquer les sous menus prédéfinis.
| Vba |
Private Sub PivotTable1_BeforeContextMenu(ByVal x As Long, ByVal y As Long, _
ByVal Menu As OWC11.ByRef, ByVal Cancel As OWC11.ByRef)
Dim MonMenu()
Dim j As Integer
If CheckBox1.Value = False Then
MonMenu = Menu.Value
j = UBound(MonMenu) + 3
ReDim Preserve MonMenu(j)
MonMenu(j - 2) = Empty
MonMenu(j - 1) = Array("Afficher la chaîne de connexion", "MenuPerso01")
MonMenu(j) = Array("Afficher le recordset en cours", "MenuPerso02")
Else
ReDim Preserve MonMenu(1)
MonMenu(0) = Array("Afficher la chaîne de connexion", "MenuPerso01")
MonMenu(1) = Array("Afficher le recordset en cours", "MenuPerso02")
End If
Menu.Value = MonMenu
End Sub
|
III-B. Click
La procédure ci dessous gère l'évènement Click dans le PivotTable.
La macro vérifie le type d'objet cliqué (TypeName(oPvtSel)) et affiche dans un Label le
contenu de la cellule sélectionnée dans la zone totaux et champs de détails.
| Vba |
Private Sub PivotTable1_Click()
Dim oPvtSel As Object
Dim PivotAgg As PivotAggregate
Dim strTotal As String
Dim NomCol As String, NomLigne As String
Dim Resultat As String
Set oPvtSel = PivotTable1.Selection
If TypeName(oPvtSel) = "PivotAggregates" Then
Set PivotAgg = oPvtSel.Item(0)
Resultat = PivotAgg.Value
strTotal = PivotAgg.Total.Caption
NomCol = PivotAgg.Cell.ColumnMember.Caption
NomLigne = PivotAgg.Cell.RowMember.Caption
If strTotal = "Pourcentage du Total" Then Resultat = Format(Resultat, "0.00 %")
If strTotal = "Moyenne par ville" Then Resultat = Format(Resultat, "00.00")
Label1.Caption = Resultat & vbCrLf & strTotal & vbCrLf & NomLigne & vbCrLf & NomCol
End If
End Sub
|
III-C. CommandExecute
L'événement CommandExecute se déclenche après la sélection
d'une commande de la barre de menus ou de la barre d'outils.
L'argument Command identifie la commande exécutée et permet par exemple de lancer
une macro en fonction du bouton ou du menu déclenché.
| Vba |
Private Sub PivotTable1_CommandExecute(ByVal Command As Variant, ByVal Succeeded As Boolean)
If VarType(Command) = vbString Then
Select Case Command
Case "Bouton01"
NomMacro_01
Case "MenuPerso01"
NomMacro_02
Case "MenuPerso02"
NomMacro_03
End Select
End If
End Sub
|
IV. Les procédures du classeur démo
Les codes suivants correspondent à une utilisation dans Excel2003/2007 et OWC11.
Le tableau croisé dynamique est créé automatiquement lors du chargement du UserForm et permet
de visualiser:
* Le nombre d'enregistrements par Ville.
* La somme du champ "Valeur" par ville.
* La moyenne du champ "Valeur" par ville.
* Un champ calculé "pourcentage du total pour chaque ville".
* L'exemple montre aussi comment:
- Extraire des résultats particuliers en cliquant
sur les cellules du PivotTable.
- Mettre en forme les données du tableau (couleur
des cellules, type de caractères, formats des valeurs ...).
- Une option permet de créer un filtre par semaine
sur le champ "ChampDate".
- Il est ainsi possible de choisir les semaines à
afficher dans le PivotTable.
| Vba |
Option Explicit
Private Sub UserForm_Initialize()
Dim Cible As String
Dim oPvtView As OWC11.PivotView
Dim oFieldSets As OWC11.PivotFieldSets
Dim oPvtTotal As PivotTotal
Dim GrdTotal As Integer
Cible = Left(ThisWorkbook.FullName, Len(ThisWorkbook.FullName) - 4)
PivotTable1.DisplayFieldList = False
PivotTable1.ConnectionString = _
"Provider=MSDASQL.1;Persist Security Info=True;Extended Properties=" & Chr(34) & _
"DSN=Fichiers Excel;DBQ=" & ThisWorkbook.FullName & ";DefaultDir=" & ThisWorkbook.Path & _
";DriverId=790;MaxBufferSize=2048;PageTimeout=5;" & Chr(34) & _
";Initial Catalog=" & Cible
PivotTable1.CommandText = "SELECT * FROM [Feuil2$]"
Set oPvtView = PivotTable1.ActiveView
Set oFieldSets = oPvtView.FieldSets
With oPvtView
.RowAxis.InsertFieldSet oFieldSets("Ville")
.FieldSets("Ville").Fields(0).Caption = "Liste des villes"
.DataAxis.InsertFieldSet oFieldSets("Valeurs")
Set oPvtTotal = oPvtView.AddTotal("Nombre par ville", _
oFieldSets("Valeurs").Fields(0), plFunctionCount)
.DataAxis.InsertTotal oPvtTotal
oPvtTotal.HAlignment = plHAlignCenter
oPvtTotal.View.TotalBackColor = RGB(220, 180, 200)
Set oPvtTotal = oPvtView.AddTotal("Somme Valeurs par ville", _
oFieldSets("Valeurs").Fields(0), plFunctionSum)
.DataAxis.InsertTotal oPvtTotal
oPvtTotal.HAlignment = plHAlignCenter
Set oPvtTotal = oPvtView.AddCalculatedTotal("Moyenne", "Moyenne par ville", _
"[Somme Valeurs par ville] / [Nombre par ville]")
.DataAxis.InsertTotal oPvtTotal
oPvtTotal.HAlignment = plHAlignCenter
oPvtTotal.NumberFormat = "00.00"
With PivotTable1.ActiveData
GrdTotal = .Cells(.RowAxis.RowMember.TotalMember, .ColumnAxis.ColumnMember). _
Aggregates("Somme Valeurs par ville").Value
End With
Set oPvtTotal = oPvtView.AddCalculatedTotal("Pourcentage", "Pourcentage du Total", _
"([Somme Valeurs par ville] / " & GrdTotal & ")")
.DataAxis.InsertTotal oPvtTotal
oPvtTotal.HAlignment = plHAlignCenter
oPvtTotal.NumberFormat = "0.00 %"
With .TitleBar
.Font.Name = "comic sans ms"
.Caption = "Le tableau croisé dynamique dans un UserForm"
.BackColor = RGB(220, 180, 200)
.ForeColor = RGB(0, 0, 0)
End With
End With
PivotTable1.ActiveData.HideDetails
End Sub
Private Sub PivotTable1_Click()
Dim oPvtSel As Object
Dim PivotAgg As PivotAggregate
Dim strTotal As String
Dim NomCol As String, NomLigne As String
Dim Resultat As String
Set oPvtSel = PivotTable1.Selection
If TypeName(oPvtSel) = "PivotAggregates" Then
Set PivotAgg = oPvtSel.Item(0)
Resultat = PivotAgg.Value
strTotal = PivotAgg.Total.Caption
NomCol = PivotAgg.Cell.ColumnMember.Caption
NomLigne = PivotAgg.Cell.RowMember.Caption
If strTotal = "Pourcentage du Total" Then Resultat = Format(Resultat, "0.00 %")
If strTotal = "Moyenne par ville" Then Resultat = Format(Resultat, "00.00")
Label1.Caption = Resultat & vbCrLf & strTotal & vbCrLf & NomLigne & vbCrLf & NomCol
End If
End Sub
Private Sub CommandButton1_Click()
If CommandButton1.Caption = "Bloquer la barre d'outils" Then
PivotTable1.Toolbar.Enabled = False
CommandButton1.Caption = "Débloquer la barre"
Else
PivotTable1.Toolbar.Enabled = True
CommandButton1.Caption = "Bloquer la barre d'outils"
End If
End Sub
Private Sub CommandButton2_Click()
PivotTable1.DisplayFieldList = True
End Sub
Private Sub CommandButton3_Click()
Dim oPvtView As OWC11.PivotView
Dim oFieldSets As OWC11.PivotFieldSets
Dim oPvtTotal As PivotTotal
PivotTable1.DisplayFieldList = True
PivotTable1.CommandText = "SELECT [Feuil2$].[Ville],[Feuil2$].[ChampDate] FROM [Feuil2$]"
Set oPvtView = PivotTable1.ActiveView
Set oFieldSets = oPvtView.FieldSets
With oPvtView
.RowAxis.InsertFieldSet oFieldSets("Ville")
.FieldSets("Ville").Fields(0).Caption = "Liste des villes"
.FilterAxis.InsertFieldSet oFieldSets("ChampDate by Week")
.DataAxis.InsertFieldSet oFieldSets("ChampDate")
Set oPvtTotal = oPvtView.AddTotal("Nombre de dates par ville", _
oFieldSets("ChampDate").Fields(0), plFunctionCount)
.DataAxis.InsertTotal oPvtTotal
oPvtTotal.HAlignment = plHAlignCenter
oPvtTotal.View.TotalBackColor = RGB(220, 180, 200)
End With
PivotTable1.DisplayFieldList = False
PivotTable1.ActiveData.HideDetails
End Sub
Private Sub CommandButton4_Click()
PivotTable1.CommandText = "SELECT * FROM [Feuil2$] WHERE Ville='Ville01'"
PivotTable1.DisplayFieldList = True
End Sub
Private Sub CommandButton5_Click()
Dim Tb
Dim NouveauBouton
Set Tb = PivotTable1.Toolbar
On Error Resume Next
Tb.ImageList.ListImages.Add , "NomImage", LoadPicture(ThisWorkbook.Path & "\bouton.ICO")
If Err.Number > 0 Then
MsgBox "L'image 'bouton.ICO' n'a pas pu être chargée: Vérifiez le chemin"
Exit Sub
End If
On Error GoTo 0
Set NouveauBouton = Tb.Buttons.Add(Tb.Buttons.Count + 1, "Bouton01", , , "NomImage")
NouveauBouton.TooltipText = "Info-bulle du nouveau bouton."
Tb.Buttons.Add Tb.Buttons.Count, , , 3
PivotTable1.Refresh
CommandButton5.Enabled = False
End Sub
|