Office中国论坛/Access中国论坛

标题: 竞赛[高8]最好和最简洁的文件打开对话框功能 [打印本页]

作者: tmtony    时间: 2008-3-4 14:44
标题: 竞赛[高8]最好和最简洁的文件打开对话框功能
功能:使用代码调用文件打开对话框,只可使用Access或Office本身的功能,不可使用第三方Activex控件
要求:功能符合要求,代码最简洁,调用最方便
奖品:只取第一名 第一名增加金钱数80 增加经验值10 增加魅力10
期限:10天
作者: 咱家是猫    时间: 2008-3-4 14:44
Function GetFileName(TitleText As String, Filter As String, FilterText As String, ByVal DialogType As Integer, Optional ByVal FilePath) As String
'参数DialogType说明:
'1.“打开”对话框
'2.“另存为”对话框(此项如执行类型筛选时会出错,所以加了出错处理为 Resume Next)
'3.“文件选取器”对话框
'4.“文件夹选取器”对话框
'例:AA = GetFileName("打开", "*.ini;*.txt", "配置文件", 1, 3)

On Error Resume Next

    Dim dlgOpen As FileDialog
    Set dlgOpen = Application.FileDialog(DialogType)
    With dlgOpen
        .Title = TitleText
        .Filters.Clear
        .Filters.Add FilterText, Filter
        .AllowMultiSelect = False
        If IsMissing(FilePath) Then
            .InitialFileName = CurrentProject.Path
        Else
            .InitialFileName = FilePath
        End If
        .Show
    End With
    If dlgOpen.SelectedItems.Count > 0 Then
        GetFileName = dlgOpen.SelectedItems(1)
    Else
        GetFileName = ""
    End If
    Set dlgOpen = Nothing

End Function
作者: andymark    时间: 2008-3-4 15:08
能不能引用office 11 Library
作者: tmtony    时间: 2008-3-4 15:18
也可以 是OFFICE本身的, 我知道你想取巧了
作者: liwen    时间: 2008-3-4 16:11
帮助里的东西总是最有效:

Dim dlgOpen As FileDialog

Set dlgOpen = Application.FileDialog( _
    DialogType:=msoFileDialogOpen)

With dlgOpen
    .AllowMultiSelect = True
    .Show
End With

For i = 1 To dlgOpen.SelectedItems.Count
sStr = sStr & dlgOpen.SelectedItems(i) & vbCrLf
Next
MsgBox sStr

[ 本帖最后由 liwen 于 2008-3-4 16:25 编辑 ]
作者: andymark    时间: 2008-3-4 16:16
这个当然行,但不是最好的,应该要写成模块,最起码能自定义后缀筛选
作者: tmtony    时间: 2008-3-4 16:30
正是 至少可以指定扩展名
作者: liwen    时间: 2008-3-4 16:33
Sub FilesSelect()
Dim dlgOpen As FileDialog

Set dlgOpen = Application.FileDialog( _
    DialogType:=msoFileDialogOpen)

With dlgOpen
    .AllowMultiSelect = True
    .Filters.Add "AIS文件", "*.ais", 1
    .Filters.Add "图象", "*.gif; *.jpg; *.jpeg; *.bmp", 1
    .Show
End With
For i = 1 To dlgOpen.SelectedItems.Count
sStr = sStr & dlgOpen.SelectedItems(i) & vbCrLf
Next
MsgBox sStr

Set dlgOpen = Nothing

End Sub

还是来源于帮助

