Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

soucis avec MSComctlLib excel vba

7 réponses
Avatar
tallix
Bonjour au forum
Depuis plusieurs semaines je cherche une solution mais ne vain.
Cadre de santé en milieu hospitalier je développe pour mon unité de soins et celles de mes collègues une application de gestion documentaire sous excel vba.(fiches techniques des appareils médicaux, protocoles de soins, roulement des soignants, textes de lois, etc. Cette base sera consultée par tous les agents d es unités, techniciens , infirmières, aides soignantes, médecins, cadre de santé, etc

Pour cela j’ai crée un userform nommé « UserF1 » contenant des contrôles dont 2 treeviews, 2 listviews et 2 imageslists.

Quand j’ouvre le classeur excel :
-soit les controls du MSComctlLib ont tous disparus,
-soit le MSCOMCTL.OCX.n’apparaît pas dans la liste des références
et cela quelque soit le pack office du pc utilisé.(xp,2002,2002,2010). Tous les pc sont en réseau.
J’ai tenté un tas de solutions par macros dont :
-Suppression des références manquantes
-Réinstallations de ces références
-Chargement des références dans un dossier perso dans lequel j’ais copié les *.dll,*.ocx, etc.
Rien n’a fonctionné de façon durable.

J’ai donc choisi de créer par macros :
- les contrôles treeview, listeviews et imagelists à l’ouverture du classer
- avec activation des lignes de codes faisant références à ces contrôles.
-à la fermeture du classeur par macro je transforme les lignes de codes faisant références à ces contrôles en commentaires
- et décoche la référence Microsoft windows controls 6.0(sp6), MSCOMCTL.OCX.

Ca marche très bien comme ca. Mais…..

Dans la procédure qui crée les controls MSCOMCTL j’ai mis deux lignes qui testent si ces contrôles existent déjà et s’ils existent de ne pas les récréer.
Et bien la rien ne marche.
Dans le code que je vous transmets les lignes de codes que j’ai transformés en commentaires sont celles qui me posent problème.
Auriez une solution qui me permettrait de retrouver le sommeil.
J’ai créé 6 procédures pour les 6 contrôles dont voici le code des 2 premières.
Par avance merci à tous pour votre aide
=============================
Dim i As Integer
Dim usf As Object
Dim ObjetsTreeListImage As Object
Dim Obj As Object
=================================
Sub CreerTreeView1()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne fautive
'If Obj.Name <> "" Then Exit Sub 'ligne fautive
Set ObjetsTreeListImage = usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 2
.Name = "TreeView1"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
ReactiveLigne

End Sub
Sub CreerTreeView2()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne fautive
'If Obj.Name <> "" Then Exit Sub 'ligne fautive
Set ObjetsTreeListImage = usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 472
.Name = "TreeView2"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
End Sub
==================================================

7 réponses

Avatar
MichD
Bonjour,

A ) Pour cette ligne de code :
Set Obj = UserF1.Controls("TreeView1")
Cela ne cause aucun problème si le contrôle "TreeView1"
est présent dans le formulaire. Ajoute une ligne de code
précédent cette dernière : On Error Resume Next

B ) La meilleure façon de charger une bibliothèque

Je te donne un exemple comment arriver à charger
une référence à une bibliothèque dès l'ouverture du
fichier.

En jumelant l'événement du Workbook_Open du Thisworkbook
et la méthode "AddFromGuid", il est possible de charger ladite
bibliothèque. Le code devrait s'exécuter normalement sans
aucun problème à moins que le fichier .OCX responsable de
cette bibliothèque soit absente sur un ordinateur particulier.

Pour la bibliothèque dont il est question, son nom est :

Nom de la bibliothèque : MSComctlLib
Location de la .OCX : C:WindowsSysWOW64MSCOMCTL.OCX
OU C:WindowsSystem32MSCOMCTL.OCX
selon que le Windows est 64 ou 32 bits.
Si le fichier MSCOMCTL.OCX est introuvable sur Excel 2010, il
faut d'abord l'ajouter, renseigner la base de registre et seulement
ensuite tu pourras exécuter les codes reliés à ce contrôle.

