Private Const MAX_PATH = 260 Private Const OFN_ALLOWMULTISELECT = &H200 Private Const OFN_EXPLORER = &H80000 Private Const OFN_FILEMUSTEXIST = &H1000 Private Const OFN_HIDEREADONLY = &H4 Private Const OFN_READONLY = &H1 Private Type OpenFileName lStructSize As Long hWndOwner As Long hInstance As Long 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 Long lpTemplateName As String End Type Private Declare Function MultiByteToWideChar Lib "kernel32" (ByVal CodePage As Long, ByVal dwFlags As Long, ByVal lpMultiByteStr As String, ByVal cchMultiByte As Long, ByVal lpWideCharStr As String, ByVal cchWideChar As Long) As Long Private Declare Function GetOpenFileNameW Lib "comdlg32.dll" (pOpenfilename As OpenFileName) As Boolean Private Function GetOpenFileName(ByVal Title As String, _ Files() As String, _ Optional ByVal Filter As String = vbNullString, _ Optional ByVal FilterIndex As Long = 0, _ Optional ByVal InitialDir As String = vbNullString, _ Optional ByVal MultiSelect As Boolean = False, _ Optional ByVal FileMustExist As Boolean = False, _ Optional ByVal HideReadOnly As Boolean = False, _ Optional ByRef OpenReadOnly As Boolean = False, _ Optional ByVal hWndOwner As Long = 0 _ ) As Boolean Dim op As OpenFileName op.lStructSize = LenB(op) op.hWndOwner = hWndOwner op.hInstance = App.hInstance op.lpstrTitle = String$(256, 0) Call MultiByteToWideChar(0, 0, Title, Len(Title), op.lpstrTitle, 256) op.lpstrInitialDir = String$(MAX_PATH, 0) Call MultiByteToWideChar(0, 0, InitialDir, Len(InitialDir), op.lpstrInitialDir, MAX_PATH) op.lpstrFilter = String$(256, 0) Filter = VBA.Replace(Filter, "|", ChrW$(0)) Call MultiByteToWideChar(0, 0, Filter, Len(Filter), op.lpstrFilter, MAX_PATH) op.nFilterIndex = FilterIndex + 1 op.nMaxFile = 4096 op.lpstrFile = String$(op.nMaxFile, 0) If MultiSelect Then op.flags = op.flags Or OFN_ALLOWMULTISELECT Or OFN_EXPLORER If FileMustExist Then op.flags = op.flags Or OFN_FILEMUSTEXIST If HideReadOnly Then op.flags = op.flags Or OFN_HIDEREADONLY If OpenReadOnly Then op.flags = op.flags Or OFN_READONLY If GetOpenFileNameW(op) Then Dim OpenFileName As String OpenFileName = VBA.StrConv(op.lpstrFile, vbFromUnicode) Erase Files If MultiSelect Then Dim BufferFiles() As String, i As Integer BufferFiles = VBA.Split(OpenFileName, ChrW$(0)) OpenFileName = vbNullString For i = 0 To UBound(BufferFiles) If BufferFiles(i) = vbNullString Then Exit For If i = 0 And BufferFiles(1) = vbNullString Then OpenFileName = BufferFiles(0) Exit For ElseIf i > 0 Then If Not OpenFileName = vbNullString Then OpenFileName = OpenFileName & ChrW$(0) & BufferFiles(0) & BufferFiles(i) Else OpenFileName = BufferFiles(0) & BufferFiles(i) End If Else If Not VBA.Right$(BufferFiles(0), 1) = "\" Then BufferFiles(0) = BufferFiles(0) & "\" End If Next i Files = VBA.Split(OpenFileName, ChrW$(0)) Else ReDim Files(0) Files(0) = VBA.Left$(OpenFileName, VBA.InStr(1, OpenFileName, ChrW$(0)) - 1) End If OpenReadOnly = op.flags And OFN_READONLY GetOpenFileName = True Else GetOpenFileName = False End If End Function 'Exemple d'utilisation : Dim Files() As String If GetOpenFileName("Chosir plusieur Fichiers", Files, "txt files (*.txt)|*.txt|All files (*.*)|*.*", 1&, "C:\", True, True) Then ' Ok Else ' Annuler End If
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.