[ 本帖最后由 liwen 于 2008-3-4 16:36 编辑 ]
作者: andymark    时间: 2008-3-4 16:42
对话框也可支持多选的
作者: tmtony    时间: 2008-3-4 17:07
不错, 看来API 太长了,个个都不用
作者: andymark    时间: 2008-3-5 09:28
调用一个打开对话框容易,写一个特色对话框就非得用API
见过别人的对话框可加上SKIN的, 很漂亮 还找不到思路
作者: access3009    时间: 2008-3-5 10:17
如果要完全量身定做的,还得自己写.
不过,怎么都是用微软的
作者: tmtony    时间: 2008-3-5 15:54
不错不错,更具体了!!
作者: andymark    时间: 2008-3-6 15:18
我也做了一个,并不算很完善,凑合先发上来
按要求是做一个调用最方便的对话框,首先想到的是把常用的类型先定义起来,同时也能支持自定义模式
  1. Public Enum DialogType '定义对话框类型
  2. Fileopen = 1
  3. FileSaveAs = 2
  4. FilePicker = 3
  5. FolderPicker = 4
  6. End Enum

  7. Public Enum FilterType '定义筛选类型
  8. All = 0 '所有文件
  9. MsAccess = 1
  10. MsWord = 2
  11. MsExcel = 3
  12. Txt = 4
  13. HTML = 5
  14. Photo = 6
  15. Cust = 7 '自定义类型
  16. End Enum

  17. Public Const MsAllType As String = "*.*"
  18. Public Const MsALLTitle As String = "所有文件"
  19. Public Const MsAccessType As String = "*.mdb;*.adp;*.mda;*.mde;*.ade"
  20. Public Const MsAccessTitle As String = "Microsoft Office Access"
  21. Public Const HtmType As String = "*.html;*.htm;*.hta;*.asp"
  22. Public Const HtmTitle As String = "网页"
  23. Public Const TxtType As String = "*.txt"
  24. Public Const TxtTitle As String = "文本文档"
  25. Public Const MsExcelType As String = "*.xl;*.xls;*.xla;*.xlm;*.xlc;*.xlw"
  26. Public Const MsExcelTitle As String = "Microsoft Office Excel"
  27. Public Const MsWordType As String = "*.doc;*.dot"
  28. Public Const MsWordTitle As String = "Microsoft Office Word"
  29. Public Const PhotoType As String = "*.JPG;*.JPEG;*.JPE;*.JFIF;*.GIF;*.bmp,*.PNG,*.ico"
  30. Public Const PhotoTitle As String = "图片文件"


  31. Public Function GetFileName(DType As DialogType, txtFilter As FilterType, Optional txtFilterName As String, Optional ByVal strPath, Optional StrTitle As String) As String

  32. '须引用 Micosoft Office 11.0 Object Library

  33. '用途: 自定义对话框
  34. '参数: DType 定义对话框类型 必选: Fileopen 打开 对话框;FileSaveAs 另存为 对话框;FilePicker 文件选取器 对话框;FolderPicker 文件夹选取器 对话框
  35. ' txtFilter 定义几种常用类型 支持自定义类型 必选;
  36. ' txtFilterName 可选,当txtFilter类型为Cust自定义,则txtFilterName表示自定义的筛选条件和名称,筛选条件和筛选名称用","分隔:亦表示保存的文件名
  37. ' strPath 文件路径 可选
  38. ' StrTitle 自定义对话框名称,可选;缺省为系统自带的
  39. '用法: GetFileName Fileopen, MsAccess
  40. ' GetFileName FileSaveAs, MsExcel, "Tes.xls"
  41. ' GetFileName Fileopen, Cust, "*.doc;*.xls;*.mdb"
  42. ' GetFileName Fileopen, Cust, "*.doc;*.xls;*.mdb,My Dialog"
  43. ' GetFileName Fileopen, Cust, "*.doc;*.xls;*.mdb,My Dialog", , "自定义标题"
  44. ' GetFileName Fileopen, MsAccess, , , "自定义标题"
  45. ' GetFileName Fileopen, Photo, , "D:"



  46. Dim StrFilter As String
  47. Dim StrFilterTitle As String
  48. Dim fDialog As Office.FileDialog


  49. Select Case txtFilter

  50. Case All

  51. StrFilter = MsAllType
  52. StrFilterTitle = MsALLTitle

  53. Case MsAccess

  54. StrFilter = MsAccessType
  55. StrFilterTitle = MsAccessTitle

  56. Case MsWord

  57. StrFilter = MsWordType
  58. StrFilterTitle = MsWordTitle

  59. Case MsExcel

  60. StrFilter = MsExcelType
  61. StrFilterTitle = MsExcelTitle

  62. Case Txt

  63. StrFilter = TxtType
  64. StrFilterTitle = TxtTitle

  65. Case HTML

  66. StrFilter = HtmType
  67. StrFilterTitle = HtmTitle

  68. Case Photo

  69. StrFilter = PhotoType
  70. StrFilterTitle = PhotoTitle

  71. Case Cust

  72. Dim Mypos

  73. If IsMissing(txtFilterName) Then

  74. MsgBox "你选择了自定义类型,请在txtFilterName选项中填写筛选数据"

  75. Exit Function
  76. Else

  77. Mypos = InStr(1, txtFilterName, ",")


  78. If Mypos > 0 Then

  79. StrFilter = Mid(txtFilterName, 1, Mypos - 1)
  80. StrFilterTitle = Mid(txtFilterName, Mypos + 1, Len(txtFilterName) - Mypos)
  81. Else
  82. StrFilter = txtFilterName
  83. StrFilterTitle = "自定义类型"

  84. End If

  85. End If

  86. End Select

  87. Set fDialog = Application.FileDialog(DType)

  88. With fDialog

  89. .AllowMultiSelect = False

  90. If IsMissing(strPath) Then
  91. .InitialFileName = CurrentProject.Path
  92. Else
  93. .InitialFileName = strPath
  94. End If

  95. If Not IsMissing(StrTitle) Then
  96. .Title = StrTitle
  97. End If


  98. If DType <> FileSaveAs Then

  99. .Filters.Clear
  100. .Filters.Add StrFilterTitle, StrFilter

  101. Else

  102. .InitialFileName = txtFilterName
  103. End If

  104. .Show
  105. End With

  106. If fDialog.SelectedItems.Count > 0 Then

  107. GetFileName = fDialog.SelectedItems(1)

  108. Else

  109. GetFileName = ""

  110. End If

  111. Set fDialog = Nothing


  112. End Function