Comme tu utilises ledit classeur avec Excel 2010, as-tu vérifié que
ce fichier était déjà présent dans l'un ou l'autre des répertoires
mentionnés.

Appellation descriptive de la bibliothèque dans la
fenêtre des références : Microsoft Windows Common Controls 6.0 (SP6)

La meilleure façon de charger une bibliothèque est d'utiliser le
Guid (Globally Unique Identifier) de la référence.

Pour connaître le nom d'une bibliothèque, on doit ouvrir dans la
fenêtre de l'éditeur de code, l'explorateur d'objets (raccourci F2).
Dans la liste déroulante "Toutes les bibliothèques" se retrouve le
nom des bibliothèques chargées pour un projet.

Lorsque l'on ajoute une bibliothèque en utilisant la barre des menus /
outils / références / on retrouve dans cette fenêtre une "appellation
descriptive" de la bibliothèque. Il ne faut pas confondre entre le
nom de la bibliothèque et l'appellation descriptive.

Le Guid d'une bibliothèque est inscrit dans la base de registre de Windows.
En conséquence, le chargement de cette dernière n'est pas assujetti à la
location du fichier source dans l'arborescence de l'explorateur Windows.

Il peut arriver dans quelques cas que Microsoft modifie le nom de la
bibliothèque
pour des raisons qu'il lui appartienne. Pour être sûr de cette méthode, il
faut
vérifier que ladite bibliothèque (son nom) est identique sur les différentes
versions d'Excel.

Voici une procédure pour trouver le "Guid" de toutes les bibliothèques
chargées
dans un projet. Et oui, pour avoir cette information, il faut d'abord
l'avoir chargé !

'------------------------------------------
Sub Lister_LesGuids_Références()

Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer, A As Integer

Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))

On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For A = 1 To NbRef
Sh.Cells(X, 1) = .Item(A).Name
Sh.Cells(X, 2) = .Item(A).Description
Sh.Cells(X, 3) = .Item(A).GUID
Sh.Cells(X, 4) = .Item(A).Major
Sh.Cells(X, 5) = .Item(A).Minor
Sh.Cells(X, 6) = .Item(A).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'------------------------------------------

À partir de l'information, on peut charger les bibliothèques désirées
de cette manière :

Dans le ThisWorkbook, tu crées ce type de procédure :

Exemple : Pour charger la bibliothèque :
Library MSForms -> Nom de la bibliothèque (formulaire)
C:Windowssystem32FM20.DLL -> Chemin et fichier source
Microsoft Forms 2.0 Object Library -> Appellation descriptive.

Exemple pour charger la référence du formulaire.
'----------------------------------------------
Private Sub Workbook_Open()
Dim Refs As Object, Ref As Object
On Error Resume Next
With ThisWorkbook
.VBProject.References.AddFromGuid _
GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor:=0
End With

End Sub
'----------------------------------------------

Une information additionnelle, si tu utilises cette façon de faire pour
charger la référence émanant de l'ajout d'un contrôle supplémentaire
(Exemple : Calendar) à la boîte d'outils formulaire (userform), le code
s'exécutera normalement sur une nouvelle machine. Cependant, la procédure
ne permet pas d'ajouter le contrôle "Calendar", l'icône, dans la boîte à
outils
du formulaire. D'ailleurs, je ne connais pas de code VBA capable de
faire ce travail.




MichD
---------------------------------------------------------------
Avatar
talllix
Le mercredi 27 mars 2013 22:31:30 UTC+1, MichD a écrit :
Bonjour,



A ) Pour cette ligne de code :

Set Obj = UserF1.Controls("TreeView1")

Cela ne cause aucun problème si le contrôle "TreeView1"

est présent dans le formulaire. Ajoute une ligne de code

précédent cette dernière : On Error Resume Next



B ) La meilleure façon de charger une bibliothèque



Je te donne un exemple comment arriver à charger

une référence à une bibliothèque dès l'ouverture du

fichier.



En jumelant l'événement du Workbook_Open du Thisworkbook

et la méthode "AddFromGuid", il est possible de charger ladite

bibliothèque. Le code devrait s'exécuter normalement sans

aucun problème à moins que le fichier .OCX responsable de

