dans l'éditeur VBA, lorsque l'on coche les cases dans le gestionnaire de références, on fait du "early binding". Cela signifie qu'à la compilation, VBA scrute les références et connait tous les types d'objets. Ce qui permet d'écrire :
Dim eVault as EdmVault5 : Set eVault = New EdmVault5
L'inconvénient de cette méthode est qu'elle n'est pas portable. Il est souvent recommandé en VBA de faire du "late binding". On recommande en effet d'écrire :
Dim eVault as Object: Set eVault = CreateObject("ConisioLib.EdmVault")
Là où je rencontre des soucis, c'est que j'obtiens ainsi un objet EdmVault21, "pur", qui n'hérite pas des autres versions d'EdmVault, notamment la 5 et de sa méthode GetFileFromPath(). Et je ne sais pas "caster" en vba.
D'où ma question, comment créer un objet edmVault5 en late binding ?
Je précise que si je fais du late binding, c'est que le early binding ne fonctionne pas dans mon cas. Je n'écris pas une macro mais du code pour une tâche ePDM. Cette tâche, très particulière, fait des choses ayant un rapport lointain avec la CAO, mais j'ai besoin d'insérer le fichier résultant dans le coffre.
Salut, pour ma part, j'ai porté mon code sur un exécutable en vb.net. La macro vba de la tâche prépare la ligne de commande et appelle cet exécutable. Plus de problème de déclaration et de référence.
Ok... mais si au lieu de simplement narguer la communauté tu pouvais partager ta solution avec elle pour l'aider comme elle t'aide ce serait généreux de ta part. Merci.
Je ne nargue personne ! Je n'avais pas encore fini ma macro .... Mais la tout est bon et fonctionnel :) Je partage donc avec plaisir ce que j'ai trouvé et j'espère que le temps que j'ai passé à chercher sera profitable à d'autres !
Voici la macro que j'ai réussi à faire en faisant du late blinding comme binoyte l'explique, elle me sert à extraire un fichier via le script PDM :
Sub main()
Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")
Vault.LoginAuto "NOM_COFFRE_PDM", 0
modelPath = "<Filepath>"
If Vault.IsLoggedIn Then
Dim folder As Object
Dim folderPath As String
Dim FolderPath1 As String
folderPath = modelPath
j = InStrRev(folderPath, "\")
FolderPath1 = Left(folderPath, j)
Set folder = Vault.GetFolderFromPath(FolderPath1)
i = Len(modelPath)
j = InStrRev(modelPath, "\")
FileName = Right(modelPath, i - j)
Dim file As Object
Dim oNull As Object
Set file = folder.GetFile(FileName)
If file Is Nothing Then
MsgBox "File not found."
End If
file.LockFile folder.ID, 0
CheckOutFile = "Successful"
Else
Err.Raise vbError, "User is not logged in to the vault"
End If
End Sub
** Ne pas oublier de remplacer le 'NOM_COFFRE_PDM' par votre nom de coffre pdm :)
Merci. Donc du coup qu'est-ce qui fait que cela marche ?
Tu t'embêtes bien avec le traitement de tes chemins. Tu devrais utiliser la bibliothèque Scripting.FileSystemObject
' Chargement de l'objet Système de Fichiers
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
sInputFile = "<Filepath>"
sOutputFolder = oFS.GetParentFolderName(sInputFile )
Regarde dans l'explorateur d'objet les autres méthodes de cette bibliothèque et de sa parente, Scripting, en général. Elle est plutôt pratique !
De ce que j'ai lu et put trouver comme infos, une fois créer l'objet suivant :
Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")
il suffit de déclarer par exemple "Folder As Object" au lieu de "Folder As IEdmFolder5" et cela fonctionne, de même pour les autres instructions du même type :)
Merci beaucoup pour les infos concernant les traitements des chemins de fichier, je vais regarder ça de plus près !!! Je ne suis pas encore un expert en macro VBA ahah et je suis content d'avoir quelques conseils :)
Sub ajoutfich()
Dim eVault, eFile, eFolder As Object
Dim iStatus As Integer
Dim sFichier, sDestination, sSource As String
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")
sDestination = "D:\ePDM\…\dossier\"
sSource = "E:\FICHIER.EXT"
sFichier = oFS.buildpath(sDestination, oFS.GetFileName(sSource))
Set eVault = CreateObject("ConisioLib.EdmVault")
If Not eVault.IsLoggedIn Then
eVault.LoginAuto "MON_COFFRE_PDM", 0
End If
Set eFolder = eVault.GetFolderFromPath(sDestination)
Set eFile = eVault.GetFileFromPath(sFichier)
If Not eFile Is Nothing Then
'à complèter
End If
iStatus = eFolder.AddFile(0, sSource)
End Sub
J'obtiens une erreur d'exécution 13 : incompatibilité de type pour la ligne :
Set eFile = eVault.GetFileFromPath(sFichier)
Pourtant le cast semble se faire de façon automatique. Quand on observe la fenêtre d'espions de VBA (cf. capture jointe), on voit bien des objets IEdmVault5. De plus la méthode eVault.LoginAuto() dépend de la IEdmVault5.
Alors pourquoi ça coince sur eVault.GetFileFromPath() ?