本类文章的标签为 ‘名称’


在一个列表框中显示另一列表框中的具体内容

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

有时,需要选中某列表框的的项目后,在另一列表框中显示该项目的具体内容,如下图1所示。
listboxselect1
图1:两个列表框实现内容匹配
“专业工程”包括“建筑工程、装饰装修工程……”等,当选中项目列表框中的专业工程后,在分类列表框中显示相应的内容。同理,选择项目列表框中的措施项目后,在分类列表框中也会显示相应的内容。
第一步:准备数据
如下图2所示,在工作表Sheet1中输入下列数据。
listboxselect2
图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 Sub
 
Private Sub UserForm_Initialize()
    Dim rngItem As Range
 
    Set rngItem = Sheet1.Range("项目")
 
    Me.lbxItem.List = rngItem.Value
End Sub

运行后的最终效果如图1所示。当然,您可以在A列添加更多的项目数据,然后在C列、D列……添加相应的内容并以A列的数据命名,从而扩展本实例。
(注:网站空间被删前的文章,有一定的学习意义,故找出来重新贴出之)

相关文章

VBA中名称的使用

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 4.00 out of 5)
Loading ... Loading ...

我们知道,通过在工作表中定义名称,可以更好地管理工作表数据,方便编写公式和设置表格。同样,在VBA中也可以创建和使用名称,也能利用名称方便地处理工作表中的数据。
在VBA中名称的基本操作
1、创建名称
① 可以使用下面的代码在当前工作簿中创建名称:

ActiveWorkbook.Names.Add Name:="MyName", RefersToR1C1:="=Sheet1!R2C2:R6C4"

或者

ActiveWorkbook.Names.Add Name:="MyName", RefersTo:="=Sheet1!$B$2:$D$6"

代码将当前工作簿中工作表Sheet1的单元格区域B2:D6命名为MyName,该名称为全局名称。
注意,在名称中不能出现空格和单元格引用,并且如果对命名区域使用A1样式的引用,那么最好使用绝对引用,否则所命名的区域将会不确定。
在名称前加上工作表名,将创建局部名称,例如:

ActiveWorkbook.Names.Add Name:="Sheet1!MyName1", RefersTo:="=Sheet1!$B$2:$D$6"

上面的代码在工作表Sheet1中将单元格区域B2:D6命名为MyName1,该名称为局部名称。
也可以通过引用指定的工作表创建局部名称,例如:

Worksheets("sheet2").Names.Add Name:="MyName2", RefersTo:="=Sheet2!$A$1:$B$3"

上面的代码在工作表Sheet2中创建一个局部名称MyName2,代表Sheet2中的单元格区域A1:B3。
② 一种简单的命名方法。例如:

Worksheets("Sheet1").Range("B8:C10").Name = "MyName3"

上面的代码将工作表Sheet1中的单元格区域B8:C10命名为MyName3,该名称为全局名称。

Worksheets("Sheet2").Range("H15:G16").Name = "Sheet2!MyName4"

上面的代码将工作表Sheet2中的单元格区域H15:G16命名为MyName4,该名称为局部名称。
注意,这种方法只能应用于命名单元格区域,不能够用来命名公式、数字等。
③ 在当前工作表中命名局部区域,该区域为其它工作表中的单元格区域。

Worksheets("Sheet1").Range("E6:F8").Name = "Sheet2!MyName5"

或者:

Worksheets("sheet2").Names.Add Name:="MyName5", RefersTo:="=Sheet1!$E$6:$F$8"

上面的代码在工作表Sheet2中命名工作表Sheet1中单元格区域E6:F8为MyName5,该名称为Sheet2中的局部名称。
④ 命名数字。例如:

Names.Add Name:="NameNumber", RefersTo:=666

将数字666命名为NameNumber。
⑤ 命名字符串。例如:

Names.Add Name:="NameString", RefersTo:="TV"

将字符串TV命名为NameString。
⑥ 命名数组。例如:

Dim MyArray(10)
Dim i As Integer
For i = 1 To 10
   MyArray(i) = i