cette bibliothèque soit absente sur un ordinateur particulier.



Pour la bibliothèque dont il est question, son nom est :



Nom de la bibliothèque : MSComctlLib

Location de la .OCX : C:WindowsSysWOW64MSCOMCTL.OCX

OU C:WindowsSystem32MSCOMCTL.OCX

selon que le Windows est 64 ou 32 bits.

Si le fichier MSCOMCTL.OCX est introuvable sur Excel 2010, il

faut d'abord l'ajouter, renseigner la base de registre et seulement

ensuite tu pourras exécuter les codes reliés à ce contrôle.



Comme tu utilises ledit classeur avec Excel 2010, as-tu vérifié que

ce fichier était déjà présent dans l'un ou l'autre des répertoi res

mentionnés.



Appellation descriptive de la bibliothèque dans la

fenêtre des références : Microsoft Windows Common Controls 6.0 (SP6 )



La meilleure façon de charger une bibliothèque est d'utiliser le

Guid (Globally Unique Identifier) de la référence.



Pour connaître le nom d'une bibliothèque, on doit ouvrir dans la

fenêtre de l'éditeur de code, l'explorateur d'objets (raccourci F2).

Dans la liste déroulante "Toutes les bibliothèques" se retrouve le

nom des bibliothèques chargées pour un projet.



Lorsque l'on ajoute une bibliothèque en utilisant la barre des menus /

outils / références / on retrouve dans cette fenêtre une "appellati on

descriptive" de la bibliothèque. Il ne faut pas confondre entre le

nom de la bibliothèque et l'appellation descriptive.



Le Guid d'une bibliothèque est inscrit dans la base de registre de Wind ows.

En conséquence, le chargement de cette dernière n'est pas assujetti à la

location du fichier source dans l'arborescence de l'explorateur Windows.



Il peut arriver dans quelques cas que Microsoft modifie le nom de la

bibliothèque

pour des raisons qu'il lui appartienne. Pour être sûr de cette méth ode, il

faut

vérifier que ladite bibliothèque (son nom) est identique sur les diff érentes

versions d'Excel.



Voici une procédure pour trouver le "Guid" de toutes les bibliothèque s

chargées

dans un projet. Et oui, pour avoir cette information, il faut d'abord

l'avoir chargé !



'------------------------------------------

Sub Lister_LesGuids_Références()



Dim X As Integer, Sh As Worksheet

Dim NbRef As Integer, A As Integer



Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))



On Error Resume Next

With Sh

.Name = "GUIDS"

.Cells(1, 1) = "Nom de la bibliothèque"

'Son appellation dans la fenêtre Reférences

.Cells(1, 2) = "Description"

.Cells(1, 3) = "Guid"

.Cells(1, 4) = "Major"

.Cells(1, 5) = "Minor"

.Cells(1, 6) = "Chemin complet"

With .Range("A1:F1")

.Font.Bold = True

.Font.Size = 12

End With

With Sh.Parent.VBProject.References

NbRef = .Count

X = 2

For A = 1 To NbRef

Sh.Cells(X, 1) = .Item(A).Name

Sh.Cells(X, 2) = .Item(A).Description

Sh.Cells(X, 3) = .Item(A).GUID

Sh.Cells(X, 4) = .Item(A).Major

Sh.Cells(X, 5) = .Item(A).Minor

Sh.Cells(X, 6) = .Item(A).fullpath

X = X + 1

Next

End With

.Range("A1").CurrentRegion.EntireColumn.AutoFit

End With

End Sub

'------------------------------------------



À partir de l'information, on peut charger les bibliothèques désir ées

de cette manière :



Dans le ThisWorkbook, tu crées ce type de procédure :



Exemple : Pour charger la bibliothèque :

Library MSForms -> Nom de la bibliothèque (formulaire)

C:Windowssystem32FM20.DLL -> Chemin et fichier source

Microsoft Forms 2.0 Object Library -> Appellation descriptive.



Exemple pour charger la référence du formulaire.

'----------------------------------------------

Private Sub Workbook_Open()

Dim Refs As Object, Ref As Object

On Error Resume Next

With ThisWorkbook

