VBA Assigner une instance EDMVAULT5 avec la technique du "Late Binding"

Bonjour,

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.

En vous remerciant

Je suis dans le même cas !!! Une solution de trouvé depuis ? 

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.

1 « J'aime »

Merci de ta réponse ! Jai finalement réussi via le VBA :) 

@yves-marie.freyssinet 

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.

1 « J'aime »

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 :) 

1 « J'aime »

Pardon pour la méprise mais ce genre de réponse est tellement récurrent sur le net...

Bravo pour la macro et Merci pour le partage ;)

1 « J'aime »

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 !

1 « J'aime »

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 :) 

Au plaisir de partager d'autres astuces ! 

Ah en ouvrant les yeux je comprends mieux pourquoi ça marche chez toi et pas chez moi !

Tu fais appel à la méthode :

Vault.GetFolderFromPath()

 

qui ne m'a jamais posé problème soit dit en passant, mais dans mon cas, je fais appel à la méthode :

Vault.GetFileFromPath()

 

Et là ça ne marche pas. Mon problème reste donc entier.

Ci-après mon exemple minimal :

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() ?


1659427953.screenshot.png

Bonjour,

Manque un argument:

Set eFile = eVault.GetFileFromPath(sFichier, eFolder)

 

Bonjour,

il est pas sensé être facultatif ?

 

EDIT : par acquis de conscience, j'ai testé comme tu l'as indiqué, même erreur !

Il ne me semble pas, sinon mettre 0

Bonjour,

Pas le problème chez moi avec l'argument eFolder, sinon même erreur en ayant juste sFichier

Et si tu essaye en utilisant l'instruction suivante au lieu du "Set eFile = eVault.GetFileFromPath(sFichier)" ?

Dim efolder As Object
Dim sFichier As Object

Set eFile = efolder.GetFile(sFichier)

Cela fonctionne ou pas ?

La page de la doc : GetFileFromPath Method (IEdmVault5)

Il est facultatif, et j'avais aussi essayé avec 0.

Merci pour ta réponse mais… bigre ! Je suis en train de me demander si il faudrait jeter un œil dans l'enregistrement des dll avec regsrv32.

Je pense à ça parce que j'ai essayé de créer directement un objet EdmFile :

Set eFile = CreateObject("ConisioLib.EdmFile")

et que j'obtiens une erreur d'exécution 429 : un composant activeX ne peut pas créer d'objet.

1 « J'aime »

J'avoue que la ça dépasse peut-être un peu mes compétences ahaha mais je reste dispo si tu arrives à te débloquer ou avancer :)