Next i
Names.Add Name:="NameArray", RefersTo:=MyArray

上述代码先对数组赋值,然后指定名称。
⑦ 命名公式。例如:

Names.Add Name:="NameFormlas", RefersTo:="=OFFSET(Sheet1!$A$1,0,0,COUNTA(Sheet1!$A:$A),1)"

上面的代码命名了一个公式,可以用来创建动态表格或引用动态的区域。
使用上面的方法命名数字、字符串、数组或公式,在名称中存储经常要使用的值,比将该值存放在单元格中更有优势,它可以避免该值被易外修改并减少了对象的引用。
2、重命名已有的名称

Worksheets("Sheet2").Names("MyName5").Name = "MyName6"

上面的代码将工作表Sheet2中的局部名称MyName5改名为MyName6。但这种方法只能在单元格或单元格区域中进行重命名使用,而不能重命名代表公式、数组和字符串的名称。
3、改变所选区域所命名的名称的引用区域

Worksheets("Sheet1").Names.Add Selection.Name.Name,Sheet1.Range("B3:C4")

上面的代码将原来所选区域的名称的引用区域改为单元格区域B3:C4,即该名称所代表的区域已变为B3:C4,原来命名区域名称被取消。
4、提取命名区域
使用Evaluate方法,例如:

Evaluate("MyName").Interior.ColorIndex = 3

将工作表中名称MyName所代表的单元格区域的背景设置为红色。
5、隐藏名称

Names.Add Name:="HideName", RefersTo:="=$A$1:$C$3", Visible:=False

将隐藏所创建的名称。注意,如果以后创建的名称与所隐藏的名称相同,则被隐藏的名称将被覆盖。
6、删除名称

Names("MyName3").Delete

上面的代码删除当前工作簿中的名称MyName3。
注意,当前工作簿中重命名已有名称和删除名称时,要注意所要操作的名称是全局名称还是局部名称。如果为局部名称,则必须在代码中加上该名称所在工作表的引用。
命名名称注意事项
名称的最大长度为255个字符。

  • 名称可以字母、空格或下划线开头。
  • 名称中不能包含空格、连字线等字符。
  • 避免命名与单元格引用相同的名称,如A1、G11等。
  • 避免在名称中使用Excel的保留字,如:Criteria、Database、Extract、Print_Area、Print_Titles等。

一些示例
[示例1] 检查当前工作簿中某名称是否存在

Sub test()
  Dim str As Boolean
  str = NameExists("myName")
  If str = True Then
    MsgBox "该名称存在于当前工作簿中."
  Else
    MsgBox "该名称不存在."
  End If
End Sub
Function NameExists(FindName As String) As Boolean
  Dim rng As Range
  Dim myName As String
  On Error Resume Next
  myName = ActiveWorkbook.Names(FindName).Name
  If Err.Number = 0 Then NameExists = True
End Function

或者:

Function NameExists(TheName As String) As Boolean
  On Error Resume Next
  NameExists = Len(ThisWorkbook.Names(TheName).Name) <> 0
End Function

[示例2]使工作簿中的所有名称可见

Sub UnHideName()
  Dim Nm As Name
  For Each Nm In Names
    Nm.Visible = True
  Next
End Sub

[示例3]列出当前工作簿中所有名称的相关信息

Sub ShowNames()
  Dim N As Integer
  For N = 1 To ActiveWorkbook.Names.Count
    On Error Resume Next
    Cells(N, 1) = "'" & ActiveWorkbook.Names(N).Name
    Cells(N, 2) = "'" & ActiveWorkbook.Names(N).RefersToRange.Address
    Cells(N, 3) = "'" & ActiveWorkbook.Names(N).ShortcutKey
    Cells(N, 4) = "'" & ActiveWorkbook.Names(N).Visible
  Next
End Sub

[示例4]显示当前单元格所命名的名称

