SW VBA-Dialogfeld Ordner auswählen

Hallo

aus Solidworks möchte ich über ein Dialogfeld einen Ordner auswählen

Hier ist das Excel-Makro, das funktioniert, aber nicht in Solidworks 64 Bit

Sub Dossier()
    
Set fDialog = Application.FileDialog(msoFileDialogFolderPicker)

fDialog.Title = "Selectionner dossier"
fDialog.InitialFileName = "C:\"
 
If fDialog.Show = -1 Then
Debug.Print fDialog.SelectedItems(1)
End If
End Sub

 

Es ist dieses Dialogfeld, das mich interessiert, nicht das, das vereinfacht ist

Wenn Sie eine Idee für einen Code haben, bin ich interessiert

Hallo;

Probieren Sie das Makro des Links (lynkoa) unten aus...
https://www.lynkoa.com/forum/solidworks/bo%C3%AEte-de-dialogue-ouvrir-macro-solidworks


Herzliche Grüße.

2 „Gefällt mir“

Hallo

Ich hatte diese Technik schon gesehen, hätte aber gerne eine

Vielleicht eine fehlende Referenz?

Schauen Sie sich dieses Thema an, wenn Sie die richtige Lösung gefunden haben:

https://r1132100503382-eu1-3dswym.3dexperience.3ds.com/#community:yUw32GbYTEqKdgY7-jbZPg/iquestion:QG0F7bLmQaOUb70yb4BJfw

Ich habe mehrere Makros ausprobiert, das von Christian Chu funktioniert, aber es öffnet nicht das gewünschte Dialogfeld, es ist die vereinfachte Version der Ordnerauswahl, die es für mich öffnet, die anderen Makros funktionieren nicht

Ein altes Makro stürzt Excel und SW ab

Private Type BrowseInfo
hWndOwner As Long
pIDLRoot As Long
pszDisplayName As Long
lpszTitle As Long
ulFlags As Long
lpfnCallback As Long
lParam As Long
iImage As Long
End Type

Private Declare ptrsafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As Long)
Private Declare ptrsafe Function lstrcat Lib "kernel32" (ByVal lpString1 As String, ByVal lpString2 As String) As Long
Private Declare ptrsafe Function SHBrowseForFolder Lib "shell32" (lpbi As BrowseInfo) As Long
Private Declare ptrsafe Function SHGetPathFromIDList Lib "shell32" (ByVal pidList As Long, ByVal lpBuffer As String) As Long

Public Function ChoixDossier(Titre)
Dim Rien As Integer
Dim Liste As Long
Dim Resultat As String
Dim Browse_info As BrowseInfo
With Browse_info
.lpszTitle = lstrcat(Titre, "")
.ulFlags = 1
End With
Liste = SHBrowseForFolder(Browse_info)
If Liste Then
Resultat = String$(260, 0)
SHGetPathFromIDList Liste, Resultat
CoTaskMemFree Liste
Rien = InStr(Resultat, vbNullChar)
If Rien Then
ChoixDossier = Left$(Resultat, Rien - 1)
End If
End If
End Function

Sub Test()
MsgBox ChoixDossier("Choisissez le dossier")
End Sub

 

 

was ich suche, ist das Äquivalent von msoFileDialogFolderPicker / Application.FileDialog(4). Zeigen

 

Dieser Dialog kann wie auf dem Screenshot aktiviert werden, aber ich sehe nicht, wie ich ihn von VBA aus starten kann

 


capture_000130.png

Ich habe gerade dieses Thema im selben Forum gefunden:

https://www.lynkoa.com/forum/import-export-formats-neutres/vba-afficher-bo%C3%AEte-de-dialogue-de-s%C3%A9lection-de-dossier-avec-chem

Mit etwas Glück werden Sie fündig.

Hallo

Dadurch wird nicht das richtige Dialogfeld angezeigt

Sie müssen sich den letzten Beitrag des vorherigen Links ansehen, der sich auf einen Link und einen Beitrag von @liryc

https://www.lynkoa.com/forum/solidworks/bouton-parcourir-macro-vba

Ich hoffe, es ist diesmal das richtige Dialogfeld:

Für den Code im 1. Modul:


