ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索

VBA FileDialog 及Listview 控件的说明

已有 5925 次阅读2014-3-5 09:43

语法:expression.FileDialog(fileDialogType)

返回一个 FileDialog 对象,该对象代表文件对话框的实例。

expression      必需。该表达式返回应用于列表中的对象之一。

fileDialogType      MsoFileDialogType 类型,必需。文件对话框的类型。

MsoFileDialogType 可为以下 MsoFileDialogType 常量之一。

msoFileDialogFilePicker       允许用户选择一个文件。

msoFileDialogFolderPicker  允许用户选择一个文件夹。

msoFileDialogOpen               允许用户打开一个文件。

msoFileDialogSaveAs           允许用户保存一个文件。

http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1126466&pid=7672466一个实例

 

方法 :

 

名称

说明

 

Execute

在调用 Show 方法后立即执行用户的操作。

 

Show

显示文件对话框并返回一个 Long 类型的值,指示用户按下的是操作按钮 (-1) 还是取消按钮 (0)。在调用 Show 方法时,在用户关闭文件对话框之前不会执行其他代码。在打开另存为对话框中,在使用了 Show 方法后会立即使用 Execute 方法执行用户操作。

属性:

 

名称

说明

 

AllowMultiSelect

如果允许用户从文件对话框中选择多个文件,则为 True。可读/写。

 

Application

 

获取一个 Application 对象,代表 FileDialog 对象的容器应用程序(可以使用 Automation 对象的此属性返回该对象的容器应用程序)。只读。 

 

ButtonName

 

设置或获取代表文件对话框中动作按钮上所显示文本的 String 类型的值。可读/写。 

 

 

Creator

 

获取一个 32 位整数,指示创建 FileDialog 对象时所使用的应用程序。只读。 

 

 

DialogType

 

返回一个 MsoFileDialogType 常量,代表 FileDialog 对象被设置为要显示的文件对话框的类型。只读。

 

 

FilterIndex

 

获取或设置一个 Long 类型的值,指示文件对话框的默认文件筛选器。默认筛选器决定首次打开文件对话框时显示的文件类型。可读/写。

 

 

Filters

 

获取一个 FileDialogFilters 集合。只读。 

 

 

InitialFileName

 

设置或返回一个 String 类型的值,代表文件对话框中初始显示的路径或文件名。可读/写。

 

 

InitialView

 

获取或设置一个 MsoFileDialogView 常量,代表文件对话框中文件和文件夹的初始表示形式。可读/写。 

 

 

Item

 

获取与对象关联的文本。只读。

 

 

Parent

 

获取 FileDialog 对象的 Parent 对象。只读。 

 

 

SelectedItems

 

获取一个 FileDialogSelectedItems 集合。此集合包含用户在使用 FileDialog 对象的 Show 方法显示的文件对话框中所选的文件的路径列表。只读。

 

 

Title

 

设置或获取使用 FileDialog 对象显示的文件对话框的标题。可读/写。

 

示例1.

在本示例中,Microsoft Excel 打开文件对话框,允许用户选择一个或多个文件。选中这些文件之后,Excel 将逐条显示每个文件的路径。

Sub UseFileDialogOpen()

    Dim lngCount As Long    With Application.FileDialog(msoFileDialogOpen)'打开对话框        .AllowMultiSelect = True'允许文件多选        .Show        For lngCount = 1 To .SelectedItems.Count'显示选中的文件            MsgBox .SelectedItems(lngCount)        Next lngCount    End With End Sub

示例2.   Dim fd As FileDialog
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    Dim vrtSelectedItem As Variant
    With fd
        If .Show = -1 Then
            For Each vrtSelectedItem In .SelectedItems
                MsgBox "The path is: " & vrtSelectedItem
                MsgBox CreateObject("Scripting.FileSystemObject").GetFileName(vrtSelectedItem)'
取文件名
                MsgBox CreateObject("Scripting.FileSystemObject").GetParentFolderName(vrtSelectedItem) & "\"'
取路径
            Next vrtSelectedItem
        Else
        End If
    End With
    Set fd = Nothing

 

 

 

 

 

 

ListView

控件是一款非常优秀的表格控件,对vba初学者来说,熟练地掌握此控件的用法,不仅能大大地增加自己学习vba的兴趣,而且对实际工作也有很好的帮助,本文将对ListView控件的各种用法作详细介绍,由于水平有限,若有不当之处,欢迎批评指正。

一、添加表头 

ListView控件添加表头,一般在窗体的初始化事件中完成,假如给一ListView1控件添加姓名、性别、文化、住址、身份证可用以下代码实现:

Private Sub UserForm_Initialize() 

ListView1.ColumnHeaders.Add , , "姓名", 40

ListView1.ColumnHeaders.Add , , "性别", 40

ListView1.ColumnHeaders.Add , , "文化", 40