Sub ShowNames_activecell()
  On Error Resume Next
  MsgBox ActiveCell.Name.Name
  Select Case Err.Number
    Case 0
    Case 1004
      MsgBox "单元格" & ActiveCell.Address(4) & “没有命名。”
    Case Else
      MsgBox Err.Number & " -- " & Err.Description
  End Select
End Sub

示例说明:如果要获取指定单元格所定义的名称,可以使用Name属性两次。
[示例5]删除当前工作簿中含有“name”字符的名称

Sub DeleteName()
  Dim Nm As Name
  For Each Nm In ActiveWorkbook.Names
    If Nm.Name Like "*name*" Then
      Nm.Delete
    End If
  Next Nm
End Sub

[示例6] 判断某单元格或单元格区域是否与命名区域部分重叠

Function NameOfParentRange(Rng As Range) As String
  Dim Nm As Name
  For Each Nm In ThisWorkbook.Names
    If Rng.Parent.Name = Nm.RefersToRange.Parent.Name Then
      If Not Application.Intersect(Rng, Nm.RefersToRange) Is Nothing Then
        NameOfParentRange = Nm.Name
        Exit Function
      End If
    End If
  Next Nm
  NameOfParentRange = ""
End Function

示例说明:如果Rng所代表的单元格或单元格区域与命名区域相交叉,则返回命名区域的名称,否则返回空。
名称的高级操作
(下面的内容整理自Chip Pearson的文章)
[增大名称框的尺寸]
在Excel 2003及以前工作表的名称框中(如图1所示),大约只能显示16个字符,当超过它所能容纳的字符时,后面的字符将会被截取,因而不能看到完整的名称,这对前面的字符相同而最后几个字符不相同的名称来说,很不方便,但是在Excel中没有改变名称框尺寸的设置(Excel 2007改进了这一步,可以通过拖拉增加或减小名称框的尺寸),这个问题可以通过调用Windows API来解决。下面的代码通过调用API来增加下拉框的宽度。
在VBE编辑器中插入一个标准模块,并输入以下的代码:

Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
    ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
Public Declare Function SendMessage Lib "user32" Alias "SendMessageA" _
    (ByVal hwnd As Long, ByVal wMsg As Long, _
    ByVal wParam As Long, lParam As Any) As Long
 
Sub WidenNameBoxDrop2()
    Dim Res As Long
    Const CB_SETDROPPEDWIDTH = &H160
    Const cWidth = 400 '<<<<<<<<<<<<<<<<<<<<<<
    Res = SendMessage( _
            FindWindowEx( _
                FindWindowEx( _
                    FindWindow("XLMAIN", Application.Caption) _
                , 0, "EXCEL;", vbNullString) _
            , 0, "combobox", vbNullString), _
          CB_SETDROPPEDWIDTH, cWidth, 0)
End Sub

示例说明:上述代码运行前后的结果如图1和图2所示。在上面的代码中,可以通过改变常量cWidth(<<<所示的代码行)的值来定义下拉框的宽度。
NameInVBA1 图1:原名称框
NameInVBA2 图2:修改后的名称框
[为名称框定义快捷键]
Excel提供的快捷键中没有名称框的快捷键。但是,您能使用VBA代码设置快捷键,以方便能快速定位到名称框。
在VBE编辑器中,插入一个标准模块,并输入以下代码:

Public Declare Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
Public Declare Function FindWindow Lib "user32" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Public Declare Function FindWindowEx Lib "user32" Alias "FindWindowExA" _
    (ByVal hWnd1 As Long, ByVal hWnd2 As Long, _
     ByVal lpsz1 As String, ByVal lpsz2 As String) As Long
 
Sub SetFocusNameBox()
    Dim Res As Long
    Res = SetFocus( _
        FindWindowEx( _
            FindWindowEx( _
                FindWindow("XLMAIN", Application.Caption) _
                    , 0, "EXCEL;", vbNullString) _
                    , 0, "combobox", vbNullString))
End Sub

在Excel中,选择菜单“工具——宏——宏”命令,调出“宏”对话框,为刚创建的SetFocusNameBox代码指定快捷键,如Ctrl+Shift+N。那么,以后在该工作簿中,按下Ctrl+Shift+N组合键,即可定位到名称对话框。

