VBA Przypisywanie instancji EDMVAULT5 za pomocą techniki "Late Binding" (późne wiązanie)

Witam

w edytorze VBA, gdy zaznaczysz pola w menedżerze odwołań, wykonasz "wczesne wiązanie". Oznacza to, że w czasie kompilacji VBA skanuje odwołania i zna wszystkie typy obiektów. Dzięki temu możliwe jest pisanie:

Dim eVault as EdmVault5 : Set eVault = New EdmVault5

 

Minusem tej metody jest to, że nie jest przenośna. W VBA często zaleca się wykonanie "późnego wiązania". Zaleca się napisać:

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

 

Problem polega na tym, że otrzymuję obiekt EdmVault21, "pure", który nie dziedziczy z innych wersji EdmVault, zwłaszcza z EdmVault 5 i jego metody GetFileFromPath(). I nie wiem, jak to "rzucać" w vba.

Stąd moje pytanie, jak utworzyć obiekt edmVault5 w późnym powiązaniu?

Chciałbym zwrócić uwagę, że jeśli robię późne wiązanie, to dlatego, że wczesne wiązanie nie działa w moim przypadku. Nie piszę makra, ale kod dla zadania ePDM. To bardzo specjalne zadanie wykonuje czynności, które mają zdalne połączenie z CAD, ale muszę wstawić wynikowy plik do repozytorium.

Dziękuję

Jestem w tej samej sytuacji!! Rozwiązanie znalezione od tamtego czasu? 

Witam
Ze swojej strony przeniosłem swój kod do pliku wykonywalnego w vb.net. Makro vba zadania przygotowuje wiersz polecenia i wywołuje ten plik wykonywalny. Koniec z problemami z deklaracją i odniesieniem.

1 polubienie

Dziękuję za odpowiedź! W końcu udało mi się przez VBA :) 

@yves-marie.freyssinet 

OK... Ale gdybyś zamiast po prostu drwić ze społeczności, mógł podzielić się z nimi swoim rozwiązaniem, aby pomóc im tak, jak oni pomagają tobie, byłoby to hojne z twojej strony.

1 polubienie

Z nikogo nie drwię! Nie skończyłem jeszcze makro.... Ale wszystko jest dobre i funkcjonalne:)  Cieszę się więc, że mogę podzielić się tym, co znalazłam i mam nadzieję, że czas spędzony na poszukiwaniach będzie korzystny dla innych!  

Oto makro, które udało mi się zrobić, wykonując późne zaślepienie, jak wyjaśnia binoyte, służy ono do wyodrębniania pliku za pomocą skryptu 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

**Nie zapomnij zamienić znaku "NOM_COFFRE_PDM" na nazwę skarbca pdm :) 

1 polubienie

Przepraszam za pomyłkę, ale tego rodzaju odpowiedzi są tak często w sieci...

Brawo za makro i dzięki za udostępnienie ;)

1 polubienie

Dziękuję. Więc  co sprawia, że to działa?

Niepokoi Cię leczenie swoich ścieżek. Należy użyć biblioteki Scripting.FileSystemObject

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

sInputFile = "<Filepath>"

Poszukaj w eksploratorze obiektów innych metod w tej bibliotece i ogólnie w jej rodzicu, Skrypty. To całkiem praktyczne!

1 polubienie

Z tego co wyczytałem i udało mi się znaleźć jako informacje, kiedyś stworzyłem następujący obiekt: 

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

wystarczy zadeklarować np  . "Folder As Object" zamiast "Folder As IEdmFolder5" i działa, tak samo dla innych instrukcji tego samego typu :) 

Bardzo dziękuję za informacje na temat przetwarzania ścieżek do plików, przyjrzę się im bliżej!! Nie jestem jeszcze ekspertem od makr VBA ahah i cieszę się, że mam jakieś rady :) 

Nie mogę się doczekać, aby podzielić się kolejnymi wskazówkami! 

Ach, kiedy otwieram oczy, lepiej rozumiem, dlaczego to działa dla ciebie, a nie dla mnie!

Używasz metody:

Vault.GetFolderFromPath()

 

co zresztą nigdy nie stanowiło dla mnie problemu, ale w moim przypadku używam metody:

Vault.GetFileFromPath()

 

A tam to nie działa. Więc mój problem pozostaje.

Oto mój minimalny przykład:

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

 

Otrzymuję błąd wykonania 13: niezgodność typu dla wiersza:

Set eFile = eVault.GetFileFromPath(sFichier)

 

Jednak odlewanie wydaje się być wykonywane automatycznie. Kiedy patrzymy na okno szpiegowskie VBA (patrz załączony zrzut ekranu),  możemy zobaczyć obiekty IEdmVault5. Ponadto metoda  eVault.LoginAuto() zależy od obiektu IEdmVault5.

Dlaczego więc utknął w eVault.GetFileFromPath()?


1659427953.screenshot.png

Witam

Brakuje jednego argumentu:

Set eFile = eVault.GetFileFromPath(sFichier, eFolder)

 

Witam

Czy to nie powinno być opcjonalne?

 

EDIT: z wyrzutów sumienia, przetestowałem tak jak wskazałeś, ten sam błąd!

Nie wydaje mi się, z wyjątkiem wstawienia 0

Witam

Nie ma problemu ze mną z argumentem eFolder, w przeciwnym razie ten sam błąd przez posiadanie tylko sFile

Co się stanie, jeśli spróbujesz użyć następującej instrukcji zamiast "Set eFile = eVault.GetFileFromPath(sFile)"?

Dim efolder As Object
Dim sFichier As Object

Set eFile = efolder.GetFile(sFichier)

Czy to działa, czy nie?

Strona dokumentu: Metoda GetFileFromPath (IEdmVault5)

Jest to opcjonalne i próbowałem również z 0.

Dziękuję za odpowiedź, ale... cholera! Zastanawiam się, czy powinienem rzucić okiem na nagranie dll z regsrv32.

Myślę o tym, ponieważ próbowałem utworzyć obiekt EdmFile bezpośrednio:

Set eFile = CreateObject("ConisioLib.EdmFile")

i otrzymuję błąd w czasie wykonywania 429: składnik activeX nie może utworzyć obiektu.

1 polubienie

Przyznam, że może to trochę przerastać moje umiejętności ahaha, ale nadal jestem dostępny, jeśli uda Ci się odblokować lub ruszyć do przodu :)