.VBProject.References.AddFromGuid _

GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor: =0

End With



End Sub

'----------------------------------------------



Une information additionnelle, si tu utilises cette façon de faire pour

charger la référence émanant de l'ajout d'un contrôle supplémen taire

(Exemple : Calendar) à la boîte d'outils formulaire (userform), le co de

s'exécutera normalement sur une nouvelle machine. Cependant, la procé dure

ne permet pas d'ajouter le contrôle "Calendar", l'icône, dans la bo îte à

outils

du formulaire. D'ailleurs, je ne connais pas de code VBA capable de

faire ce travail.









MichD

---------------------------------------------------------------



Merci beaucoup pour votre réponse éclair et conséquente!!

J'ai déjà lu des articles sur les GUIDS mais cela me paraissait obscur. ....

Votre réponse m'encourage  à en savoir plus. Donc dès ce soir je po tasse la question.

Demain dans mon unité  je mettrai en application vos conseils et vous e n ferai un fidèle retour.


Encore sincèrement, Merci

Tallix
Avatar
tallix
Le mercredi 27 Mars 2013 à 20:57 par tallix :
Bonjour au forum
Depuis plusieurs semaines je cherche une solution mais ne vain.
Cadre de santé en milieu hospitalier je développe pour mon
unité de soins et celles de mes collègues une application de
gestion documentaire sous excel vba.(fiches techniques des appareils
médicaux, protocoles de soins, roulement des soignants, textes de lois,
etc. Cette base sera consultée par tous les agents d es unités,
techniciens , infirmières, aides soignantes, médecins, cadre de
santé, etc

Pour cela j’ai crée un userform nommé « UserF1
» contenant des contrôles dont 2 treeviews, 2 listviews et 2
imageslists.

Quand j’ouvre le classeur excel :
-soit les controls du MSComctlLib ont tous disparus,
-soit le MSCOMCTL.OCX.n’apparaît pas dans la liste des
références
et cela quelque soit le pack office du pc utilisé.(xp,2002,2002,2010).
Tous les pc sont en réseau.
J’ai tenté un tas de solutions par macros dont :
-Suppression des références manquantes
-Réinstallations de ces références
-Chargement des références dans un dossier perso dans lequel
j’ais copié les *.dll,*.ocx, etc.
Rien n’a fonctionné de façon durable.

J’ai donc choisi de créer par macros :
- les contrôles treeview, listeviews et imagelists à
l’ouverture du classer
- avec activation des lignes de codes faisant références à
ces contrôles.
-à la fermeture du classeur par macro je transforme les lignes de codes
faisant références à ces contrôles en commentaires
- et décoche la référence Microsoft windows controls
6.0(sp6), MSCOMCTL.OCX.

Ca marche très bien comme ca. Mais…..

Dans la procédure qui crée les controls MSCOMCTL j’ai mis
deux lignes qui testent si ces contrôles existent déjà et
s’ils existent de ne pas les récréer.
Et bien la rien ne marche.
Dans le code que je vous transmets les lignes de codes que j’ai
transformés en commentaires sont celles qui me posent problème.
Auriez une solution qui me permettrait de retrouver le sommeil.
J’ai créé 6 procédures pour les 6 contrôles
dont voici le code des 2 premières.
Par avance merci à tous pour votre aide
=============================
Dim i As Integer
Dim usf As Object
Dim ObjetsTreeListImage As Object
Dim Obj As Object
=================================
Sub CreerTreeView1()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 2
.Name = "TreeView1"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
ReactiveLigne

End Sub
Sub CreerTreeView2()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 472
.Name = "TreeView2"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
End Sub
==================================================


.Bonjour MichD
Me voilà au boulot.
Pour la parie A de votre réponse:
======================================
A ) Pour cette ligne de code :
Set Obj = UserF1.Controls("e;TreeView1"e;)
Cela ne cause aucun problème si le contrôle "e;TreeView1"e;
est présent dans le formulaire. Ajoute une ligne de code
précédent cette dernière : On Error Resume Next
=========================================
j'ai mis un On Error resume next, la routine s'exécute mais rien n'est crée, c'est à dire que le TreeView1 n'est pas crée et la référence toujours pas activée.
Sans le On Error resume next, sans le TreeView et la Référence non active la routine fait bien son boulot.
******************************************************
Public usf As Object
Dim ObjetsTreeListImage As Object
Dim Obj As Object
Sub CreerTV1()
Dim quoi As String
Set usf = ThisWorkbook.VBProject.VBComponents("e;UserF1"e;)
On Error Resume Next
Set Obj = UserF1.Controls("e;TreeView1"e;) 'ligne fautive
If Obj.Name <> "e;"e; Then Exit Sub