ListView1.ColumnHeaders.Add , , "住址", 120

ListView1.ColumnHeaders.Add , , "身份证", 80 

ListView1.View = lvwReport

ListView1.FullRowSelect = True

ListView1.Gridlines = True

End Sub 

在以上代码中40404012080

代表该字段所在的列宽,在实际应用中,如何确定列宽对初学者来说是一个难点,这里给大家提供一个确定列宽的实用方法,通常ListView控件加载的数据都存放在一张excel工作表中,我们先在工作表中调整好列宽,然后用ListView控件需要加载的excel表格的列宽作为相应ListView控件的列宽即可,求列宽可用以vba代码实现(如求excel表格D列的列宽) 

Sub wdt() 

MsgBox Cells(1, "d").Width

End Sub 

 

其他属性介绍

ListView1.View = lvwReport,显示格式为报表格式

ListView1.FullRowSelect = True, 允许整行选中

ListView1.Gridlines = True, 显示网格线

 

在实际应用中,由于加载的对象都事先存储在excel表格中,我们在加载表头时还可以对代码进行优化,通过循环的方式,减少代码的编写量,比如有一张excel表格,首行为标题行,共有10个字段,加载该表头时可用以下代码简单实现: 

Private Sub UserForm_Initialize()

For J = 1 To 10

ListView1.ColumnHeaders.Add , , Cells(1, J), Cells(1, J).Width

Next 

ListView1.View = lvwReport

ListView1.FullRowSelect = True

ListView1.Gridlines = True

End Sub

 

清除表头可用以下代码实现: 

ListView1.ColumnHeaders.Clear,

请大家记住该代码,在后面深入介绍中会应用到此语句。

 二、ListView加载数据

我们学习了如何给ListView控件加载表头,在本章中我们将学习如何给ListView控件加载数据,假如ListView控件的表头为姓名、性别、文化、住址、身份证,张三的个人信息如下:

男、大学、南京市白下区、320123196610162018,将张三的个人信息加载给ListView

控件代码如下:

Set Itm = ListView1.ListItems.Add()

Itm.Text = "张三" 

Itm.SubItems (1) = ""

Itm.subitems(2) = "大学"

Itm.subitems(3) = "南京市白下区" 

Itm.subitems(4) = "320123196610162018" 

以上是加载1个人的信息,若现在有一张excel表格,其表名为《员工信息表》,该表首行为姓名、性别、文化、住址、身份证标题,从第2行到100行是99个人的个人信息,现在要将这99个人的个人信息加载到ListView控件中,可用循环方法实行,代码如下:

For i = 2 To 100 

Set Itm = ListView1.ListItems.Add()

Itm.Text = Cells(i, 1) 

Itm.subitems(1) = Cells(i, 2)

Itm.subitems(2) = Cells(i, 3)

Itm.subitems(3) = Cells(i, 4)

Itm.subitems(4) = Cells(i, 5)

NextNext

  

ListView控件加载数据除上述加载方法之外,还有一种重要的数据加载方法即加载SQL查询记录集,以上述《员工信息表》为例,其查询、加载数据代码如下:

Dim cn As Object, rs As Object 

Set cn = CreateObject("ADODB.Connection")   '连接数据库

Set rs = CreateObject("ADODB.Recordset")

cn.Open "dsn=excel files;dbq=" &ThisWorkbook.FullName

Sql = "Select * from [员工信息表$] " 

rs.OpenSql, cn, 1, 3

ListView1.ListItems.Clear  '清除ListView记录

Do While Not rs.EOF 

Set Itm=ListView1.ListItems.Add() '添加记录

Itm.Text = rs.Fields("姓名")  '添加第一列内容

Itm.SubItems(1) = rs.Fields("性别")  '添加第二列内容

Itm.SubItems(2) = rs.Fields("文化") '添加第三列内容

Itm.SubItems(3) = rs.Fields("住址")  '添加第四列内容

Itm.SubItems(4) = rs.Fields("身份证") 添加第五列内容

rs.MoveNext

Loop

rs.Close: Set rs = Nothing: cn.Close 

以上代码中牵涉到SQL查询相关知识点,对SQL查询不熟悉的朋友,可在网上查阅相关知

识进行学习,这样才能更好地理解上述代码,更加方便日后的实际应用。

 

三、ListView控件的重要属性和方法 

在本章中我们将介绍ListView控件的一些重要属性和方法,望大家能牢记这些属性和方法。

1、对齐属性 

ListView控件在初始化之前,为美观之需要,我们可以对每列数据排列格式进行设置,每列数据可或左对齐、或右对齐、或中间对齐,该项工作和加载表头同步进行,下面以加载“ 姓名”表头为例,其代码如下: 

左对齐:   ListView1.ColumnHeaders.Add , , "姓名", 40, lvwColumnLeft

