VBA Wijs een EDMVAULT5 instantie toe met de techniek "Late binding"

Hallo

in de VBA-editor, wanneer u de vakjes in de referentiemanager aanvinkt, doet u "vroege binding". Dit betekent dat VBA tijdens het compileren de referenties scant en alle soorten objecten kent. Dit maakt het mogelijk om te schrijven:

Dim eVault as EdmVault5 : Set eVault = New EdmVault5

 

Het nadeel van deze methode is dat deze niet draagbaar is. In VBA wordt vaak aanbevolen om aan "late binding" te doen. Het wordt aanbevolen om te schrijven:

Dim eVault as Object: Set eVault = CreateObject("ConisioLib.EdmVault")

 

Waar ik problemen mee heb, is dat ik een EdmVault21-object krijg, "puur", dat niet erft van de andere versies van EdmVault, met name EdmVault 5 en zijn GetFileFromPath() methode. En ik weet niet hoe ik moet "casten" in vba.

Vandaar mijn vraag, hoe maak ik een edmVault5 object in late binding?

Ik wil erop wijzen dat als ik laat bind, dat komt omdat vroeg binden in mijn geval niet werkt. Ik schrijf geen macro, maar code voor een ePDM-taak. Deze zeer speciale taak doet dingen die een externe verbinding met CAD hebben, maar ik moet het resulterende bestand in de kluis invoegen.

Bedankt

Ik zit in dezelfde situatie!! Is er sindsdien een oplossing gevonden? 

Hallo
Van mijn kant heb ik mijn code geport naar een uitvoerbaar bestand in vb.net. De vba-macro van de taak bereidt de opdrachtregel voor en roept dit uitvoerbaar aan. Geen problemen meer met aangifte en verwijzing.

1 like

Dank u voor uw antwoord! Dat is me uiteindelijk gelukt via de VBA-:) 

@yves-marie.freyssinet 

OK... Maar als je, in plaats van alleen de gemeenschap te beschimpen, je oplossing met hen zou kunnen delen om hen te helpen zoals zij jou helpen, zou het genereus van je zijn.

1 like

Ik daag niemand uit! Ik was nog niet klaar met mijn macro .... Maar alles is goed en functioneel:)  Dus ik ben blij om te delen wat ik heb gevonden en ik hoop dat de tijd die ik heb besteed aan het zoeken zal nuttig zijn voor anderen!  

Hier is de macro die ik heb weten te maken door late blindering uit te voeren, zoals Binoyte uitlegt, het wordt gebruikt om een bestand uit te pakken via het PDM-script: 

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

**Vergeet niet de 'NOM_COFFRE_PDM' te vervangen door de naam van je pdm-kluis:) 

1 like

Sorry voor de fout, maar dit soort antwoorden is zo terugkerend op het net...

Bravo voor de macro en bedankt voor het delen;)

1 like

Bedankt. Dus  wat zorgt ervoor dat het werkt?

Je wordt lastiggevallen met de behandeling van je paden. U moet de bibliotheek Scripting.FileSystemObject gebruiken

' Chargement de l'objet Système de Fichiers 
Dim oFS As Object
Set oFS = CreateObject("Scripting.FileSystemObject")

sInputFile = "<Filepath>"

Zoek in de objectverkenner naar andere methoden in deze bibliotheek en de bovenliggende bibliotheek, Scripting, in het algemeen. Het is best praktisch!

1 like

Van wat ik las en kon vinden als info, heb ik ooit het volgende object gemaakt: 

Dim Vault As Object
Set Vault = CreateObject("ConisioLib.EdmVault")

declareer bijvoorbeeld  gewoon "Map als object" in plaats van "Map als IEdmFolder5" en het werkt, hetzelfde geldt voor andere instructies van hetzelfde type:) 

Heel erg bedankt voor de info over de verwerking van bestandspaden, ik zal er eens goed naar kijken!! Ik ben nog geen expert op het gebied van VBA-macro ahah en ik ben blij dat ik wat advies heb:) 

Ik kijk ernaar uit om meer tips te delen! 

Ah, als ik mijn ogen open, begrijp ik beter waarom het voor jou werkt en niet voor mij!

Je gebruikt de werkwijze:

Vault.GetFolderFromPath()

 

wat voor mij overigens nooit een probleem is geweest, maar in mijn geval gebruik ik de methode:

Vault.GetFileFromPath()

 

En daar werkt het niet. Dus mijn probleem blijft.

Hier is mijn minimale voorbeeld:

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

 

Ik krijg runtime-fout 13: type komt niet overeen voor rij:

Set eFile = eVault.GetFileFromPath(sFichier)

 

Het gieten lijkt echter automatisch te gebeuren. Als we naar het VBA-spionagevenster kijken (zie bijgevoegde schermafbeelding),  kunnen we IEdmVault5-objecten zien. Ook is de methode  eVault.LoginAuto() afhankelijk van de IEdmVault5.

Dus waarom zit het vast op eVault.GetFileFromPath()?


1659427953.screenshot.png

Hallo

Eén argument ontbreekt:

Set eFile = eVault.GetFileFromPath(sFichier, eFolder)

 

Hallo

Is het niet de bedoeling dat het optioneel is?

 

EDIT: uit geweten, ik heb getest zoals je aangaf, dezelfde fout!

Het lijkt mij niet, behalve om 0 te zetten

Hallo

Geen probleem met mij met de eFolder argument, anders dezelfde fout door alleen sFile

Wat moet u doen als u de volgende instructie probeert te gebruiken in plaats van de "Set eFile = eVault.GetFileFromPath(sFile)"?

Dim efolder As Object
Dim sFichier As Object

Set eFile = efolder.GetFile(sFichier)

Werkt het of niet?

De doc-pagina: GetFileFromPath-methode (IEdmVault5)

Het is optioneel, en ik had het ook met 0 geprobeerd.

Bedankt voor je antwoord, maar ... verdomme! Ik vraag me af of ik een kijkje moet nemen naar de dll-opname met regsrv32.

Ik denk hieraan omdat ik heb geprobeerd om direct een EdmFile object te maken:

Set eFile = CreateObject("ConisioLib.EdmFile")

en ik krijg een runtime-fout 429: een activeX-component kan geen object maken.

1 like

Ik geef toe dat dit misschien een beetje buiten mijn vaardigheden ligt, ahaha, maar ik ben nog steeds beschikbaar als het je lukt om te deblokkeren of vooruit te gaan:)