Set ObjetsTreeListImage = usf.Designer.Controls.Add("e;MSComctlLib.TreeCtrl.2"e;)
With ObjetsTreeListImage
.Name = "e;TreeView1"e;
---------
End With
End Sub
*******************************************************
Pour la partie B je la ferais chez moi car le service m'attend.

Merci pour votre précieuse aide
Avatar
tallix
Le mercredi 27 Mars 2013 à 20:57 par tallix :
Bonjour au forum
Depuis plusieurs semaines je cherche une solution mais ne vain.
Cadre de santé en milieu hospitalier je développe pour mon
unité de soins et celles de mes collègues une application de
gestion documentaire sous excel vba.(fiches techniques des appareils
médicaux, protocoles de soins, roulement des soignants, textes de lois,
etc. Cette base sera consultée par tous les agents d es unités,
techniciens , infirmières, aides soignantes, médecins, cadre de
santé, etc

Pour cela j’ai crée un userform nommé « UserF1
» contenant des contrôles dont 2 treeviews, 2 listviews et 2
imageslists.

Quand j’ouvre le classeur excel :
-soit les controls du MSComctlLib ont tous disparus,
-soit le MSCOMCTL.OCX.n’apparaît pas dans la liste des
références
et cela quelque soit le pack office du pc utilisé.(xp,2002,2002,2010).
Tous les pc sont en réseau.
J’ai tenté un tas de solutions par macros dont :
-Suppression des références manquantes
-Réinstallations de ces références
-Chargement des références dans un dossier perso dans lequel
j’ais copié les *.dll,*.ocx, etc.
Rien n’a fonctionné de façon durable.

J’ai donc choisi de créer par macros :
- les contrôles treeview, listeviews et imagelists à
l’ouverture du classer
- avec activation des lignes de codes faisant références à
ces contrôles.
-à la fermeture du classeur par macro je transforme les lignes de codes
faisant références à ces contrôles en commentaires
- et décoche la référence Microsoft windows controls
6.0(sp6), MSCOMCTL.OCX.

Ca marche très bien comme ca. Mais…..

Dans la procédure qui crée les controls MSCOMCTL j’ai mis
deux lignes qui testent si ces contrôles existent déjà et
s’ils existent de ne pas les récréer.
Et bien la rien ne marche.
Dans le code que je vous transmets les lignes de codes que j’ai
transformés en commentaires sont celles qui me posent problème.
Auriez une solution qui me permettrait de retrouver le sommeil.
J’ai créé 6 procédures pour les 6 contrôles
dont voici le code des 2 premières.
Par avance merci à tous pour votre aide
=============================
Dim i As Integer
Dim usf As Object
Dim ObjetsTreeListImage As Object
Dim Obj As Object
=================================
Sub CreerTreeView1()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 2
.Name = "TreeView1"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
ReactiveLigne

End Sub
Sub CreerTreeView2()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 472
.Name = "TreeView2"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
End Sub
==================================================


Re-bonjour,

Je suis pas allé au self....Trop impatient de faire des essais...

Voila Grace à votre code j'ai récupéré le GUID(excel 2002 et 2010 c'est le même) de MSComctlLib et placé la routine si dessous.
Private Sub Workbook_Open()
'Stop
Dim Refs As Object, Ref As Object
On Error Resume Next
With ThisWorkbook
.VBProject.References.AddFromGuid _
GUID:="{831FDD16-0C5C-11D2-A9FC-0000F8754DA1}", major:=2, minor:=0
End With
------------
CA A MARCHé!! J'Y CROIS PAS!!!!
SUPER. !!!!
Maiiiiis , je vais vite aller faire des tests sur d'autres postes.
Ca me parait trop beau!
A tout à l'heure ou à ce soir pour un compte rendu
Merciiiiiiiiiiiiiiii
Avatar
tallix
Le mercredi 27 Mars 2013 à 22:31 par MichD :
Bonjour,

