Bonjour à vous.

Voici du code qui permet de créer des propriétés VBA correspondant aux objets suivants :
  • Table de données (ListObject)
  • Tableau croisé dynamique (PivotTable)
  • Plage nommée, ou zone nommée, (range) de classeur ou de feuille.
  • Image (Shape,, type msoPicture)
  • Graphique (ChartObject)


Cela permet ensuite d'utiliser des choses comme fMaFeuille.TCD.TableRange1 ou thisWorkBook.NomMaZone.value="UneValeur" au lieu de fMaFeuille.PivotTables("TCD").TableRange1 et d'un truc horrible pour le nom dans le classeur. Ceci évite aussi de découvrir qu'on a fait une faute de frappe sur le nom de l'objet quand le code plante au moment de l'exécution.

Notez que c'est un travail en cours et qu'il est sans doute imparfait et ne couvre très probablement pas tous les cas possibles.
Je n'ai géré et fait que ce dont j'avais besoin.
Une fois les propriétés générées, il faut les copier à la mains dans le code.
Ceci pour les raisons suivantes :
  1. La machine sur laquelle je travaille me bloque l'accès à l'objet VBE.
  2. J'ai découvert des objets cachés de Excel qui ne m'intéressent pas et que je ne souhaite pas intégrer à mon code.
  3. Je n'ai pas envie d'avoir des bugs automatiquement ajoutés à mon code si le code que je génère est imparfait.

Évidement comme c'est du code fixe, si on change le nom d'un des objets ou qu'on le supprime, le code ne s'adapte pas automatiquement mais la version "standard" non plus :-).

Voici donc le code :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
Private Function ComposerVBAPropriete_Classeur(prmClasseur As Workbook) As String
 
    Dim result As String
 
    Dim o As Object
 
    For Each o In prmClasseur.Names
 
        'Debug.Print o.name
 
        If Not o.name Like "*!*" Then
 
            If result <> "" Then
                result = result & vbNewLine
            End If
 
            result = result & ComposerVBAPropriete(o)
        End If
 
    Next o
 
    ComposerVBAPropriete_Classeur = result
End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
Private Function ComposerVBAPropriete_Feuille(prmFeuille As Worksheet) As String
    Dim result As String
 
    Dim o As Object
 
    For Each o In prmFeuille.ListObjects
        result = result & ComposerVBAPropriete(o)
    Next o
 
    For Each o In prmFeuille.Names
        result = result & ComposerVBAPropriete(o)
    Next o
 
    For Each o In prmFeuille.PivotTables
        result = result & ComposerVBAPropriete(o)
    Next o
 
    For Each o In prmFeuille.ChartObjects
        result = result & ComposerVBAPropriete(o)
    Next o
 
    Dim s As Shape
 
    For Each s In prmFeuille.Shapes
 
        If s.Type = msoPicture Then
            result = result & ComposerVBAPropriete(s)
        End If
 
    Next s
 
    ComposerVBAPropriete_Feuille = result
End Function
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
Private Function ComposerVBAPropriete(prmObjet As Object) As String
    Dim result As String: result = ""
 
    Dim typeObjet As String
    Dim nomObjet As String: nomObjet = prmObjet.name 'Vrai pour la plus part des objets
    Dim nomPropriete As String: nomPropriete = Replace(nomObjet, " ", "_") 'Vrai pour la plus part des objets
 
    If TypeOf prmObjet Is ListObject Then
            typeObjet = "ListObject"
            result = "public property get " & nomPropriete & " as " & typeObjet
            result = result & vbNewLine & "    set " & nomPropriete & "=me." & typeObjet & "s(""" & nomObjet & """)"
            result = result & vbNewLine & "end sub"
            result = result & vbNewLine & ""
 
    ElseIf TypeOf prmObjet Is PivotTable Then
            typeObjet = "PivotTable"
            result = "public property get " & nomPropriete & " as " & typeObjet
            result = result & vbNewLine & "    set " & nomPropriete & "=me." & typeObjet & "s(""" & nomObjet & """)"
            result = result & vbNewLine & "end sub"
            result = result & vbNewLine & ""
 
    ElseIf TypeOf prmObjet Is name Then
            typeObjet = "Range"
            Dim t() As String: t = Split(nomPropriete, "!")
            nomPropriete = t(UBound(t)): nomPropriete = Replace(nomPropriete, " ", "_")
            nomObjet = t(UBound(t))
 
            result = "public property get " & nomPropriete & " as " & typeObjet
 
            If prmObjet.name Like "*!*" Then
                    'Feuille
                    result = result & vbNewLine & "    set " & nomPropriete & "=me.range(""" & nomObjet & """)"
                Else
                    'Classeur
                    result = result & vbNewLine & "    dim n as name: set n=ThisWorkBook.Names(""" & prmObjet.name & """)"
                    result = result & vbNewLine & "    dim t() as string: t=split(Mid(n.RefersTo, 2), ""!"")"
                    result = result & vbNewLine & "    dim nomFeuille as string:nomFeuille=t(0)"
                    result = result & vbNewLine & "    dim adresse as string:adresse=t(1)"
                    result = result & vbNewLine & "    set " & nomPropriete & "=ThisWorkbook.Worksheets(nomFeuille).Range(adresse)"
                    result = result & vbNewLine & "    set n=nothing"
            End If
 
            result = result & vbNewLine & "end sub"
            result = result & vbNewLine & ""
 
    ElseIf TypeOf prmObjet Is Shape Then 'Image
 
            Select Case prmObjet.Type
                Case msoPicture
                    typeObjet = "Shape"
 
                Case Else
                    Call Err.Raise(5, , Error$(5) & " - Type de forme invalide.")
            End Select
 
            nomObjet = prmObjet.name
            nomPropriete = Replace(nomObjet, " ", "_")
            result = "public property get " & nomPropriete & " as " & typeObjet
            result = result & vbNewLine & "    set " & nomPropriete & "=me." & typeObjet & "s(""" & nomObjet & """)"
            result = result & vbNewLine & "end sub"
            result = result & vbNewLine & ""
 
    ElseIf TypeOf prmObjet Is ChartObject Then
            typeObjet = "ChartObject"
 
            result = "public property get " & nomPropriete & " as " & typeObjet
            result = result & vbNewLine & "    set " & nomPropriete & "=me." & typeObjet & "s(""" & nomObjet & """)"
            result = result & vbNewLine & "end sub"
            result = result & vbNewLine & ""
 
        Else
            Call Err.Raise(5, , Error$(5) & " - Type d'objet invalide.")
    End If
 
    ComposerVBAPropriete = result
End Function
A+