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
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.
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
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