A ) Pour cette ligne de code :
Set Obj = UserF1.Controls("TreeView1")
Cela ne cause aucun problème si le contrôle "TreeView1"
est présent dans le formulaire. Ajoute une ligne de code
précédent cette dernière : On Error Resume Next

B ) La meilleure façon de charger une bibliothèque

Je te donne un exemple comment arriver à charger
une référence à une bibliothèque dès
l'ouverture du
fichier.

En jumelant l'événement du Workbook_Open du Thisworkbook
et la méthode "AddFromGuid", il est possible de charger ladite
bibliothèque. Le code devrait s'exécuter normalement sans
aucun problème à moins que le fichier .OCX responsable de
cette bibliothèque soit absente sur un ordinateur particulier.

Pour la bibliothèque dont il est question, son nom est :

Nom de la bibliothèque : MSComctlLib
Location de la .OCX : C:WindowsSysWOW64MSCOMCTL.OCX
OU C:WindowsSystem32MSCOMCTL.OCX
selon que le Windows est 64 ou 32 bits.
Si le fichier MSCOMCTL.OCX est introuvable sur Excel 2010, il
faut d'abord l'ajouter, renseigner la base de registre et seulement
ensuite tu pourras exécuter les codes reliés à ce
contrôle.

Comme tu utilises ledit classeur avec Excel 2010, as-tu vérifié
que
ce fichier était déjà présent dans l'un ou l'autre
des répertoires
mentionnés.

Appellation descriptive de la bibliothèque dans la
fenêtre des références : Microsoft Windows Common Controls
6.0 (SP6)

La meilleure façon de charger une bibliothèque est d'utiliser le
Guid (Globally Unique Identifier) de la référence.

Pour connaître le nom d'une bibliothèque, on doit ouvrir dans la
fenêtre de l'éditeur de code, l'explorateur d'objets (raccourci
F2).
Dans la liste déroulante "Toutes les bibliothèques" se
retrouve le
nom des bibliothèques chargées pour un projet.

Lorsque l'on ajoute une bibliothèque en utilisant la barre des menus /
outils / références / on retrouve dans cette fenêtre une
"appellation
descriptive" de la bibliothèque. Il ne faut pas confondre entre le
nom de la bibliothèque et l'appellation descriptive.

Le Guid d'une bibliothèque est inscrit dans la base de registre de
Windows.
En conséquence, le chargement de cette dernière n'est pas
assujetti à la
location du fichier source dans l'arborescence de l'explorateur Windows.

Il peut arriver dans quelques cas que Microsoft modifie le nom de la
bibliothèque
pour des raisons qu'il lui appartienne. Pour être sûr de cette
méthode, il
faut
vérifier que ladite bibliothèque (son nom) est identique sur les
différentes
versions d'Excel.

Voici une procédure pour trouver le "Guid" de toutes les
bibliothèques
chargées
dans un projet. Et oui, pour avoir cette information, il faut d'abord
l'avoir chargé !

'------------------------------------------
Sub Lister_LesGuids_Références()

Dim X As Integer, Sh As Worksheet
Dim NbRef As Integer, A As Integer

Set Sh = Worksheets.Add(After:=Sheets(Sheets.Count))

On Error Resume Next
With Sh
.Name = "GUIDS"
.Cells(1, 1) = "Nom de la bibliothèque"
'Son appellation dans la fenêtre Reférences
.Cells(1, 2) = "Description"
.Cells(1, 3) = "Guid"
.Cells(1, 4) = "Major"
.Cells(1, 5) = "Minor"
.Cells(1, 6) = "Chemin complet"
With .Range("A1:F1")
.Font.Bold = True
.Font.Size = 12
End With
With Sh.Parent.VBProject.References
NbRef = .Count
X = 2
For A = 1 To NbRef
Sh.Cells(X, 1) = .Item(A).Name
Sh.Cells(X, 2) = .Item(A).Description
Sh.Cells(X, 3) = .Item(A).GUID
Sh.Cells(X, 4) = .Item(A).Major
Sh.Cells(X, 5) = .Item(A).Minor
Sh.Cells(X, 6) = .Item(A).fullpath
X = X + 1
Next
End With
.Range("A1").CurrentRegion.EntireColumn.AutoFit
End With
End Sub
'------------------------------------------

