Autres Permettre à une macro définie avec une bibliothèque d'objet récente de tourner avec une bibliothèque d'objets antérieure

xUpsilon

XLDnaute Accro
Bien le bonjour,

Toujours dans le cadre du configurateur qui me suit depuis 1 mois, j'ai réussi à faire quelques trucs, tels que récemment un fichier Word déjà formaté dont les checkbox se remplissent en fonction des valeurs que j'ai stocké dans configurateur excel.
A titre d'exemple, si j'ai demandé dans mon configurateur Excel que ma voiture soit rouge, alors la checkbox "Voiture Rouge" de mon fichier Word va se cocher à l'ouverture du fichier Word.

Le problème que j'ai avec tout ça c'est que pour ouvrir un fichier Word depuis Excel, j'utilise une bibliothèque d'objets, càd que pour ouvrir mon word je déclare
VB:
Public AppWd As Word.Application
et j'utilise ensuite cette variable pour faire le lien entre le fichier Excel et le Word.

Le souci, c'est que ces fichiers sont voués à être diffusés à mes clients, qui n'ont pas forcément la même version de Office que moi (j'utilise personnellement 365), et donc ça pose problème quand qqun qui a une version de bibliothèque antérieure essaye d'exécuter la macro.
J'ai fait un essai, le compilateur dit que la bibliothèque d'objets suivante est manquante : "Microsoft Word 16.0 Object Library", ce qui est tout à fait normal. MAIS en réalité, l'utilisation de la déclaration de variable précédente est possible depuis plusieurs versions (je veux dire, si j'avais codé mon bazar sur Office 2013, la bibliothèque de références sélectionnée aurait été "Microsoft Word 15.0 Object Library" par ex, mais ça aurait également fonctionné a priori).
Sauf que dans mon cas, lorsque j'envoie mon fichier à une version antérieure, le code ne compile pas car la bibliothèque d'objets que j'ai utilisé est plus récente que celle présente sur l'autre ordinateur.

J'ai donc besoin de votre aide pour ceci : Est-ce qu'on peut via un code VBA appeler la version de la bibliothèque d'objets présente sur l'ordinateur sur lequel le code est exécuter, et adapter ainsi la bibliothèque appelée par le code ?
- Deuxièmement : En réalité, je ne vois pas dans mon code ce qui fait référence directement à la version 16.0 de la bibliothèque. Je veux dire, tout ce que j'utilise existait déjà dans la bibliothèque 15.0, alors pourquoi le code appelle-t'il absolument la bibliothèque 16.0, même sur un autre ordinateur qui ne l'a pas, alors que je n'appelle a priori pas explicitement la bibliothèque 16.0 dans mon code.

Un grand merci par avance pour votre aide, j'espère avoir été clair !

Ci dessous le code qui pose problème, dans lequel je déclare la variable AppWd qui fait donc appel à la Bibliothèque Microsoft Word xx.0 Object Library.
Code:
Public AppWd As Word.Application

Sub Bouton19_Cliquer()
    Dim n As Integer
    'Select machine following number in B1 cell in the Memory sheet
    n = Range("Memory!B1")
    Select Case n
        Case "1"
            ThisWorkbook.FollowHyperlink ThisWorkbook.Path & "\FlexRouter CFG v1.02.docm"
        Case "2"
            Dim x As Integer
            Dim text1, y As String
            
        'Check if the Word document is opened or not (if opened, close it, otherwise user will receive an error message)
            If IsFileOpen(ThisWorkbook.Path & "\Bosch_FlexRouter.docm") Then
                AppWd.Documents("Bosch_FlexRouter.docm").Close SaveChanges:=False
                AppWd.Quit
            End If
        'Open Bosch FlexRouter word file
            Set AppWd = CreateObject("Word.Application")
            AppWd.Visible = True
            AppWd.Documents.Open ThisWorkbook.Path & "\Bosch_FlexRouter.docm"
        'Initialize
            x = 0
        'Loop on 110 values (in order to loop on every checkbox)
            For a = 1 To 110
                With AppWd.ActiveDocument.Shapes(a).OLEFormat
                    .Activate
        'Get name of the Checkbox : Checkbox names starting with BC or CB are the ones linked to the Excel values
                    Nom = .Object.Name
                    y = Left(Nom, 2)
        'If the checkbox is linked with the Excel value, then get the line it is associated to -> the 1 or 2 last numbers of the name
                    If y = "CB" Or y = "BC" Then
                        If Len(Nom) = 3 Then
                            x = Right(Nom, 1)
                        Else
                            If Len(Nom) = 4 Then
                                x = Right(Nom, 2)
                            Else
                                x = 100
                            End If
                        End If
        'Once we have the line, reach it and get its value. Then give the checkbox this value
                        text1 = Range("Memory!J" & x)
                        If text1 = "True" Then
                            .Object.Value = True
                        Else
                            .Object.Value = False
                        End If
                    End If
                End With
            Next a
        Case "3"
    End Select
    
End Sub
Function IsFileOpen(filename As String)
    Dim filenum As Integer, errnum As Integer

    On Error Resume Next   ' Turn error checking off.
    filenum = FreeFile()   ' Get a free file number.
    ' Attempt to open the file and lock it.
    Open filename For Input Lock Read As #filenum
    Close filenum          ' Close the file.
    errnum = Err           ' Save the error number that occurred.
    On Error GoTo 0        ' Turn error checking back on.

    ' Check to see which error occurred.
    Select Case errnum

        ' No error occurred.
        ' File is NOT already open by another user.
        Case 0
         IsFileOpen = False

        ' Error number for "Permission Denied."
        ' File is already opened by another user.
        Case 70
            IsFileOpen = True

        ' Another error occurred.
        Case Else
            Error errnum
    End Select

End Function
 

Hasco

XLDnaute Barbatruc
Repose en paix
Bonjour,

Utilsez uniquement des références au bibliothèques office que lors de la phase de dévellopement. Et ensuite (ou même directement si vous connaissez bien les objets de la bibliothèque en question) utiliser la liaison tardive (ou 'late binding') grâce à CreateObject.
VB:
Public AppWd As Object

Sub TrucMachin()
    Set AppWd = CreateObject("Word.Application")
End sub

Par contre et c'est valable pour une méthode ou l'autre, faire attention à n'employer que des méthodes et propriétés compatibles avec toutes les versions visées, et croiser les doigts....

Sans parler des clients qui n'auront même pas Office ou word ou excel. Mais openOffice ou autre suite bureautique.

Bon courage
 

xUpsilon

XLDnaute Accro
Bonjour,

Je vais essayer ça, merci !
A priori pas de problème dans mon bout de programme, les clients doivent avoir des versions suffisamment récentes pour accepter les checkbox ActiveX sur Word je pense (enfin j'espère).
Au pire je mettrai une gestion d'erreur qui renvoie un message du type "Impossible avec cette version de Office" si la bibliothèque du client est trop ancienne.
 

Discussions similaires

Statistiques des forums

Discussions
311 711
Messages
2 081 799
Membres
101 818
dernier inscrit
tiftouf5757