Je me permets de partager une petite "astuce" que j'ai trouvé en cherchant à résoudre un problème lié à l'utilisation de l'appareil photo.
En effet, lors de l'utilisation de plusieurs images liées (tableaux en particulier) un problème récurrent de lenteur se fait sentir.
Celui-ci serait dû à la mise à jour intempestive de la liaison, rendant l’exécution de code VBA très lente (je suis passé de 3sec à 13sec environ avec 10 tableaux).
1/ Gestionnaire de nom
Créer un nom: PicOn
Référence: 1
2/Gestionnaire de nom
Créer un nom: Pic1
Référence: =SI(PicsOn=1;Feuil1!$C$3:$I$10;"")
3/VBA
VB:
Sub TurnOffPictures()
ThisWorkbook.Names("PicsOn").RefersTo = "0"
End Sub
Code:
Sub TurnOnPictures()
ThisWorkbook.Names("PicsOn").RefersTo = "1"
End Sub
4/Image
Une fois votre image créer, dans la bar de formule remplacer:
=$C$3:$I$10 par =Pics1
5/Utilisation
Intégré les codes VBA (3) avec des boutons ou ds un code.
En espérant que cela puisse en dépanner certains, car l'utilisation de l'appareil photo est vraiment pratique!
Les remarques, modifications, etc, sont les bienvenus!
PMG
Code:
Sub Pics()
Dim f1 As Worksheet, f2 As Worksheet
Application.ScreenUpdating = False
Set f1 = Sheets("Feuil1")
Set f2 = Sheets("Feuil2")
'Défnition de la zone à copier
f1.Range("C3:I10").Copy
'Collage de la photo
With f2
.Range("E1").Select
.Pictures.Paste.Name = "Pics1"
Application.CutCopyMode = False
End With
With ThisWorkbook
.Names.Add Name:="PicsOn", RefersTo:="=1"
.Names.Add Name:="Pics1", RefersToR1C1:= _
"=IF(PicsOn=1,Feuil1!R3C3:R10C9,"""")"
End With
f2.Shapes.Range(Array("Pics1")).Select
Selection.Formula = "=Pics1"
End Sub
Débutant à peine ma LV4 vba, je n'ai pas tout compris, mais du coup j'ai procédé comme suit (pour un résultat similaire à ceci
) :
1/ Définition du critère de mise à jour : Gestionnaire de nom
Créer un nom: PicOn
Référence: =1
2/ vba de mise à jour à l'ouverture de l'onglet (dans module de feuille concernée) :
VB:
Private Sub Worksheet_Activate()
ThisWorkbook.Names("PicsOn").RefersTo = "1" 'active la mise à jour des images liées
ThisWorkbook.Names("PicsOn").RefersTo = "0" 'désactive la mise à jour des images liées
End Sub
3/Création d'une image liée :
Sélectionner une plage
collage spécial/image liée
4/Définition de la référence de l'image : Gestionnaire de nom
Créer un nom: Pic1
Référence : = SI(PicsOn=1;SI($A$1<>"";INDIRECT($B$1);$Z$1);"")
Sachant que :
- en $A$1 se trouve le critère qui détermine mon image (ex : menu déroulant)
- en $B$1 se trouve l'adresse de mon image de la forme ="'"&DROITE(CELLULE("filename";'feuille1'!$BD22);NBCAR(CELLULE("filename";'feuille1'!$BD22))-CHERCHE("]";CELLULE("filename";'feuille1'!$BD22)))&"'!"&CELLULE("adresse";'feuille1'!$BD22) (pour faire apparaitre dynamiquement le nom de la feuille, ici : 'feuille1'!)
- en $Z$1 se trouve rien du tout (pas même de quadrillage) --> permet d'effacer l'image si le critère est vide (lors de la mise à jour automatique).
5/ Associer la référence à l'image liée
cliquer sur l'image liée
dans la barre de formule taper =Pic1
Attention:
Il m'a fallu d'abord associer l'image avant de redéfinir sa référence comme dit précédemment. Sans quoi j'avais un message d'erreur bloquant ("La référence n'est pas valide").
Ainsi j'ai momentanément créé le nom : Pic1 avec pour ref : =$Z$1
J'ai associé mon image avec Pic1, puis j'ai redéfini la référence de Pic1 dans le gestionnaire de nom.