À partir de l'information, on peut charger les bibliothèques
désirées
de cette manière :

Dans le ThisWorkbook, tu crées ce type de procédure :

Exemple : Pour charger la bibliothèque :
Library MSForms -> Nom de la bibliothèque (formulaire)
C:Windowssystem32FM20.DLL -> Chemin et fichier source
Microsoft Forms 2.0 Object Library -> Appellation descriptive.

Exemple pour charger la référence du formulaire.
'----------------------------------------------
Private Sub Workbook_Open()
Dim Refs As Object, Ref As Object
On Error Resume Next
With ThisWorkbook
.VBProject.References.AddFromGuid _
GUID:="{0D452EE1-E08F-101A-852E-02608C4D0BB4}", major:=2, minor:=0
End With

End Sub
'----------------------------------------------

Une information additionnelle, si tu utilises cette façon de faire pour
charger la référence émanant de l'ajout d'un
contrôle supplémentaire
(Exemple : Calendar) à la boîte d'outils formulaire (userform), le
code
s'exécutera normalement sur une nouvelle machine. Cependant, la
procédure
ne permet pas d'ajouter le contrôle "Calendar", l'icône,
dans la boîte à
outils
du formulaire. D'ailleurs, je ne connais pas de code VBA capable de
faire ce travail.




MichD
---------------------------------------------------------------


Me revoilà,

J'ai fait des essais sur 7 machines de notre salle de formation et avec un cadre de santé supérieur d'un autre hôpital du chu à partir du réseau et tout a fonctionné à merveille même avec le classeur. en partage
Ces GUIDS ce sont vraiment des "sésame ouvre toi".

Merci beaucoup à toi MichDe.
Tu es vraiment un Ponte!!!
D'ailleurs il y a plus de 10 ans j'ai eu besoin tes lumières et tu m'a donné la solution.

A bientôt

Je vais donc pouvoir continuer à développer cet outil.
Avatar
MichD
As-tu vraiment testé sur un ordinateur équipé
d'une version Excel 2010?

De mémoire, il me semble que ce fichier MSCOMCTL.OCX
est absent. Il faut l'ajouter (télécharger et copier) dans
l'un des répertoires suivants suivant selon la version de
Windows :

Windows 64 bits :
C:WindowsSysWOW64MSCOMCTL.OCX

Windows 32 bits :
C:WindowsSystem32MSCOMCTL.OCX

Si tu ajoutes ce fichier .OCX sur les ordinateurs où
il est manquant, tu dois aussi initialer la base de
registre de Windows.

Si tu ne sais pas comment procéder, tu n'as qu'à le dire!


