Ik geloof dat dit een beperking is van de SW API in VBA. Want als je in de help kijkt voor geen documentatie in VBA: http://help.solidworks.com/SearchEx.aspx?q=EdmVault5&sort=&version=2017&lang=english&prod=api
Hallo, als de API's bestaan in .net, denk ik dat ze ook bestaan in vba.
Om je te helpen, kun je de code die je hebt gekregen kopiëren naar een C# VB.net-converter. Je kunt er verschillende vinden op internet. Aangezien Vba is ontleend aan vb.net, zal de code dichtbij genoeg zijn om te begrijpen.
Vanuit het geheugen is er een dll die moet worden geladen om toegang te krijgen tot de pdm-objecten.
Een converter is niet nodig, er zijn veel voorbeelden in vb.net. Hier zijn verschillende links: http://help.solidworks.com/2017/english/api/epdmapi/Traverse_Folders_and_Files_in_Vault_Example_VBNET.htm
Omdat ik op 2 projecten tegelijk ben, heb ik nog geen tests kunnen uitvoeren, maar dat zou ik vandaag wel moeten kunnen, aan de andere kant heb ik enkele vragen naar aanleiding van uw antwoorden:
- Voor de ddl geladen, ik weet niet hoe ik het moet doen... Is het een bestand om te downloaden? Een bestand om alleen aan mijn onderdelen te koppelen? - In de codes die ik kon doorlopen zoals die van d.roger merkte ik dat er een LoginAuto-functie was, hoe werkt het? Omdat ik via dit venster verbinding moet maken met EPDM:
Is deze functie in strijd met mijn gebruikelijke inlogmethode? Misschien interpreteer ik de term "Auto" verkeerd.
Omdat ik idealiter zou willen dat er bij het starten van de macro een verbindingscontrole is naar EPDM (dankzij het venster hierboven) en zo ja, laad dan de documenten in de cache wanneer dat nodig is.
Maar voordat ik ingaan op de code, zou het niet gemakkelijker zijn om de EPDM-instellingen te wijzigen, zoals "Cache wissen bij uitloggen" of iets dergelijks in de bijlage.
Voor de verbinding zal het niet conflicteren. LoginAuto maakt gebruik van lokale verbindingsparameters, dus als login/mdp wordt gevraagd bij het inloggen, wordt het venster weergegeven.
Als het gaat om het wissen van de cache wanneer je uitlogt, moet je echt de voor- en nadelen afwegen. Dit heeft een impact op de uitgepakte bestanden (de assemblages, vooral als mijn geheugen correct is) en kan het verlies van werk genereren. Het hangt allemaal af van uw archiveringsregels en de nauwkeurigheid van uw gebruikers.
Voor de rest zijn er inderdaad geen voorbeelden meer in vba (op de 2009 waren die er wel) maar van VB.NET kun je je weg vinden. Er zijn echter nog steeds functies gereserveerd voor C# en VB.NET.
Om de DLL te laden is dit nodig voor programma's in C#. In VBA hoeft u alleen maar te verwijzen naar "PDMWorks Enterprise 20xx Type Library" in uw macro, zie de bijgevoegde afbeelding.
Anders denk ik dat het interessanter is om te beginnen met het leren van een taal zoals VB.net of C# waarmee je veel meer dingen kunt doen, hetzij in de vorm van macro's, hetzij in de vorm van onafhankelijke programma's waarmee je gemakkelijk EPDM en/of SolidWorks kunt beheren, maar dat is slechts een persoonlijke mening. Er zijn uitstekende cursussen voor het leren van deze talen op verschillende sites, zoals https://openclassrooms.com/courses/apprenez-a-developper-en-c
Ik denk dat het nuttig voor je zal zijn. Bovendien is het erg interessant.
De VB.net lijkt meer op de VBA. Leren zal gemakkelijker zijn.
Persoonlijk gebruik ik de EDi Visual Studio in Community versie: https://www.visualstudio.com/fr/thank-you-downloading-visual-studio/?sku=Community&rel=15
Voor dit project ga ik proberen tevreden te zijn met de Vba omdat ik stage loop en helaas niet word aangenomen en de mensen die mijn programma gaan gebruiken nauwelijks de basis van Vba hebben...
Maar voor toekomstige toepassingen zal ik er meer bij stilstaan. Aan de andere kant heb ik een hele domme vraag, hoe is het beter dan de Vba? Meer mogelijkheden? Zijn het ook programma's die in een specifieke module van een software moeten worden gecodeerd of is deze onafhankelijk? (Gewoon kleine vragen om een idee te krijgen voordat ik begin met leren)
De Vb.net lijkt inderdaad veel meer op VBA en is daarom gemakkelijker te leren, C# is veel minder "langdradig", het is een kwestie van smaak.
Voor macro's in C# of VB.net in SW maak ik DLL's en als ik nieuwe knoppen in SW invoeg, gebruik ik deze DLL's, zie bijgevoegde afbeelding. Ik heb uiteindelijk een DLL gemaakt die alleen wordt gebruikt om een tekstbestand te lezen waarin ik het pad van mijn hoofduitvoerbare bestand heb geplaatst en vervolgens om dit uitvoerbare bestand te starten, kan ik veel meer flexibiliteit hebben in mijn programma's.
Voor mijn programma's gebruik ik de open source SharpDevelop IDE.
Hoe is het beter dan de Vba? Meer mogelijkheden? : Visual Basic for Applications (VBA) is een implementatie van Microsoft Visual Basic, VB.NET of C# zijn programmeertalen op zich. VEEL meer mogelijkheden.
Zijn het ook programma's die in een specifieke module van een software moeten worden gecodeerd of is deze onafhankelijk? Zelfstandig programmeren (het maken van uitvoerbare bestanden), met behulp van een IDE zoals Visual Studio Community of Sharpdevelop maakt het een stuk eenvoudiger.
Het ziet er inderdaad interessanter uit! Dus na mijn project heb ik besloten om verder te gaan met het leren van VB.net.
Maar wat betreft mijn probleem, ik heb de macro van d.roger geprobeerd en het begin lijkt te werken, want als ik op een keuze klik, heb ik het EPDM-verbindingsvenster dat wordt geopend.
Maar de volgende regel lijkt zijn werk niet te doen, tenzij het mijn probleem niet oplost:
'Active la seconde ComboBox lorsqu'un type est sélectionné dans la 1er liste
Private Sub CBox_etat_Click()
'Déclaration des varaibles nécessaires
Dim Part As SldWorks.ModelDoc2
Dim boolstatus As Boolean
Dim longstatus As Long
Dim longwarnings As Long
Dim swModel As ModelDoc2
Dim swDesignTable As DesignTable
Dim xlWS As Worksheet
Dim DebutDesignation As Range
Dim r As Range
Dim Vault As New EdmVault5
Dim File As IEdmFile5
Dim Folder As IEdmFolder5
Vault.LoginAuto "Nom_coffre", 0
If Info_general.CBox_type.Value = ("Pince W25") Then
'Ouverture du fichier correspond au besoin choisi dans la liste
'Chemin à changer lors du changement d'emplacement des fichiers EXEMPLE : Lors de l'insertion dans l'ePDM
If CBox_etat.Value = ("Pince finie") Then
Set File = Vault.GetFileFromPath("Chemin + nom de fichier", Folder)
Set Part = swApp.OpenDoc6("Chemin + nom de fichier", 1, 0, "", longstatus, longwarnings)
swApp.ActivateDoc2 "Nom fichier", False, longstatus
'Activation du modèle ouvert, nécessaire pour accéder à la famille de pièces
Set swModel = swApp.ActiveDoc
'Récupération de la famille de pièces
Set swDesignTable = swModel.GetDesignTable()
'Si récupération correcte de la famille de pièces
If Not swDesignTable Is Nothing Then...........................
Hier is een deel van mijn code en de fout "object niet ingesteld" verschijnt op de herstelregel van de onderdeelfamilie.
Ja ja d.roger maak je geen zorgen, ik heb het ^^ veranderd. Ik heb zojuist de namen verwijderd om op het forum te zetten ;).
Cyril.f Ik heb het geprobeerd, maar het werkt nog steeds niet.
Edit: Ik denk dat het een impact heeft, maar als ik mijn File, Part en swDesigntable = Niets varaibles stap voor stap, maar ik zie het probleem niet het werkt als ik de vorige versie handmatig laad.
Ik heb zojuist de regel ingevoegd die u mij hebt gewezen en de fout staat op deze regel, dezelfde fout.
Ja, mijn bestand opent goed in SW en mijn macro werkt wonderwel, zolang ik van tevoren op mijn bestand heb geklikt om "De nieuwste versie op te halen".
Dit bevestigt dat dit inderdaad de reden is voor de bug.
Edit: wat betreft het gebruik van GetDesignTable gebruik ik het zoals aangegeven.
Ik zie het niet. Ter informatie: ik heb geen bedieningsfout met de volgende macro:
Dim swApp als object
Deel dimmen als object Dim boolstatus als Booleaanse Dim longstatus As Long, longwarnings As Long
Sub hoofd()
Stel swApp = Toepassing.SldWorks in
Dim Vault als nieuwe EdmVault5
Bestand dimmen als IEdmFile5 Map dimmen als IEdmFolder5
Vault.LoginAuto "Coffre_BE", 0
Bestand instellen = Vault.GetFileFromPath("C:\Coffre_BE\TEST\0088880001.SLDPRT", map)
Set Part = swApp.OpenDoc6(Folder.LocalPath & "/" & File.Name, 1, 2, "", longstatus, longwarnings)
swApp.ActivateDoc2 File.Name, False, longstatus
Stel swModel = swApp.ActiveDoc in
swModel.ViewZoomtofit2
Einde Sub
Het enige bericht dat ik krijg is dat de Epdm me vraagt of ik het bestand wil uitpakken wanneer het is geladen, een normaal bericht omdat dat niet het geval is. Ter info: ik heb de GetFileCopy-regel niet nodig.