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.
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.
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.
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:)
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!
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:)
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()?
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:)