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 :)
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 ;)
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 :)
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.
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 :)
ben vlà que mon exemple minimal est tombé en marche !
Alors en effet le second argument n'est pas facultatif. Il faut bien écrire :
Set eFile = eVault.GetFileFromPath(sFichier, eFolder)
La seule autre manipulation que j'ai réalisée c'est un
regsrv32 "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS PDM\EdmInterface.dll"
qui a peut-être remis de l'ordre dans l'enregistrement des dll. EdmInterface.dll était forcément chargé sinon j'aurais eu bien d'autres messages… Reste à vérifier comment cela se comporte dans une tâche ePDM !
J'aime pas clore sans avoir tout compris, mais bon MERCI BEAUCOUP pour votre aide !
Peut-être la documentation des API PDM qui est fausse également. Même sans faire du "Late Binding" j'ai toujours mis un argument après le chemin du fichier de mémoire.
Doublon, je ne peux pas supprimer
Je pense que la documentation montre bien l'intention de développeurs mais que l'implémentation dans la fonction est fausse.
Le second argument est passé à la fonction par référence, cela lui permet d'y accéder en écriture. En clair cet argument ne précise pas à la fonction le répertoire dans lequel chercher le fichier. Il permet simplement de récupérer l'objet répertoire dans lequel le fichier a été trouvé. Or comme on cherche un fichier par son chemin, donc on connait déjà le répertoire parent. Ce second argument n'est absolument pas indispensable. Peut-être peut-on gagner quelques lignes de codes dans certains cas.
Par contre, attention si le fichier n'existe pas, la fonction mettra Null dans le second argument. Dans mon exemple minimal, getFileFromPath peut vider eFolder en l'assignant à Null, et faire planter la suite. Enfin, ce n'était qu'un exemple.