我用如下代码实现多选
file5.Flags = cdlOFNAllowMultiselect + cdlOFNExplorer
file5.Filter = "All Files|*.*"
file5.FileName = ""
file5.ShowOpen
msgbox(file5.filename)可为什么当只选一个文件的时候能显示正常,而当多选的时候 就只显示当前文件所在路径?
可用 len(file5.filename) 的时候,长度倒是不断增加? 

解决方案 »

  1.   

    多个文件要处理Private Sub Command1_Click()
        CommonDialog1.FileName = ""
        CommonDialog1.Filter = "bmp files(*.bmp)|*.bmp|jpg files(*.jpg)|*.jpg|all files(*.*)|*.*"
        CommonDialog1.Flags = cdlOFNAllowMultiselect Or cdlOFNExplorer
        CommonDialog1.Action = 1
      
        Dim s As String
        s = CommonDialog1.FileName
        Dim arr
        arr = Split(s, Chr(0))
        Dim path As String
        Dim file1 As String
        Dim i As Long
        i = InStrRev(arr(0), "\")
        List1.Clear
        If i > 0 Then
            'path = Left(arr(0), i - 1)
            path = IIf(Right(arr(0), 1) = "\", arr(0), arr(0) & "\")
            If UBound(arr) >= 1 Then
                For i = 1 To UBound(arr)
                    List1.AddItem path + arr(i)
                Next
            Else
                List1.AddItem s
            End If
        End If
    End Sub
      

  2.   

    同意楼上选择多个文件时,路径、第一个文件名、第二个文件名、第N个文件名。。之间会被一个chr(0)字符分隔开,需要写自己代码处理
      

  3.   

    只显示路径是因为路径后面有个chr(0),当你用msgbox显示时,遇到chr(0)就不再显示了,所以后面的内容看不到,你改用debug.print就可以看到了
      

  4.   

    以上各位的多选方式很不方便
    在模块ModDlgSelectFileInfo中,然后在窗体中加一个listbox,一个Command,看看这个例子比较方便.ption Explicit
    '包含函数: GetDlgSelectFileInfo
    '函数功能: 获取从CommonDialog中选取的文件信息
    '自定义类型,用于DlgSelectFileInfo函数
    Type DlgFileInfo
        iCount As Long
        sPath As String
        sFile() As String
    End Type'功能:     返回CommonDialog所选择的文件数量和文件名
    '参数说明:  strFileName是CommonDialog.Filename
    '函数类型:  DlgFileInfo。这是一个自定义类型,声明如下:
    '               Type DlgFileInfo
    '                   iCount As Long
    '                   sPath As String
    '                   sFile() As String
    '               End Type
    '           其中,iCount为选择文件的数量,sPath为所选文件的路径,sFile()为所选择的文件名
    '注意事项:  在CommonDialog.ShowOpen后立即使用,以免当前路径被更改
    '           在打开了*.pif文件后须将Filename属性置空,否则当选取多个*.pif文件后,当前路径会改变会
    '           在CommonDialong.Flags属性中使用cdlOFNNoDereferenceLinks风格,就可以正确的返回*.pif文件的文件名了Public Function GetDlgSelectFileInfo(strFilename As String) As DlgFileInfo
        
        '思路: 用CommonDialog控件选择文件后,其Filename属性值如下:
        '       1、如果选择的是"C:\Test.txt",  Filename="C:\Test.txt",    CurDir()="C:\"
        '       2、如果选择的是"C:\1\Test.txt",Filename="C:\1\Test.txt",  CurDir()="C:\1"
        '       3、如果选择的是"C:\1.txt"和"C:\2.txt",则:
        '                                   Filename="C:\1 1.txt 2.txt",  CurDir()="C:\1"
        '       因此先将路径分离开,再利用多文件之间插入的Chr$(0)字符分解各个文件名即可。
        
        Dim sPath, tmpStr As String
        Dim sFile() As String
        Dim iCount As Integer
        Dim I As Integer
        
        On Error GoTo ErrHandle
        
        sPath = CurDir()  '获得当前的路径,因为在CommonDialog中改变路径时会改变当前的Path
        tmpStr = Right$(strFilename, Len(strFilename) - Len(sPath)) '将文件名分离出来
        
        If Left$(tmpStr, 1) = Chr$(0) Then
            '选择了多个文件(表现为第一个字符为空格)
            For I = 1 To Len(tmpStr)
                If Mid$(tmpStr, I, 1) = Chr$(0) Then
                    iCount = iCount + 1
                    ReDim Preserve sFile(iCount)
                Else
                    sFile(iCount) = sFile(iCount) & Mid$(tmpStr, I, 1)
                End If
            Next I
        Else
            '只选择了一个文件(注意:根目录下的文件名除去路径后没有"\")
            iCount = 1
            ReDim Preserve sFile(iCount)
            If Left$(tmpStr, 1) = "\" Then tmpStr = Right$(tmpStr, Len(tmpStr) - 1)
            sFile(iCount) = tmpStr
        End If
        
        GetDlgSelectFileInfo.iCount = iCount
        ReDim GetDlgSelectFileInfo.sFile(iCount)
        
        If Right$(sPath, 1) <> "\" Then sPath = sPath & "\"
        GetDlgSelectFileInfo.sPath = sPath
        
        For I = 1 To iCount
            GetDlgSelectFileInfo.sFile(I) = sFile(I)
        Next I
        
        Exit FunctionErrHandle:
        MsgBox "GetDlgSelectFileInfo函数执行错误!", vbOKOnly + vbCritical, "自定义函数错误"End Function
    '//窗体中的代码
    Private Sub Command1_Click()
        Dim DlgInfo As DlgFileInfo
        Dim I As Integer
        On Error GoTo ErrHandle
        '清除List1中的项
        List1.Clear
        '选择文件
        With CommonDialog1
            .CancelError = True
            .MaxFileSize = 32767 '被打开的文件名尺寸设置为最大,即32K
            .Flags = cdlOFNHideReadOnly Or cdlOFNAllowMultiselect Or cdlOFNExplorer Or cdlOFNNoDereferenceLinks
            .DialogTitle = "选择文件"
            .Filter = "所有类型的文件(*.*)|*.*"
            .ShowOpen
            DlgInfo = GetDlgSelectFileInfo(.FileName)
            .FileName = ""      '在打开了*.pif文件后须将Filename属性置空,
                                '否则当选取多个*.pif文件后,当前路径会改变
        End With
        Dim Serial As Integer
        Serial = Form1.List1.ListCount + 1
        For I = 1 To DlgInfo.iCount
            List1.AddItem Serial & "." & DlgInfo.sPath & DlgInfo.sFile(I)
            Serial = Serial + 1
        Next I
        
        Exit Sub
    ErrHandle:
        ' 按了“取消”按钮
    End Sub