右对齐:   ListView1.ColumnHeaders.Add , , "姓名", 40,lvwColumnRight

中间对齐: ListView1.ColumnHeaders.Add , , "姓名", 40,lvwColumnCenter

这里需特别提醒ListView控件首列只能左对齐,否则代码会出现编译错误。

2、排序属性 

ListView控件在初始化之前,可以根据用户需求对指定列进行排序,其代码如下: 

ListView1.Sorted = True 'listivew的排序属性为True, ListView控件将对指定列进行排序,属性为FalseListView控件将不具有排序功能。 

ListView1.SortKey = 0  '   0listivew排序的列索引号,0为第1列、1为第2,以此类推,若此项属性值未设置,ListView控件将默认按首列排序。

如果我们想点击ListView表头排序,可用以下代码实现: 

Private Sub ListView1_ColumnClick(ByValColumnHeader As MSComctlLib.ColumnHeader)

If ColumnHeader.Index - 1 > -1 Then ListView1.SortKey = ColumnHeader.Index - 1

End Sub 

3、显示方式设置 

ListView控件除了可以对数据排列格式进行设置外,还可以对数据显示方式进行设置,常见的有日期显示方式、金额显示方式,以单元格F3数据加载给ListView控件第2列为例,其代码如下: 

日期显示方式: Itm.subitem1(1) = Format(Cells(3, "F"), "YYYYY-MM-DD")

金额显示方式: Itm.subitem1(1) = Format(Cells(3, "F"), "#0.00")

4、选择ListView控件任意一行,获取行号

I = ListView1.SelectedItem.Index 

5、获取ListView控件第I,首列的值 

 ListView1.ListItems(I).Text 

6、获取ListView控件第I,J列的值

ListView1.ListItems(I).SubItems(J - 1)

7、删除ListView控件第I行数据 

 ListView1.ListItems.Remove I

8、删除ListView控件所有数据

ListView1.ListItems.Clear 

9、获取ListView控件记录数

ListView1.ListItems.Count

我们对ListView控件加载表头作了较为详尽的介绍,在实际应用中,由于加载的对象 ...    

貌似应该是这样

Set Itm = ListView1.ListItems.Add()

Itm.Text = "张三" 

Itm.subitems(1) = ""

Itm.subitems(2) = "大学" 

Itm.subitems(3) = "南京市白下区" 

Itm.subitems(4) = "320123196610162018" 

以上是加载1个人的信息,若现在有一张excel表格,其表名为《员工信息表》,该表首行为姓名、性别、文化、住址、身份证标题,从第2行到100行是99个人的个人信息,现在要将这99个人的个人信息加载到ListView控件中,可用循环方法实行,代码如下:

For i = 2 To 100 

Set Itm = ListView1.ListItems.Add()

Itm.Text = Cells(i, 1) 

Itm.subitems(1) = Cells(i, 2)

Itm.subitems(2) = Cells(i, 3)

Itm.subitems(3) = Cells(i, 4)

Itm.subitems(4) = Cells(i, 5)

Next

 


路过

雷人

握手

鲜花

鸡蛋

发表评论 评论 (12 个评论)

回复 liulang0808 2014-8-1 19:34
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1142453&pid=7783823  字典去重及数组排序
回复 liulang0808 2014-8-1 21:22
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1142440&pid=7783944字典去重,删除重复列
回复 liulang0808 2014-8-1 21:23
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1142464&pid=7783960 表格事件,find需求结果
回复 liulang0808 2014-8-5 18:18
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1143266&pid=7790182 字典按照日期及姓名提取数据
回复 liulang0808 2014-8-6 08:37
Range("a3:e" & a - 1).Borders.LineStyle = xlContinuous 设置边框
回复 liulang0808 2014-8-9 20:22
字符串处理函数整理,附件有部分函数详解
http://club.excelhome.net/thread-1144216-1-1.html
回复 liulang0808 2014-9-13 20:19
2014-9-13
请教老师:如何编写代码来代替excel函数的运算,谢谢!
http://club.excelhome.net/thread-1151594-1-1.html


http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1151594&pid=7849514
回复 liulang0808 2014-9-14 08:36
如何根据日期自动汇总
http://club.excelhome.net/thread-1151893-1-1.html


http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1151893&pid=7850318
回复 liulang0808 2014-11-27 22:07
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1168828&pid=7967741
回复 liulang0808 2014-12-17 19:59
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1173425&pid=7999741
2014-12-17
回复 liulang0808 2015-6-23 20:36
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1213107&pid=8264415
回复 liulang0808 2015-6-26 08:26
http://club.excelhome.net/forum.php?mod=redirect&goto=findpost&ptid=1213599&pid=8267706

facelist

您需要登录后才可以评论 登录 | 免费注册

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-25 16:56 , Processed in 0.033421 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

返回顶部