复制代码

作者: xinbao    时间: 2008-3-6 16:27
这么多代码,学习学习
作者: andymark    时间: 2008-3-6 16:33
呵呵, 这个还没考虑多选的问题呢
作者: tmtony    时间: 2008-3-7 11:16
原帖由 andymark 于 2008-3-6 16:33 发表
呵呵, 这个还没考虑多选的问题呢

一考虑多选,代码又多了
作者: fan0217    时间: 2008-3-8 16:13
不用先期绑定的方式,可以不引用Micosoft Office 1X.0 Object Library
作者: fan0217    时间: 2008-3-8 16:16
andymark:
其实可以不用定义:Public Enum DialogType '定义对话框类型,因为引用了Micosoft Office 1X.0 Object Library后是可以使用枚举:MsoFileDialogType
作者: andymark    时间: 2008-3-8 16:26
这个我知道,微软那个东东有点长
作者: fan0217    时间: 2008-3-8 17:05


  1. '===============================================================================
  2. '-函数名称:         GetFileName
  3. '-功能描述:         弹出文件打开对话框,获得选取的文件名
  4. '-输入参数说明:     参数1:filter  可选 文件筛选器
  5. '                   参数2:filterTitle   可选  筛选文件的描述
  6. '                   参数3:title   可选 对话框标题
  7. '                   参数4:SpaceDigit  可选  表示文件对话框中初始显示的路径和/或文件名
  8. '-返回参数说明:     返回选取的文件名
  9. '-使用语法示例:     Me.FileName = GetFileName("*.MDB", "Microsoft Access")
  10. '-参考:             Office VBA 帮助
  11. '-使用注意:         可以引用Microsoft Office 1x.0 Object Library
  12. '-兼容性:           XP,2003
  13. '-作者:             fans fan0217  QQ:370552091
  14. '-更新日期:        2007-5-2
  15. '===============================================================================
  16. Public Function GetFileName(Optional filter As String = "*.*", _
  17.                             Optional filterTitle As String = "所有文件", _
  18.                             Optional title As String, _
  19.                             Optional initialFileName As String) As String
  20.     Dim dlg As Object
  21.     Set dlg = Application.FileDialog(1)
  22.         With dlg
  23.             .AllowMultiSelect = False
  24.             If Not IsMissing(title) Then
  25.                 .title = title
  26.             End If
  27.             If IsMissing(initialFileName) Then
  28.                 .initialFileName = initialFileName
  29.             End If
  30.             .Filters.Add filterTitle, filter
  31.             .Show
  32.         End With
  33.         If dlg.SelectedItems.Count > 0 Then
  34.                GetFileName = dlg.SelectedItems(1)
  35.            Else
  36.                GetFileName = ""
  37.         End If
  38.     Set dlg = Nothing
  39. End Function

复制代码

作者: andymark    时间: 2008-3-8 17:49
大家都忽略一个问题,一般的对话框中支持多项多类型的选择,也就是在下拉列表中有多个选项。什么是最好 最方便 最简洁 ,看来每个人的理解都不尽相同
作者: tmtony    时间: 2008-3-8 18:04
这个题目出的不好了
没有很好的判断标准
作者: fan0217    时间: 2008-3-8 18:39
但至少有一点可以看出来了,使用Office对象是最优的选择。但做成函数等集成模块,那么灵活度自然要受到影响的。所以在实际应用中,可根据自己的需要来灵活应用,没有一成不变的。代码的质量高度远比不上好的思维方法。
作者: Grant    时间: 2008-3-10 14:20
原帖由 andymark 于 2008-3-8 17:49 发表
大家都忽略一个问题,一般的对话框中支持多项多类型的选择,也就是在下拉列表中有多个选项。什么是最好 最方便 最简洁 ,看来每个人的理解都不尽相同


赞同
作者: tmtony    时间: 2008-3-11 08:52
这道题我出得不好, 定义不够清晰.  但现在只好先结贴给奖金了
咱家是猫 版主 和 fan0217版主 的答案功能和代码长度都旗鼓相当,  不过, 因为 咱家是猫 版主发在前,
所以判 咱家是猫 版主取胜了. 80元 O币已经送到家门口
作者: sblisb    时间: 2008-4-9 21:18
使用咱家是猫的代码

Dim dlgOpen As FileDialog
停在这一句,提示"用户定义类型未定义"
这是什么原因?
谢谢
作者: andymark    时间: 2008-4-9 21:50
需引用
Micosoft Office 1X.0 Object Library
作者: sblisb    时间: 2008-4-9 22:52
原帖由 andymark 于 2008-4-9 21:50 发表
需引用
Micosoft Office 1X.0 Object Library

谢谢!
还以为是引用Micosoft access 1X.0 Object Library
文件夹选取如何写?
作者: 390012370    时间: 2024-1-30 22:33
多谢分享!学习学习!




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3