相关文章

使用Excel开发简易的零星工程项目管理系统

1 颗星2 颗星3 颗星4 颗星5 颗星 (1 人投票, 平均: 4.00 out of 5)
Loading ... Loading ...

在工作中,零星工程项目是最令人头疼的,又杂又乱,项目繁多且大小不一,一直不好管理。这几天,试着利用Excel做了一个简易的零星工程项目管理系统,以方便对零星工程项目的管理。当然,先试用,然后再作进一步的改进和完善。大家如果有兴趣,可以下载附件的示例,给我提提意见或建议。
#1对于简单的数据库,Excel是一个好的选择。设计良好的Excel工作表和结构可以帮助很好地组织和管理数据,并制作报表)
设计数据输入工作表
下面是数据工作表,名为“工程清单”,共15列。
projectmanagementsimple1
除序号外,其它列的信息为项目信息和跟踪信息。
考虑到查询的需要,当输入一个新项目后,有一些必填项,因此,在工作表中使用了条件格式,如果这些必填项未填写,该行将呈现红色,如下图所示。
projectmanagementsimple2
只有当必填项填写完成,红色才消失。
条件格式公式如下:

=AND($A2<>“”,OR($E2=”",$G2=”",$I2=”",$K2=”",$M2=”",$N2=”"))

即当第1列不为空时,列E、列G、列I、列K、列M、列N必须要有输入。
#2防错性设计。即利用Excel提供的功能提示用户必须的操作或不需要的操作)
同时,动态命名工作表中的列表数据。

名称:ProjectList
公式:=OFFSET(工程清单!$B$1,0,-1,COUNTA(工程清单!$B:$B),15)

这样,添加数据后,命名区域立即更新。
#3动态命名。使用公式动态命名区域,可以保持使用工作表中最新的数据。)
设计查询工作表
在“工作查询”工作表中,选择相应的查询条件后,下方显示满足条件的所有数据记录。
projectmanagementsimple3
黄色单元格区域可以选择条件。选择后,相应的记录在下方显示。
在这个工作表中,有5个命名区域:

SelSQ=工作查询!$B$3
SelMKS=工作查询!$C$3
SelWG=工作查询!$B$6
SelYS=工作查询!$C$6
SelEmployee=工作查询!$F$3
ExtractProjects=工作查询!$A$8:$O$8

其中,B3、C3、B6、C6都使用了简单的数据有效性,F3中的数据有效性使用了名称,即“人员列表”工作表中获取人员姓名(下文讲述)。
该工作表模块对应的代码为:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rngCrit As Range
    Set rngCrit = Nothing
    Application.EnableEvents = False
    On Error GoTo exitHandler
    Select Case Target.Address
        Case Range("SelSQ").Address
            Set rngCrit = wksCrit.Range("CriteriaSQ")
            Range("SelMKS").ClearContents
            Range("SelWG").ClearContents
            Range("SelYS").ClearContents
            Range("SelEmployee").ClearContents
        Case Range("SelMKS").Address
            Set rngCrit = wksCrit.Range("CriteriaMKS")
            Range("SelSQ").ClearContents
            Range("SelWG").ClearContents
            Range("SelYS").ClearContents
            Range("SelEmployee").ClearContents
        Case Range("SelWG").Address
            Set rngCrit = wksCrit.Range("CriteriaWG")
            Range("SelSQ").ClearContents
            Range("SelMKS").ClearContents
            Range("SelYS").ClearContents
            Range("SelEmployee").ClearContents
        Case Range("SelYS").Address
            Set rngCrit = wksCrit.Range("CriteriaYS")
            Range("SelSQ").ClearContents
            Range("SelMKS").ClearContents
            Range("SelWG").ClearContents
            Range("SelEmployee").ClearContents
        Case Range("SelEmployee").Address
            Set rngCrit = wksCrit.Range("CriteriaEmployee")
            Range("SelSQ").ClearContents
            Range("SelMKS").ClearContents
            Range("SelWG").ClearContents
            Range("SelYS").ClearContents
    End Select
 
    If Not rngCrit Is Nothing Then
        rngCrit.Cells(2, 1).Value = Target.Value
        wksProjects.Range("ProjectsList").AdvancedFilter _
            Action:=xlFilterCopy, _
            CriteriaRange:=rngCrit, _
            CopyToRange:=Range("ExtractProjects"), _
            Unique:=False
    End If
 
