如何实现表间查询并提取班级号
今天下午在整理学生模块成绩时,突然发现学生的模块成绩表中的班级是教学班,而发展报告是要求按行政班进行填写的.就有个问题了:如何按学籍号(因为发展报告只需要用学籍的学生填写),而现在就要把模块成绩表中的班级号改成行政班号.其实以前也遇到过类似问题,都是用笨法,复制/粘贴然后排序,一个个的查找看看是否有漏掉的.实在是麻烦,现在可以利用Excel中的函数Match来解决了.
原理:
返回在指定方式下与指定数值匹配的数组 (数组:用于建立可生成多个结果或可对在行和列中排列的一组参数进行运算的单个公式。数组区域共用一个公式;数组常量是用作参数的一组常量。)中元素的相应位置。如果需要找出匹配元素的位置而不是匹配元素本身,则应该使用 MATCH 函数而不是 LOOKUP 函数。
语法
MATCH(lookup_value,lookup_array,match_type)
Lookup_value 为需要在数据表中查找的数值。
-
Lookup_value 为需要在 Look_array 中查找的数值。例如,如果要在电话簿中查找某人的电话号码,则应该将姓名作为查找值,但实际上需要的是电话号码。
-
Lookup_value 可以为数值(数字、文本或逻辑值)或对数字、文本或逻辑值的单元格引用。
Lookup_array 可能包含所要查找的数值的连续单元格区域。Lookup_array 应为数组或数组引用。
Match_type 为数字 -1、0 或 1。Match-type 指明 Microsoft Excel 如何在 lookup_array 中查找 lookup_value。
-
如果 match_type 为 1,函数 MATCH 查找小于或等于 lookup_value 的最大数值。Lookup_array 必须按升序排列:...、-2、-1、0、1、2、...、A-Z、FALSE、TRUE。
-
如果 match_type 为 0,函数 MATCH 查找等于 lookup_value 的第一个数值。Lookup_array 可以按任何顺序排列。
-
如果 match_type 为 -1,函数 MATCH 查找大于或等于 lookup_value 的最小数值。Lookup_array 必须按降序排列:TRUE、FALSE、Z-A、...、2、1、0、-1、-2、...,等等。
-
如果省略 match_type,则假设为 1。
说明
- 函数 MATCH 返回 lookup_array 中目标值的位置,而不是数值本身。例如,MATCH("b",{"a","b","c"},0) 返回 2,即“b”在数组 {"a","b","c"} 中的相应位置。
- 查找文本值时,函数 MATCH 不区分大小写字母。
- 如果函数 MATCH 查找不成功,则返回错误值 #N/A。
- 如果 match_type 为 0 且 lookup_value 为文本,lookup_value 可以包含通配符、星号 (*) 和问号 (?)。星号可以匹配任何字符序列;问号可以匹配单个字符。
现在要实现的是如何在VBA中调用此函数,以实现自动化.
下面是两张样表,其中表1为学生的学籍号及行政号,表2为学生的模块成绩及教学班号,现在要做的是如何用模块成绩中的学籍号在表1中查找此号对应的行政班号,并把班号填入表2中的班级列中?
表1:
表2:
源程序如下:
Sub 更改为行政班号()
Dim totalR, i, j, k, bj As Integer
Dim mycell As Range
Dim xjh As String
Workbooks("一中学期模块学习和评价记录表.xls").Activate
Worksheets("sheet2").Activate
Workbooks("第5学段模块成绩.xls").Activate
totalR = Range("A65536").End(xlUp).Row
For i = 2 To totalR
xjh = Range(Cells(i, 3), Cells(i, 3)).Value
Workbooks("一中学期模块学习和评价记录表.xls").Activate
On Error Resume Next '困惑我很久了,今天终于解决了!!!
k = Application.WorksheetFunction.Match(xjh, Range("D1:D1100 "), 0)
bj = Range(Cells(k, 2), Cells(k, 2)).Value
Debug.Print k & " " & xjh & "行政班号为:" & bj
Workbooks("第5学段模块成绩.xls").Activate
Range(Cells(i, 1), Cells(i, 1)).Value = "ww" & bj
Next i
End Sub
反思:其中k = Application.WorksheetFunction.Match(xjh, Range("E1:E1100 "), 0)是最容易出错的,因为若xjh在Range("E1:E1100")若不存在,则会报错(1004).所以在此语句前加了一句:On Error Resume Next 避免出错后,程序不再执行.
程序执行后的效果表如下图所示:(特别注意第2行的数据,故意设置了一个在表1中没有数据,检测程序是否执行!!)