MichD
---------------------------------------------------------------
Avatar
tallix
Le mercredi 27 Mars 2013 à 20:57 par tallix :
Bonjour au forum
Depuis plusieurs semaines je cherche une solution mais ne vain.
Cadre de santé en milieu hospitalier je développe pour mon
unité de soins et celles de mes collègues une application de
gestion documentaire sous excel vba.(fiches techniques des appareils
médicaux, protocoles de soins, roulement des soignants, textes de lois,
etc. Cette base sera consultée par tous les agents d es unités,
techniciens , infirmières, aides soignantes, médecins, cadre de
santé, etc

Pour cela j’ai crée un userform nommé « UserF1
» contenant des contrôles dont 2 treeviews, 2 listviews et 2
imageslists.

Quand j’ouvre le classeur excel :
-soit les controls du MSComctlLib ont tous disparus,
-soit le MSCOMCTL.OCX.n’apparaît pas dans la liste des
références
et cela quelque soit le pack office du pc utilisé.(xp,2002,2002,2010).
Tous les pc sont en réseau.
J’ai tenté un tas de solutions par macros dont :
-Suppression des références manquantes
-Réinstallations de ces références
-Chargement des références dans un dossier perso dans lequel
j’ais copié les *.dll,*.ocx, etc.
Rien n’a fonctionné de façon durable.

J’ai donc choisi de créer par macros :
- les contrôles treeview, listeviews et imagelists à
l’ouverture du classer
- avec activation des lignes de codes faisant références à
ces contrôles.
-à la fermeture du classeur par macro je transforme les lignes de codes
faisant références à ces contrôles en commentaires
- et décoche la référence Microsoft windows controls
6.0(sp6), MSCOMCTL.OCX.

Ca marche très bien comme ca. Mais…..

Dans la procédure qui crée les controls MSCOMCTL j’ai mis
deux lignes qui testent si ces contrôles existent déjà et
s’ils existent de ne pas les récréer.
Et bien la rien ne marche.
Dans le code que je vous transmets les lignes de codes que j’ai
transformés en commentaires sont celles qui me posent problème.
Auriez une solution qui me permettrait de retrouver le sommeil.
J’ai créé 6 procédures pour les 6 contrôles
dont voici le code des 2 premières.
Par avance merci à tous pour votre aide
=============================
Dim i As Integer
Dim usf As Object
Dim ObjetsTreeListImage As Object
Dim Obj As Object
=================================
Sub CreerTreeView1()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 2
.Name = "TreeView1"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
ReactiveLigne

End Sub
Sub CreerTreeView2()
Set usf = ThisWorkbook.VBProject.VBComponents("UserF1")
'Set Obj = UserF1.Controls("TreeView2") 'ligne
fautive
'If Obj.Name <> "" Then Exit Sub 'ligne
fautive
Set ObjetsTreeListImage =
usf.Designer.Controls.Add("MSComctlLib.TreeCtrl.2")
With ObjetsTreeListImage
.Height = 290
.Left = 472
.Name = "TreeView2"
.TabStop = True
.Top = 35
.Visible = True
.Width = 276
End With
End Sub
==================================================


Bonsoir MichD,


Les Pc sur lesquels j'ai testé l'appli :

7 sont équipés de 2002 et 2010 pour les besoins de la formation

2 sont équipés seulement de 2010.

Celui du cadre sup. (Groupement hospitalier X) et le mien (Groupement Hospitalier sud) ont 2002 et 2010.

Je serais intéressé de connaitre la procédure pour installer l'OCX.

Le problème pourrait bien se poser vu le nombre de pc qui vont ouvrir cette appli.

Que je t'explique:

Les appli. que je réalise en VBA pour les soignants médicaux et paramédicaux de mon CHU sont toutes sur un simple serveur d'archivage" Nas-y-intersite$".

Sur ce "Nas" j'ai un dossier de plusieurs Giga dont j'administre moi même les droits et dans lequel j'ai mis les applis que j'ai créés.

Sur le serveur commun de chaque groupement j'ai déposé un fichier Mht issu d'excel.

Ce Mht contient des icones identifiants chaque appli(une 30aine) qui elle même posséde un lien qui aprés un clic ouvre un fichier VBS qui installe un racourci sur le bureau.

Ce raccourci pointe vers un autre fichier vbs qui ouvre l'appli déterminée (fichier xlt ou xltm) en shuntant l'alerte macro.

L'utilisateur dispose alors d'une copie du modèle.

Après usage, à la fermeture cette copie ce fait harakiri et ceci pour que je n'ai à assurer que la maintenance des modèles de mon espace.


Par contre comme je n'ai pas de droit d'administrateur pour intervenir sur les PC, je dois faire appel à la SIL.

Ce soir je vais pouvoir aller au lit avant minuit (pour la première depuis 3 semaines au moins ) sans me reveiller en pleine nuit pour teste une idée!!! Et grace à toi

A bientôt

Tallix

PS il y a une dizaine d'année(peut )être 15) j'ai eu ton aide pour la réalisation de ma 1ere appli en vba. C'est ce qui m'a permis d'aller plus loin et de devenir une personne ressource dans mon CHU
---------------------------------------------------------------