Dim swApp       As SldWorks.SldWorks
Dim FileName        As String
Dim Filter          As String
Dim fileConfig      As String
Dim fileDispName    As String
Dim fileOptions         As Long

'Sub main()
'Set swApp = Application.SldWorks
'Filter = "SolidWorks Files (*.slddrw)|*.slddrw" 'Filtre les types de fichiers
'FileName = swApp.GetOpenFileName("File to Attach", "", Filter, fileOptions, fileConfig, fileDispName)
'End Sub

Dim MonDoss As String

Sub main()
MonDoss = FolderBrowse("Choisir un répertoire à traiter...", "C:\")
End Sub

In einem anderen Modul für dieselbe swp-Datei:



Private Declare PtrSafe Function SHBrowseForFolder Lib "shell32.dll" _
Alias "SHBrowseForFolderA" (lpBrowseInfo As BrowseInfo) As Long

Private Declare PtrSafe Function SHGetPathFromIDList Lib "shell32.dll" _
(ByVal pidList As LongPtr, ByVal lpBuffer As String) As Long


Public Declare PtrSafe Function SendMessageA Lib "user32" _
(ByVal Hwnd As LongPtr, ByVal wMsg As Long, _
ByVal wParam As LongPtr, lParam As Any) As LongPtr

Private Declare PtrSafe Sub CoTaskMemFree Lib "ole32.dll" (ByVal hMem As LongPtr)

Private Const BIF_RETURNONLYFSDIRS As Long = 1
Private Const CSIDL_DRIVES As Long = &H11
Private Const WM_USER As Long = &H400
Private Const MAX_PATH As Long = 260
'// message from browser
Private Const BFFM_INITIALIZED As Long = 1
Private Const BFFM_SELCHANGED As Long = 2
Private Const BFFM_VALIDATEFAILEDA As Long = 3 '// lParam:szPath ret:1(cont),0(EndDialog)
Private Const BFFM_VALIDATEFAILEDW As Long = 4 '// lParam:wzPath ret:1(cont),0(EndDialog)
Private Const BFFM_IUNKNOWN As Long = 5 '// provides IUnknown to client. lParam: IUnknown*
'// messages to browser
Private Const BFFM_SETSTATUSTEXTA As Long = WM_USER + 100
Private Const BFFM_ENABLEOK As Long = WM_USER + 101
Private Const BFFM_SETSELECTIONA As Long = WM_USER + 102
Private Const BFFM_SETSELECTIONW As Long = WM_USER + 103
Private Const BFFM_SETSTATUSTEXTW As Long = WM_USER + 104
Private Const BFFM_SETOKTEXT As Long = WM_USER + 105 '// Unicode only
Private Const BFFM_SETEXPANDED As Long = WM_USER + 106 '// Unicode only

Public Type BrowseInfo
hWndOwner As LongPtr
pIDLRoot As LongPtr
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfnCallback As LongPtr
lParam As LongPtr
iImage As Long
End Type

'====== Folder Browser for 64 bit VBA 7 ========
Public Function FolderBrowse(ByVal sDialogTitle As String, ByVal sInitFolder As String) As String
Dim ReturnPath As String

Dim b(MAX_PATH) As Byte
Dim pItem As Long
Dim sFullPath As String
Dim bi As BrowseInfo
Dim ppidl As Long

sInitFolder = CorrectPath(sInitFolder)

' Note VBA windows and dialogs do not have an hWnd property.
bi.hWndOwner = 0 'Windows Main Screen handle.

' SHGetSpecialFolderLocation bi.hWndOwner, CSIDL_DRIVES, ppidl

bi.pIDLRoot = 0 'ppidl


bi.pszDisplayName = VarPtr(b(0))
bi.lpszTitle = sDialogTitle
bi.ulFlags = BIF_RETURNONLYFSDIRS
If FolderExists(sInitFolder) Then bi.lpfnCallback = PtrToFunction(AddressOf BFFCallback)
bi.lParam = StrPtr(sInitFolder)
pItem = SHBrowseForFolder(bi)

If pItem Then ' Succeeded
sFullPath = Space$(MAX_PATH)
If SHGetPathFromIDList(pItem, sFullPath) Then
ReturnPath = Left$(sFullPath, InStr(sFullPath, vbNullChar) - 1) ' Strip nulls
CoTaskMemFree pItem
End If
End If

If ReturnPath <> "" Then
If Right$(ReturnPath, 1) <> "\" Then
ReturnPath = ReturnPath & "\"
End If
End If

FolderBrowse = ReturnPath

End Function
' typedef int (CALLBACK* BFFCALLBACK)(HWND hwnd, UINT uMsg, LPARAM lParam, LPARAM lpData);
Private Function BFFCallback(ByVal Hwnd As LongPtr, ByVal uMsg As LongPtr, ByVal lParam As LongPtr, ByVal sData As String) As LongPtr
If uMsg = BFFM_INITIALIZED Then
SendMessageA Hwnd, BFFM_SETSELECTIONA, True, ByVal sData
End If
End Function
Private Function PtrToFunction(ByVal lFcnPtr As LongPtr) As LongPtr
PtrToFunction = lFcnPtr
End Function
Private Function CorrectPath(ByVal sPath As String) As String
If Right$(sPath, 1) = "\" Then
If Len(sPath) > 3 Then sPath = Left$(sPath, Len(sPath) - 1) ' Strip backslash from non-root
Else
If Len(sPath) = 2 Then sPath = sPath & "\" ' Append backslash to root
End If
CorrectPath = sPath
End Function

Public Function FolderExists(ByVal sFolderName As String) As Boolean
Dim att As Long
On Error Resume Next
att = GetAttr(sFolderName)
If Err.Number = 0 Then
FolderExists = True
Else
Err.Clear
FolderExists = False
End If
On Error GoTo 0
End Function

 

 

Hallo

Es ist nicht das richtige Dialogfeld, das angezeigt wird, außerdem ist es eine echte Gasfabrik, die SW zu Hause abstürzt und die mit einem viel kürzeren Code in den Ex-Dateien, die ich bereits gesehen habe, geschrieben werden kann

Hallo @ll,

Der Code für Ihr erstes Makro bezieht sich auf das fileDialog-Objekt , das in Microsofts Office-Galaxie, aber nicht in VBA- oder SolidWorks-APIs vorhanden ist.
Wenn Sie Excel auf Ihrem PC installiert haben, funktioniert möglicherweise der folgende Code, der das Excel-Anwendungsobjekt verwendet.

Herzliche Grüße.

Option Explicit

Sub selectionDossier()

        ' Valeur de constante à passer à fileDialog  en fonction de l'usage attendu (cf. aide Microsoft)
        Const msoFileDialogOpen = 1         ' Permet à l'utilisateur d'ouvrir un fichier.
        Const msoFileDialogSaveAs = 2       ' Permet à l'utilisateur d'enregistrer un fichier.
        Const msoFileDialogFilePicker = 3   ' Permet à l'utilisateur de sélectionner un fichier.
        Const msoFileDialogFolderPicker = 4 ' Permet à l'utilisateur de sélectionner un dossier.

        Dim xlsheet As Object
        Dim xlFileDialog As Object
        Dim dossier As String

    Set xlsheet = CreateObject("Excel.Sheet")
    Set xlFileDialog = xlsheet.Application.FileDialog(msoFileDialogFolderPicker)
    With xlFileDialog
        .Title = "Selectionner dossier"
        .InitialFileName = "C:\"
        .Show
        dossier = .SelectedItems(1)
    End With
    Set xlsheet = Nothing

    If Len(dossier) > 0 Then
        MsgBox "Dossier sélectionné :  " & dossier
    Else
        MsgBox "Abandon"
    End If

End Sub

 

1 „Gefällt mir“

Es funktioniert gut, danke

Wenn jemand den Code für das SW-Dialogfeld anstelle von Excel hat, sollte er kürzer sein

Ich habe die Groß-/Kleinschreibung der Schaltfläche "Rückgängig" hinzugefügt

Sub selectionDossier()
'Const msoFileDialogOpen = 1         ' Ouvrir un fichier
'Const msoFileDialogSaveAs = 2       ' Enregistrer un fichier
'Const msoFileDialogFilePicker = 3   ' Sélectionner un fichier
Const msoFileDialogFolderPicker = 4 ' Sélectionner un dossier

Dim xlsheet As Object
Dim xlFileDialog As Object
Dim dossier As String

Set xlsheet = CreateObject("Excel.Sheet")
Set xlFileDialog = xlsheet.Application.FileDialog(msoFileDialogFolderPicker)
With xlFileDialog
    .Title = "Selectionner dossier"
    .InitialFileName = "C:\"
    
    If .Show <> 0 Then '<> BT Annuler
    dossier = .SelectedItems(1)
    End If
End With

Set xlsheet = Nothing
End Sub

 

 

 

Hat nichts mit dem Thema zu tun

Ich habe ein Minecraft-Makro auf SW für diejenigen zur Verfügung gestellt, die es interessiert: Lynkoa Community / TUTORIALS

Danke für den Code @m.blt 

Sie müssen nur den With-Block durch diesen Code ersetzen, um den Fehler beim Abbruch zu behandeln:

    dossier = vbNullString
    With xlFileDialog
        .Title = "Selectionner dossier"
        .InitialFileName = "C:\"
        .Show
        On Error Resume Next 'gère la cancel error
            dossier = .SelectedItems(1)
    End With

 

Über solidworks direkt = unmöglich mit FileDialog wie @m.blt  sagt:

https://r1132100503382-eu1-3dswym.3dexperience.3ds.com/#community:yUw32GbYTEqKdgY7-jbZPg/iquestion:oJZLfucoQ9OmlIPXWjDnzA

Es wurden 2 Umwegmethoden gefunden:

https://thecadcoder.com/vba/browse-solidworks-file/

eine über Excel wie @m.blt und eine andere, die nicht wirklich besser aussieht (nicht schneller oder kürzer) über userform (zum Testen, wenn Sie möchten).

Ich frage nicht unbedingt nach dem Aufruf der Box durch FileDialog, unabhängig vom Code

Dieses Dialogfeld existiert in SolidWorks, da es wie folgt geöffnet werden kann


capture_000131.png

Es existiert, aber leider ist SW nicht in vba codiert, so dass nicht alles, was in SW existiert, in vba existiert.

Ich beherrsche nicht alle Formen der Programmierung, aber ich habe manchmal Codes gesehen, die 'shell something' aufrufen. Ich denke, wenn jemand sich gut mit Programmierung auskennt, könnte es möglich sein, diesen Dialog aufzurufen, genau wie die Optionen des integrierten SW-Dialogfelds ihn verwenden

 

Das Grundproblem ist VBA unter 64 Bit, denn unter 32 gibt es viel mehr Steuerelemente, einschließlich Dialoge, die mit VBA 64 nicht kompatibel sind... Es ist abwegig, herzzerreißend und frustrierend...

Ich brauche auch diesen Dialog und er macht mich verrückt. Der Excel-Dialog ist eine Notlösung (danke @m.blt ), aber er öffnet sich so langsam...

Nun, diese Langsamkeit beim Öffnen des Dialogfelds hat mich dazu veranlasst,  auf der Grundlage von @m.blt  zu testen, um es schneller zu machen. Was ich getan habe, zusätzlich zu der Reduzierung der Größe des Codes. Ich habe es nebenbei zu einer Funktion gemacht. Hier ist:

Dim xlFolderDlg As Office.FileDialog

Private Sub UserForm_Initialize()
  Set xlFolderDlg = Excel.Application.FileDialog(4)
End Sub

Function FolderDialog$(Optional folder$)
  With xlFolderDlg
    .Title = "Sélectionner un dossier"
    .ButtonName = "Sélectionner"
    .InitialFileName = folder
    If .Show Then folder = .SelectedItems(1)
  End With
  FolderDialog = folder
End Function

Private Sub CMDfolderDlg_Click()
  TXTfolder = FolderDialog(TXTfolder)
End Sub

.

Dabei ist CMDfolderDlg ein CommandButton und TXTfolder ein TextBox.

Es gibt jedoch einen Nachteil; Wenn das Dialogfeld geschlossen wird, wird die Hand im Formular nicht wiederhergestellt (die Auswahl des Fensters ist aufgehoben). Schade, aber nicht dramatisch.

interessant

Ich habe einen Kompilierungsfehler in der 1. Zeile