| |
| Gut zu wissen: Hilfreiche Tipps und Tricks aus der Praxis prägnant, und auf den Punkt gebracht für SOLIDWORKS |
| |
| Innovationstag mit SolidCAM und Plogmann bei HEDELIUS in Meppen |
Autor
|
Thema: VBA Dateien Auswählen (2030 mal gelesen)
|
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 28. Jun. 2018 15:02 <-- editieren / zitieren --> Unities abgeben:
Hallo, Ich habe ein Programm zum ändern der Benutzerdefinierten Eigenschaften geschrieben (Zurzeit geht das aber nur mit der aktuell geöffneten Datei). Nun möchte ich mehrere Dateien Auswählen können mit einem Dateiexplorer für .sldprt und .sldasm Dateien. Wie muss der Code lauten für den Button "Dateien auswählen"? Ich werden die einzelnen Pfade dann in ein Array schreiben. Wie ich dann die Eigenschaften der anderen nicht geöffneten Dateien ändere ohne Sie mit SOlidWorks zu öffnen muss ich dann spatter klären. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 29. Jun. 2018 07:03 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
Hallo Fabian, auf die schnelle habe ich in der API hilfe jetzt nur die Methode für die Einzelauswahl gefunden "GetOpenFileName Method (ISldWorks)". Alternativ kannst du auch mal nach BrowseForFolder googlen. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1366 Registriert: 20.12.2003
|
erstellt am: 29. Jun. 2018 12:57 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
Hallo Fabian, Zitat: Original erstellt von fabian1243: ... Wie ich dann die Eigenschaften der anderen nicht geöffneten Dateien ändere ohne Sie mit SOlidWorks zu öffnen muss ich dann spatter klären.
schau dir hierzu mal die DocumentManager API an. Wenn es nur um benutzerdefinierte Eigenschaften geht, dann brauchst du das nicht unbedingt mit SWX machen ------------------ ========== Gruß Andreas ========== Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 04. Jul. 2018 06:49 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
Hallo Fabian, anbei was ich aus ein paar Code-Schnipsel zusammengebastelt habe Option Explicit
Public Declare PtrSafe Function GetOpenFileName Lib "comdlg32.dll" Alias "GetOpenFileNameA" (pOpenfilename As OPENFILENAME) As Long Public Const OFN_ALLOWMULTISELECT As Long = &H200 Public Const OFN_CREATEPROMPT As Long = &H2000 Public Const OFN_ENABLEHOOK As Long = &H20 Public Const OFN_ENABLETEMPLATE As Long = &H40 Public Const OFN_ENABLETEMPLATEHANDLE As Long = &H80 Public Const OFN_EXPLORER As Long = &H80000 Public Const OFN_EXTENSIONDIFFERENT As Long = &H400 Public Const OFN_FILEMUSTEXIST As Long = &H1000 Public Const OFN_HIDEREADONLY As Long = &H4 Public Const OFN_LONGNAMES As Long = &H200000 Public Const OFN_NOCHANGEDIR As Long = &H8 Public Const OFN_NODEREFERENCELINKS As Long = &H100000 Public Const OFN_NOLONGNAMES As Long = &H40000 Public Const OFN_NONETWORKBUTTON As Long = &H20000 Public Const OFN_NOREADONLYRETURN As Long = &H8000& '*see comments Public Const OFN_NOTESTFILECREATE As Long = &H10000 Public Const OFN_NOVALIDATE As Long = &H100 Public Const OFN_OVERWRITEPROMPT As Long = &H2 Public Const OFN_PATHMUSTEXIST As Long = &H800 Public Const OFN_READONLY As Long = &H1 Public Const OFN_SHAREAWARE As Long = &H4000 Public Const OFN_SHAREFALLTHROUGH As Long = 2 Public Const OFN_SHAREWARN As Long = 0 Public Const OFN_SHARENOWARN As Long = 1 Public Const OFN_SHOWHELP As Long = &H10 Public Const OFN_ENABLESIZING As Long = &H800000 Public Const OFS_MAXPATHNAME As Long = 260 Public Type OPENFILENAME lStructSize As Long hwndOwner As LongPtr hInstance As LongPtr lpstrFilter As String lpstrCustomFilter As String nMaxCustFilter As Long nFilterIndex As Long lpstrFile As String nMaxFile As Long lpstrFileTitle As String nMaxFileTitle As Long lpstrInitialDir As String lpstrTitle As String flags As Long nFileOffset As Integer nFileExtension As Integer lpstrDefExt As String lCustData As Long lpfnHook As LongPtr lpTemplateName As String End Type 'OFS_FILE_OPEN_FLAGS: Public Const OFS_FILE_OPEN_FLAGS = OFN_EXPLORER Or _ OFN_LONGNAMES Or _ OFN_CREATEPROMPT Or _ OFN_NODEREFERENCELINKS 'windows version constants Private Const VER_PLATFORM_WIN32_NT As Long = 2 Private Const OSV_LENGTH As Long = 76 Private Const OSVEX_LENGTH As Long = 88 Public OSV_VERSION_LENGTH As Long
Public Const WM_INITDIALOG As Long = &H110 Private Const SW_SHOWNORMAL As Long = 1 Public Function BrowseForFile(strTitle As String, myFilter As String, Optional initialDir As String = "") As String() Dim OpenFile As OPENFILENAME Dim lReturn As Long Dim mySplit() As String Dim temp() As String Dim i As Integer OpenFile.lpstrFilter = myFilter OpenFile.nFilterIndex = 1 OpenFile.hwndOwner = 0 OpenFile.lpstrFile = String(257, 0) #If VBA7 Then OpenFile.nMaxFile = LenB(OpenFile.lpstrFile) - 1 OpenFile.lStructSize = LenB(OpenFile) #Else OpenFile.nMaxFile = Len(OpenFile.lpstrFile) - 1 OpenFile.lStructSize = Len(OpenFile) #End If OpenFile.lpstrFileTitle = OpenFile.lpstrFile OpenFile.nMaxFileTitle = OpenFile.nMaxFile If initialDir <> "" Then OpenFile.lpstrInitialDir = initialDir OpenFile.lpstrTitle = strTitle ''''''''''''''''''''''''''''''''''''''' 'This next bit allows for multi-select: ''''''''''''''''''''''''''''''''''''''' OpenFile.flags = OFS_FILE_OPEN_FLAGS + OFN_ALLOWMULTISELECT lReturn = GetOpenFileName(OpenFile) If lReturn = 0 Then BrowseForFile = temp Else mySplit = Split(OpenFile.lpstrFile, vbNullChar) i = 1 While mySplit(i) <> "" If i = 1 Then ReDim temp(0) Else ReDim Preserve temp(i - 1) temp(i - 1) = mySplit(0) & "\" & mySplit(i) i = i + 1 Wend BrowseForFile = temp Exit Function End If End Function
Function IsArrayAllocated(Arr As Variant) As Boolean On Error Resume Next IsArrayAllocated = IsArray(Arr) And _ Not IsError(LBound(Arr, 1)) And _ LBound(Arr, 1) <= UBound(Arr, 1) End Function
Sub main() Dim filelist As Variant Dim str As String Dim i As Integer filelist = BrowseForFile("Datei Wählen", "SoldiWorks Dateien (*.slddrw;*sldprt;*sldasm)" & vbNullChar & "*.slddrw;*sldprt;*sldasm" & vbNullChar & vbNullChar, "C:\") str = "" If IsArrayAllocated(filelist) Then For i = 0 To UBound(filelist) str = str + filelist(i) & Chr(10) Next i MsgBox str, vbOKOnly, "Gewählte Dateien" End If End Sub ------------------ Grüße Heinz Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 08:28 <-- editieren / zitieren --> Unities abgeben:
Hallo, Den Code den du verwendet hast habe ich schon mal gesehen und eingebaut dann hatte ich das Problem bei der Definition von "OpenFile.lpstrFile = String(257, 0)", diese definition wurde als Fehler ausgegeben. Wie kann ich das ausbessern? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 08:52 <-- editieren / zitieren --> Unities abgeben:
|
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 04. Jul. 2018 09:08 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
|
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 09:21 <-- editieren / zitieren --> Unities abgeben:
So müsste jetzt drinstehen, ich schreibs hier nochmal sicherheitshalber: -SW Premium 2017 x64-Edition SP3.0 -Win 10 Pro v1803 Im Anhang noch die Verweise von VBA, kenn mich da jetzt nicht aus welche eingeschalten sein müssen, bzw was für was zuständig ist. Jetzt müsste ich nur noch verstehen (ohne kommentare immer bisschen schwierig :zwinker , wenn jetzt nur eine Datei ausgewählt worden ist wo steht den die jetzt, steht die auch in "filelist" und filelist ist ein array also könnte ich bei der auswahl von 3 dateien filelist(1) bis filelist(3) verwenden? und bei einer filelist(1)? Danke für die Hilfe! EDIT, hab eine Abfrage hinzugefügt ob der zweite Eintrag leer ist, dann wird nur der erste pfad übermittelt: If lReturn = 0 Then BrowseForFile = temp Else mySplit = Split(OpenFile.lpstrFile, vbNullChar) If mySplit(1) <> "" Then i = 1 While mySplit(i) <> "" If i = 1 Then ReDim temp(0) Else ReDim Preserve temp(i - 1) End If temp(i - 1) = mySplit(0) & "\" & mySplit(i) i = i + 1 Wend BrowseForFile = temp Else BrowseForFile = mySplit End If End If [Diese Nachricht wurde von fabian1243 am 04. Jul. 2018 editiert.] Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 13:45 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von ad_man: Hallo Fabian,schau dir hierzu mal die DocumentManager API an. Wenn es nur um benutzerdefinierte Eigenschaften geht, dann brauchst du das nicht unbedingt mit SWX machen
Kannst du mir hierzu evtl was weiterleiten? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
ad_man Mitglied freiberuflicher Entwicklungsing. (Fahrzeugtechnik, CSWP, CPPA))
Beiträge: 1366 Registriert: 20.12.2003
|
erstellt am: 04. Jul. 2018 14:20 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
|
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 04. Jul. 2018 14:51 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
|
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 17:45 <-- editieren / zitieren --> Unities abgeben:
Ja, komm solangsam weiter, was mir aufgefallen ist dass die VerknüpfungsDateien als normale Dateien einzulesen gehen. Das ist nicht Sinn und Zweck, hab provisorisch eine Fehlermeldung eingebaut dass diese nicht in die Liste aufgenommen werden können. Wisst Ihr zufällig wie man in die Funktion einbauen kann, dass die Verknüpufung ganz normal zu einem Pfad weiterleitet und nicht als Datei ausgewählt wird? Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 04. Jul. 2018 18:53 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
|
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 04. Jul. 2018 19:03 <-- editieren / zitieren --> Unities abgeben:
|
nahe Ehrenmitglied
Beiträge: 1747 Registriert: 18.01.2001 arbeite mit: Dell Precision 7750 i7 2,6 GHz 6 Kerne 32GB RAM 512GB SSD NVIDIA Quadro RTX 4000 ------------------------ SWX-2020 SP5.0 EPDM ---------------- Windows 10 ---------------- VB.net VB VBA ein wenig Swift am Mac
|
erstellt am: 05. Jul. 2018 07:26 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
|
HenryV Mitglied Konstrukteur, Engineering
Beiträge: 813 Registriert: 18.05.2005 SolidWorks 2022 x64 SP5.0 Dell Precision 5820 Intel Xeon W-2125 4x4GHz NVIDIA Quadro P2000 5GB 32GB RAM 2x Dell U2412M, 24" TFT Windows 10 Enterprise x64 22H2 Microsoft 365 E5 Microsoft Visual Studio Enterprise 2022
|
erstellt am: 05. Jul. 2018 09:04 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
Hallo Fabian Mit folgender Funktion bekommst du den Zielpfad der lnk-Datei.
Code: Function Getlnkpath(ByVal Lnk As String) On Error Resume Next With CreateObject("Wscript.Shell").CreateShortcut(Lnk) Getlnkpath = .TargetPath .Close End With End Function
Gruss Andreas ------------------ 21 ist nur die halbe Antwort. Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
fabian1243 Mitglied Maschinen-Konstrukteur
Beiträge: 44 Registriert: 28.06.2018 SW 2021 Win 10 Pro v1909
|
erstellt am: 11. Jul. 2018 17:38 <-- editieren / zitieren --> Unities abgeben:
Zitat: Original erstellt von HenryV: Hallo FabianMit folgender Funktion bekommst du den Zielpfad der lnk-Datei.
Code: Function Getlnkpath(ByVal Lnk As String) On Error Resume Next With CreateObject("Wscript.Shell").CreateShortcut(Lnk) Getlnkpath = .TargetPath .Close End With End Function
Hallo, und wie baue ich den Code ein? Also laut dir übergibt man der Funktion den Pfad? Und dann wird was gemacht? Er soll bei einer Verknüpfung einfach in den Ordner springen auf den die Verknüpfung zeigt, macht das diese Funktion? Gruss Andreas
Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |
bk.sc Ehrenmitglied V.I.P. h.c. Konstrukteur Sondermaschinenbau
Beiträge: 2776 Registriert: 18.07.2012 -Solid Works 2019 SP5 -Pro Engineer WF 3
|
erstellt am: 12. Jul. 2018 07:46 <-- editieren / zitieren --> Unities abgeben: Nur für fabian1243
Hallo Fabian, die Funktion gibt dir wie beschrieben nur den Pfad der in der Verknüpfung steht als Rückgabewert, diesen Pfad musst du dann schon entsprechend weiter verwenden. Also brauchst du wahrscheinlich eine Fallunterscheidung, wenn Datei eine Verknüpfung ist, springe in den Pfad und mache das selbe was du im anderen Pfad gemacht hast, hier musst du dir wahrscheinlich nur irgendwo Merken wo er her kommt um auch dahin wieder zurück zu kommen falls er nach dem abarbeiten des Verknüpften Ordners wieder an der Stelle im Ursprungsordner weiter machen soll. Gruß Bernd ------------------ --- Man muß nicht alles wissen, man muß nur wissen wo es steht --- Staatlich anerkannte Deutschniete Eine Antwort auf diesen Beitrag verfassen (mit Zitat/Zitat des Beitrags) IP |