存档在 ‘列表框’ 分类中.
2008年11月10日, 1:14 pm | 307 次阅读
有时,我们需要从用户窗体的文本框中复制数据,然后将其粘贴到其它地方。下面举例说明具体的操作方法。
示例一:如下图1所示,在示例窗体中有一个文本框和一个命令按钮。当窗体被激活时,文本框中自动显示文字“完美Excel”,单击“复制”按钮后,将文本框中的数据复制到剪贴板。

test11
图1:带有文本框和命令按钮的用户窗体
首先,按图1设计好用户窗体界面。然后,在该用户窗体模块中,输入下列代码:
Dim myClipboard As New DataObject
Private Sub UserForm_Activate()
Me.TextBox1.Value = “完美Excel”
End Sub
Private Sub CommandButton1_Click()
With myClipboard
.SetText Me.TextBox1.Text
.PutInClipboard
End With
End Sub
示例二:在用户窗体中有多个文本框,要求单击按钮后将有数据的文本框中的数据全部复制到剪贴板。

test21
图2:带有6个文本框和1个命令按钮的用户窗体
首先,按图2设计好用户窗体界面。然后,在用户窗体模块中,输入下列代码:
Dim strUnion As String
Private Sub CommandButton1_Click()
Dim dObj As DataObject
With Me
If Not .TextBox1 = Empty Then strUnion = strUnion & .TextBox1
If Not .TextBox2 = Empty Then strUnion = strUnion & vbCrLf & .TextBox2
If Not .TextBox3 = Empty Then strUnion = strUnion & vbCrLf & .TextBox3
If Not .TextBox4 = Empty Then strUnion = strUnion & vbCrLf & .TextBox4
If Not .TextBox5 = Empty Then strUnion = strUnion & vbCrLf & .TextBox5
If Not .TextBox6 = Empty Then strUnion = strUnion & vbCrLf & .TextBox6
End With
Set dObj = New DataObject
dObj.SetText strUnion, 1
dObj.PutInClipboard
End Sub
2008年10月11日, 11:33 am | 283 次阅读
有时,需要选中某列表框的的项目后,在另一列表框中显示该项目的具体内容,如下图1所示。

图1:两个列表框实现内容匹配
“专业工程”包括“建筑工程、装饰装修工程……”等,当选中项目列表框中的专业工程后,在分类列表框中显示相应的内容。同理,选择项目列表框中的措施项目后,在分类列表框中也会显示相应的内容。
第一步:准备数据
如下图2所示,在工作表Sheet1中输入下列数据。

图2:基础数据
将A列的数据命名为“项目”,将B列的数据命名为“专业工程”,将C列的数据命名为“措施项目”。注意,B列和C列的名称应与A列的数据相一致。
第二步:准备窗体界面
如图1所示,在用户窗体中放置两个标签控件、两个列表框控件,并将两个列表框控件分别命名为lbxItem和lbxCategory。
第三步:输入代码
在用户窗体代码模块中,输入下列代码:
Private Sub lbxItem_Change()
Dim rngCategory As Range
Set rngCategory = Sheet1.Range(Me.lbxItem.Value)
Me.lbxCategory.List = rngCategory.Value
End SubPrivate Sub UserForm_Initialize()
Dim rngItem As Range
Set rngItem = Sheet1.Range(”项目”)
Me.lbxItem.List = rngItem.Value
End Sub
运行后的最终效果如图1所示。当然,您可以在A列添加更多的项目数据,然后在C列、D列……添加相应的内容并以A列的数据命名,从而扩展本实例。
2008年10月07日, 3:09 pm | 506 次阅读
在使用Google搜索时,当在输入框中输入时,下方会出现相关条目供选择,以方便快速输入。下面,我们在Excel用户窗体中使用文本框和列表框来仿造这样的效果。
有时,当用户窗体中的列表框包含大量的项目时,我们必须拖动其滚动条来查找相应的项目。然而,可以利用一些技巧快速找到所需的项目。
如图1所示,在用户窗体中,放置有两个控件,上方为一名为txtFind的文本框,下方为一名为lbxData的列表框,列表框的数据来自工作表Data的列A中的数据。

图1
当我在上方的文本框txtFind中输入“excel vba”后,下方的列表框lbxData将只出现包含有“excel vba”的条目,如图2所示。

图2
实现上述效果的VBA代码如下:
Option Explicit
Dim varDataPrivate Sub txtFind_Change()
Dim i As Long
Dim strFind As String
strFind = “*” & UCase(Me.txtFind.Text) & “*”
With Me.lbxData
.List = varData
For i = .ListCount - 1 To 0 Step -1
If Not UCase(.List(i)) Like strFind Then
.RemoveItem i
End If
Next i
End With
End Sub
Private Sub UserForm_Initialize()
Dim lLast As Long
Dim rng As Range
lLast = Sheet1.Range(”A” & Cells.Rows.Count).End(xlUp).Row
varData = Sheet1.Range(”A1:A” & lLast)
Me.lbxData.List = varData
End Sub
我们可以将UserForm_Initialize代码块中的代码Me.lbxData.List = varData删除,这样当在文本框txtFind中输入时,只要输入的数据符合列表框包含的数据,列表框中将自动出现相关条目并随着输入的进一步具体条目相应减少至完全匹配输入的数据,如图3、4、5所示。

图3:初始化后的用户窗体

图4:开始输入后,列表框中的条目随着文本框中输入的数据而变化

图5:文本框中的数据越具体,列表框中的条目也越少且与文本框输入相匹配
此外,在Excel 2000及以后的版本中,VBA提供了一个Filter函数,使用该函数,也能实现上述效果。代码如下:
Option Explicit
Private Sub txtFind_Change()
Dim varData As Variant
varData = Range(”A1″, Cells(Rows.Count, 1).End(xlUp)).Value
varData = Application.Transpose(varData)
varData = Filter(SourceArray:=varData, _
Match:=txtFind.Value, _
Include:=True, _
Compare:=vbTextCompare)
Me.lbxData.List = varDataEnd Sub
Private Sub UserForm_Initialize()
Me.lbxData.List = Range(”A1″, Cells(Rows.Count, 1).End(xlUp)).Value
End Sub
示例文档下载:ListBoxFilter.rar