exitHandler:
    Application.EnableEvents = True
    Exit Sub
errHandler:
    Resume exitHandler
End Sub

代码前段的Case语句表示,当选择其中一个命名区域时,将查询条件工作表(下文介绍)中对应的查询条件区域赋值给对象变量,将其它命名区域清空。
代码后段表示,将当前区域的值赋给相应的查询条件区域,然后利用该区域的值作为高级筛选的筛选条件,并将筛选后的结果复制到当前工作表指定区域。
#4高级筛选。利用高级筛选获取所需要的数据)
设计查询条件工作表
每一个用于筛选的条件,都存放在“查询条件”工作表中。
projectmanagementsimple4
这样,在“工作查询”工作表中选择相应的条件后,“查询条件”工作表中相应的值得到更新,并在高级筛选中应用。
“查询条件”工作表中命名的区域为:

CriteriaSQ=查询条件!$B$1:$B$2
CriteriaMKS=查询条件!$D$1:$D$2
CriteriaWG=查询条件!$F$1:$F$2
CriteriaYS=查询条件!$H$1:$H$2
CriteriaEmployee=查询条件!$J$1:$J$2

人员列表
在“人员列表”工作表中,使用数据透视表功能从工程清单中获取人员名单,并在筛选条件中使用。
projectmanagementsimple5
在该工作表中,定义了动态名称用于获取最新的人员列表:

EmployeeList=OFFSET(人员列表!$B$3,1,0,COUNTA(人员列表!$B:$B)-COUNTA(人员列表!$B$1:$B$3),1)

同时,当工作簿刚打开时,以及切换“工程清单”工作表时,更新数据透视表,以获取最新的数据:

Private Sub Workbook_Open()
    Dim pt As PivotTable
    For Each pt In wksLists.PivotTables
        pt.RefreshTable
    Next pt
End Sub
 
Private Sub Worksheet_Deactivate()
    Dim pt As PivotTable
    For Each pt In wksLists.PivotTables
        pt.RefreshTable
    Next pt
End Sub

#5数据透视表。使用数据透视表可以容易地获得所需要的数据)
完整的示例
“工程清单”工作表用于输入数据,“工作查询”工作表用于查询,以便了解工作实施进展情况。“查询条件”和“人员列表”工作表不需要做任何操作。

示例下载

应用演示

注:本示例的灵感来源于http://blog.contextures.com中的文章《Create a Movie Collection Database in Excel》。

相关文章

在数据有效性中动态添加项目

1 颗星2 颗星3 颗星4 颗星5 颗星 (目前还没有人投票)
Loading ... Loading ...

使用名称和公式,我们可以动态更新数据有效性中的项目,而不必每次调出数据有效性对话框来修改。

通常,我们可以将项目数据存放在一个单独的工作表中,以便不会受到数据工作表操作时的影响。例如,我们需要在数据工作表Sheet1中定义数据有效性,此时我们可以在工作表Sheet2中放置数据有效性项目,比如在Sheet2的列A。使用“定义名称”命令,调出“新建名称”对话框,在“名称”文本框中输入名称,本例中为“公司名称”,选择“范围”为工作簿,在“引用位置”中输入公式:

=OFFSET(Sheet2!$A$1,0,0,COUNTA(Sheet2!$A:$A),1)

然后,选择工作表Sheet1中需要定义数据有效性的单元格,在“数据有效性”对话框中“允许”下拉表中选择“序列”,在“来源”中输入公式:

=公司名称

此时,当您在Sheet2的列A中添加项目后,数据有效性项目会自动更新。
录制了一段操作视频:

相关文章