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.
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 :)
Przepraszam za pomyłkę, ale tego rodzaju odpowiedzi są tak często w sieci...
Brawo za makro i dzięki za udostępnienie ;)
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!
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?
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.
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 :)
Cóż, mój minimalny przykład wpadł w grę!
Tak więc drugi argument nie jest opcjonalny .
Set eFile = eVault.GetFileFromPath(sFichier, eFolder)
Jedyną inną manipulacją, którą wykonałem, było
regsrv32 "C:\Program Files\SOLIDWORKS Corp\SOLIDWORKS PDM\EdmInterface.dll"
co mogło przywrócić porządek w rekordzie DLL. EdmInterface.dll koniecznie został załadowany, w przeciwnym razie miałbym wiele innych wiadomości... Dopiero się okaże, jak zachowa się w zadaniu ePDM!
Nie lubię kończyć bez zrozumienia wszystkiego, ale hej BARDZO DZIĘKUJĘ za pomoc!
Być może dokumentacja API PDM jest również fałszywa. Nawet bez wykonywania "Late Binding" zawsze umieszczam argument po ścieżce do pliku pamięci.
Duplikat, nie mogę usunąć
Myślę, że dokumentacja pokazuje intencje programistów, ale implementacja w funkcji jest błędna.
Drugi argument jest przekazywany do funkcji przez odwołanie, co pozwala jej uzyskać do niego dostęp przez zapis. Żeby było jasne, ten argument nie określa katalogu, w którym należy szukać pliku. Po prostu pozwala odzyskać obiekt katalogu, w którym znaleziono plik. Ale gdy szukamy pliku po jego ścieżce, znamy już katalog nadrzędny. Ten drugi argument absolutnie nie jest istotny. Być może w niektórych przypadkach uda nam się zdobyć kilka linijek kodu.
Z drugiej strony należy zachować ostrożność, jeśli plik nie istnieje, funkcja umieści Null w drugim argumencie. W moim minimalnym przykładzie getFileFromPath może opróżnić eFolder, przypisując go do Null, i zawiesić resztę. Cóż, to był tylko przykład.