利用ExcelVBA插件实现证件信息批量校验
利用ExcelVBA插件实现证件信息批量校验

利用ExcelVBA插件实现证件信息批量校验作者:宋义河来源:《计算机光盘软件与应用》2012年第24期摘要:使用Excel表格实现证件申请信息批量填报,并按要求对有关内容进行有效性校验。
通过分析JPG格式图片文件的结构,自行编写代码获取图片尺寸等信息。
利用ExcelVBA 插件,实现了证件提报信息批量校验。
关键词:ExcelVBA插件;JPG图片文件;有效性校验中图分类号:TP311 文献标识码:A 文章编号:1007-9599 (2012) 24-0004-031 引言举办重要会议、活动时,通常需要为与会人员制作发放专用证件。
因为与会人员数量较多,逐一录入效率很低,一般情况下采用批量提报的方式采集数据。
目前,我单位使用公安部第一研究所开发的证件管理软件制作证件,该软件使用Excel表格批量导入制证信息。
申请单位按要求将申请人姓名、身份证号码、单位等信息填入既定格式的Excel表格,与申请人照片保存在同一文件夹内打包提报。
照片文件为JPG格式,以申请人姓名加“-”再加出生日期命名,如“张三-19810213.JPG”。
为了保证照片质量,通常需要对照片尺寸和文件大小提出要求,如照片尺寸指定为413×579像素,文件大小不超过300K。
这种数据采集方式大大减轻了制证人员的工作量,提高了工作效率。
在实际应用中我们也遇到了一些问题:一是导入信息时缺少照片。
有些是因为确实漏报了照片,有些是因为照片不是JPG格式,更多的是因为照片文件命名错误,比如姓名、出生日期与表格内容不一致,文件名中有多余空格,以及因为扩展名被隐藏而在文件名中多输入了“.JPG”,把照片文件命名成类似“张三-19810213.JPG.JPG”的情况。
二是提交的照片不符合要求。
普遍存在尺寸不符的情况,并且很多照片的宽高比例不合适,制作证件时因为拉伸而严重变形。
三是普遍反映填报信息时效率不高。
特别是命名照片文件时,一一核对出生日期比较麻烦,很容易出现错误。
Excel高级技巧使用宏和VBA编程实现数据校验和验证

Excel高级技巧使用宏和VBA编程实现数据校验和验证Microsoft Excel是一款功能强大的电子表格软件,广泛应用于各个领域中的数据处理和分析工作。
除了基本的数据输入和计算功能外,Excel还提供了多种高级技巧,其中包括使用宏和VBA编程来实现数据校验和验证。
本文将介绍Excel中的高级技巧,以及如何使用宏和VBA编程来实现数据校验和验证。
一、Excel高级技巧概述Excel提供了许多高级技巧,可以帮助用户更高效地处理和分析数据。
其中包括使用函数、公式、数据透视表、条件格式化等功能。
这些高级技巧能够帮助用户在Excel中更好地进行数据处理和分析,提高工作效率。
二、Excel宏的使用宏是一系列的动作和命令的组合,可以录制和保存,从而实现一键执行多个操作的目的。
在Excel中,通过录制宏,用户可以自动执行繁琐的操作,提高工作效率。
录制宏的步骤如下:1. 打开Excel,并进入“开发工具”选项卡;2. 点击“录制宏”按钮,弹出录制宏的对话框;3. 在对话框中输入宏的名称和快捷键(可选),并选择宏的存储位置;4. 点击“开始录制”按钮,进行宏的录制;5. 执行需要录制的操作,例如插入新行、格式调整等;6. 完成录制后,点击“停止录制”按钮。
在录制宏后,用户可以通过点击宏按钮或通过快捷键执行录制的操作,从而实现自动化处理。
三、VBA编程及其在Excel中的应用VBA(Visual Basic for Applications)是一种基于Visual Basic开发的编程语言,它提供了强大的编程功能,可以在Excel中进行高级数据处理和操作。
VBA的使用步骤如下:1. 打开Excel,并进入“开发工具”选项卡;2. 点击“Visual Basic”按钮,进入VBA编辑器;3. 在VBA编辑器中,选择“插入”->“模块”,新建一个模块;4. 在模块中编写VBA代码,实现所需的数据校验和验证功能;5. 编写完成后,点击“运行”按钮或使用快捷键运行编写的VBA代码。
VBA如何实现Excel中的数据自动校验

VBA如何实现Excel中的数据自动校验在Excel中,数据的准确性对于数据分析和决策制定至关重要。
一个常见的问题是在数据输入时出现错误,这可能导致分析结果的不准确。
为了解决这个问题,我们可以利用VBA(Visual Basic for Applications)编程语言来实现Excel中的数据自动校验。
数据校验是一种确保数据准确性的有效方法。
它通过检查数据输入的有效性、范围、格式和关联性来防止错误数据进入Excel工作表。
下面将介绍一些常用的VBA技巧和方法,来实现数据自动校验。
首先,我们可以使用VBA来定义数据输入的有效性。
有效性规则可以根据具体的数据类型和需求进行定义。
例如,我们可以要求某一列的值只能是特定的文本或数字,或者要求某一列的值必须在一个特定的范围内。
通过在数据输入之前添加数据有效性规则,我们可以确保数据的准确性。
以下是一个示例代码,用于定义某一列只能接受特定文本输入的有效性规则:``` vbaSub SetValidation()Dim rng As Range' 设置有效性规则的范围Set rng = Range("A1:A10")' 清除现有的有效性规则rng.Validation.Delete' 添加新的有效性规则With rng.Validation.Add Type:=xlValidateList, Formula1:="Apple, Banana, Orange".IgnoreBlank = True.InCellDropdown = TrueEnd WithEnd Sub```以上代码中,我们首先指定了有效性规则的范围,然后清除了该范围内现有的有效性规则。
接下来,我们使用 `Add` 方法来添加新的有效性规则,其中`Type:=xlValidateList` 表示规则的类型为列表验证,`Formula1:="Apple, Banana, Orange"` 则是具体的验证列表。
在Excel中使用VBA实现数据校验

在Excel中使用VBA实现数据校验Excel是一款功能强大的电子表格软件,可以帮助我们管理和分析大量的数据。
然而,当我们需要对输入的数据进行校验时,手动逐个检查数据是一项耗时且容易出错的任务。
幸运的是,Excel提供了VBA(Visual Basic for Applications)编程语言,可以帮助我们自动实现数据校验,提高工作效率。
数据校验是确保数据的准确性和完整性的关键步骤。
通过在Excel中使用VBA,我们可以创建自定义的数据校验规则,确保输入的数据满足特定条件。
首先,我们需要打开Excel,并启用VBA编辑器。
按下ALT+F11键,即可进入VBA编辑器界面。
在VBA编辑器界面中,我们可以根据需求创建新的模块。
在模块中编写VBA代码来实现数据校验。
下面是一个简单的例子,说明如何在Excel中使用VBA实现数据校验的过程。
例子:假设我们要校验一个名为"成绩表"的Excel表格中的成绩数据。
我们需要确保所有的分数都在0到100之间。
首先,在VBA编辑器中创建一个新的模块。
在模块中编写以下VBA代码:```Sub CheckData()Dim rng As RangeDim cell As Range'设置要校验的数据范围,即成绩表的数据区域Set rng = Range("成绩表!A2:A10")'遍历数据范围中的每一个单元格For Each cell In rng'判断单元格中的数值是否在0到100之间If cell.Value < 0 Or cell.Value > 100 Then'如果不在范围内,则将单元格的背景色设置为红色cell.Interior.Color = RGB(255, 0, 0)End IfNext cellEnd Sub```在上述代码中,我们通过定义一个Range对象(rng)来设置要校验的数据范围。
利用VBA实现Excel数据的验证与限制

利用VBA实现Excel数据的验证与限制Excel是一款功能强大的电子表格软件,广泛应用于数据分析、数据处理和报表生成等领域。
而VBA(Visual Basic for Applications)是一种用于扩展Excel功能的编程语言,可以通过编写脚本来实现自动化操作和数据验证等功能。
在本文中,我们将探讨如何利用VBA实现Excel数据的验证与限制。
在Excel中进行数据验证可以帮助我们提高数据的准确性和一致性,避免不规范的数据输入。
通过VBA,我们可以自定义各种数据验证规则,并针对不同的数据类型进行验证。
首先,让我们了解一些常见的数据验证需求。
例如,我们希望在某个单元格中只能输入整数,可以使用VBA编写如下代码:```vbaPrivate Sub Worksheet_Change(ByVal Target As Range)If Intersect(Target, Range("A1")) Is Nothing Then Exit SubIf Not IsNumeric(Target.Value) Or Target.Value <>Int(Target.Value) ThenMsgBox "请输入一个整数。
"Application.EnableEvents = FalseTarget.ClearContentsApplication.EnableEvents = TrueEnd IfEnd Sub```上述代码中,我们使用Worksheet_Change事件来捕捉单元格的改变。
首先,我们通过Intersect函数判断目标单元格是否是A1单元格,如果不是,则退出子过程。
然后,我们使用IsNumeric函数判断目标单元格的值是否为数字,并结合Int函数判断是否为整数。
如果不是整数,则弹出一个消息框提示用户输入一个整数,并清空目标单元格的内容。
类似地,我们还可以实现其他类型的数据验证。
EXcel_VBA身份证号码验证

'身份证号码验证Public Function identi_check(identitynum As String) '身份证号码验证Dim jyw As Longidenti = Replace(identitynum, " ", "")If (Len(identi) > 0 And Len(identi) < 15) Or Len(identi) > 18 Thenidenti = "不正确,非15、18位"ElseIf Len(identi) = 0 Thenidenti = "不正确,为空"ElseIf Len(identi) = 15 Thenj = 0For i = 1 To 15If Not Mid(identi, i, 1) Like "[0-9]" Thenj = j + 1End IfNext iIf j > 0 Thenidenti = "不正确,包含非数字"ElseIf Val(Mid(identi, 9, 2)) > 12 Thenidenti = "不正确,月份大于12"ElseIf Val(Mid(identi, 11, 2)) > 31 Thenidenti = "不正确,日期大于31"'MsgBox identiElseidenti = ""End IfElseIf Len(identi) = 18 Then'For i = 1 To 17jyw = (Mid(identi, 1, 1) * 7 + Mid(identi, 2, 1) * 9 + Mid(identi, 3, 1) * 10 _+ Mid(identi, 4, 1) * 5 + Mid(identi, 5, 1) * 8 + Mid(identi, 6, 1) * 4 _+ Mid(identi, 7, 1) * 2 + Mid(identi, 8, 1) * 1 + Mid(identi, 9, 1) * 6 + Mid(identi, 10, 1) * 3 _+ Mid(identi, 11, 1) * 7 + Mid(identi, 12, 1) * 9 + Mid(identi, 13, 1) * 10 + Mid(identi, 14, 1) * 5 _+ Mid(identi, 15, 1) * 8 + Mid(identi, 16, 1) * 4 + Mid(identi, 17, 1) * 2)jyw = jyw Mod 11yzm = Replace("1 0 X 9 8 7 6 5 4 3 2", " ", "")If Mid(yzm, jyw + 1, 1) <> Mid(identi, 18, 1) Thenidenti = "不正确"Elseidenti = ""End If'7 9 10 5 8 4'2 1 6 3 7 9 10 5'8 4 2'Next iEnd Ifidenti_check = identi'MsgBox "yyy" & identi 'Return (identitynum) End Function。
vba 判断excel本列身份证号是否正确

Function getYjm(num)'dd = "新身份证:" & Left(xian, 6) & "19" & Right(xian, 9) & CStr(getYjm(xian)) Dim ciDIf Len(num) = 15 ThenciD = Left(num, 6) & "19" & Right(num, 9)ElseIf Len(num) = 17 Or Len(num) = 18 ThenciD = Left(num, 17)ElsegetYjm = "f"Exit FunctionEnd IfEnd IfFor i = 1 To Len(ciD)If Not IsNumeric(Mid(ciD, i, 1)) ThengetYjm = "f"Exit FunctionEnd IfNext insum = Mid(ciD, 1, 1) * 7nsum = nsum + Mid(ciD, 2, 1) * 9nsum = nsum + Mid(ciD, 3, 1) * 10nsum = nsum + Mid(ciD, 4, 1) * 5nsum = nsum + Mid(ciD, 5, 1) * 8nsum = nsum + Mid(ciD, 6, 1) * 4nsum = nsum + Mid(ciD, 7, 1) * 2nsum = nsum + Mid(ciD, 8, 1) * 1nsum = nsum + Mid(ciD, 9, 1) * 6nsum = nsum + Mid(ciD, 10, 1) * 3nsum = nsum + Mid(ciD, 11, 1) * 7nsum = nsum + Mid(ciD, 12, 1) * 9nsum = nsum + Mid(ciD, 13, 1) * 10nsum = nsum + Mid(ciD, 14, 1) * 5nsum = nsum + Mid(ciD, 15, 1) * 8nsum = nsum + Mid(ciD, 16, 1) * 4nsum = nsum + Mid(ciD, 17, 1) * 2'*计算校验位check_number = 12 - nsum Mod 11If check_number = 10 Thencheck_number = "X"End IfIf check_number = 12 Thencheck_number = "1"End IfIf check_number = 11 Thencheck_number = "0"End IfgetYjm = check_numberEnd FunctionFunction getCsrc(num, flaG)lenx = Len(num)If lenx = 15 Thenyy = "19" & Mid(xian, 7, 2)mm = Mid(num, 9, 2)dd = Mid(num, 11, 2)End IfIf lenx = 18 Thenyy = Mid(num, 7, 4)mm = Mid(num, 11, 2)dd = Mid(num, 13, 2)End Ifss = yy & "/" & mm & "/" & ddIf flaG = 0 ThenIf IsDate(ss) ThengetCsrc = ssElsegetCsrc = "1900/02/02"End IfElseIf IsDate(ss) ThengetCsrc = ssElsegetCsrc = "f"End IfEnd IfEnd FunctionFunction getSbie(num, flaG)Dim yy, mm, dd As Stringlenx = Len(num)If lenx = 15 Thenaa = Mid(num, 15, 1) '15位身分证取第十五位,能被2整除为女性End IfIf lenx = 18 Thenaa = Mid(num, 17, 1) '18位身分证取第十七位,能被2整除为女性End IfIf flaG = 0 ThenIf (Not IsNumeric(aa)) Or aa = "" Thenaa = 1End IfIf aa Mod 2 = 0 Thenxb = "女"Elsexb = "男"End IfgetSbie = xbElseIf (Not IsNumeric(aa)) Or aa = "" ThengetSbie = "f"Exit FunctionEnd IfIf aa Mod 2 = 0 Thenxb = "女"Elsexb = "男"End IfgetSbie = xbEnd IfEnd FunctionFunction banduanShengfen(num) As Boolean Dim a, b, c, da = getYjm(num)b = getCsrc(num, 1)c = getSbie(num, 1)num = Replace(num, "x", "X")d = Right(num, 1)If Len(num) = 18 ThenIf StrComp(d, a) = 0 ThenElsea = "f"End IfEnd IfIf (Len(num) < 15) Or (Len(num) > 18) Thena = "f"End IfIf 15 < Len(num) And Len(num) < 18 Thena = "f"End IfIf a = "f" Or b = "f" Or c = "f" Then banduanShengfen = FalseElsebanduanShengfen = TrueEnd IfEnd FunctionSub yianzhengShengfen()Dim rng As RangeDim selCount, i, j, k, concelCount, conrowCount As IntegerDim selStr(100) As StringDim selTemp() As StringDim Tempstr As StringconcelCount = edRange.Columns.CountconrowCount = edRange.Rows.CountFor Each rng In SelectionDoEventsselTemp = Split(rng.Address, "$")Tempstr = selTemp(1)j = 0For i = 0 To selCountIf selTemp(1) = selStr(i) Thenj = 1End IfNext iIf j = 0 ThenselStr(selCount) = selTemp(1)selCount = selCount + 1End IfNextk = 0Tempstr = ""For j = 1 To conrowCountDoEventsIf Not banduanShengfen(Replace(Range(selStr(0) & j).V alue, " ", "")) ThenRange(selStr(0) & j).Interior.Color = RGB(255, 98, 98)Tempstr = Tempstr & j & ","k = k + 1End IfNext jIf Not Range(selStr(0) & "1").Comment Is Nothing ThenRange(selStr(0) & "1").ClearCommentsIf k > 0 ThenRange(selStr(0) & "1").AddComment "本列中共" & k & "个身份号不对,其中:" & Left(Tempstr, Len(Tempstr) - 1) & "行身份证号不对"ElseRange(selStr(0) & "1").AddComment "本列身份证号全对"End IfElseIf k > 0 ThenRange(selStr(0) & "1").AddComment "本列中共" & k & "个身份号不对,其中:" & Left(Tempstr, Len(Tempstr) - 1) & "行身份证号不对"ElseRange(selStr(0) & "1").AddComment "本列身份证号全对"End IfEnd IfEnd Sub。
excel的身份证效验程序

打开EXCEL,把宏的安全级别设置为“低”,以后再改回来。
然后打开VB编辑器,新建一模块,加入以下代码Function 身份证(n As Object)wi = Array("7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2") y = Array("1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2")d = Array("29", "31", "28", "31", "30", "31", "30", "31", "31", "30", "31", "30", "31", "30") s = EmptyIf Len(n) = 15 Then身份证 = "请填18位身份证号"Exit FunctionElseIf Len(n) = Empty Then身份证 = EemptyExit FunctionEnd If年份 = Val(Mid(n, 7, 4))月份 = Val(Mid(n, 11, 2))月份2 = 月份If 月份2 = 2 Thentt = Val(Mid(年份, 3, 2))If tt <> 0 Thentt = 年份 Mod 4If tt = 0 Then 月份2 = 0Elsett = 年份 Mod 400If tt = 0 Then 月份2 = 0End IfEnd If日期 = Val(Mid(n, 13, 2))If 日期 > Val(d(月份2)) Or 日期 = 0 Then身份证 = "日历无此日"Exit FunctionEnd IfIf 月份 > 12 Or 月份 = 0 Then身份证 = "日历无此月份"Exit FunctionEnd IfIf 年份 > Year(Date) Then身份证 = "还没生出来"Exit FunctionElseIf 年份 < Year(Date) - 100 Then身份证 = "百岁老人"Exit FunctionEnd IfIf Len(n) = 17 ThenFor h = 0 To 16r = Mid(n, h + 1, 1)s = s + r * wi(h)Next ht = s Mod 11身份证 = "校验码未填 " & y(t)ElseIf Len(n) = 18 ThenFor h = 0 To 16r = Mid(n, h + 1, 1)s = s + r * wi(h)Next ht = s Mod 11t = y(t)r = Mid(n, 18, 1)If t <> r Then身份证 = "False"Elsett = Val(Mid(n, 15, 3)) Mod 2If tt = 0 Then身份证 = "女"Else身份证 = "男"End IfEnd IfElseMsgBox "身份证位数不正确"End IfEnd Function然后返回EXCLE,把身份证号填入单格,再填入公式如:=身份证(A3。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
利用ExcelVBA插件实现证件信息批量校验摘要:使用excel表格实现证件申请信息批量填报,并按要求对有关内容进行有效性校验。
通过分析jpg格式图片文件的结构,自行编写代码获取图片尺寸等信息。
利用excelvba插件,实现了证件提报信息批量校验。
关键词:excelvba插件;jpg图片文件;有效性校验中图分类号:tp311 文献标识码:a 文章编号:1007-9599 (2012)24-0004-031 引言举办重要会议、活动时,通常需要为与会人员制作发放专用证件。
因为与会人员数量较多,逐一录入效率很低,一般情况下采用批量提报的方式采集数据。
目前,我单位使用公安部第一研究所开发的证件管理软件制作证件,该软件使用excel表格批量导入制证信息。
申请单位按要求将申请人姓名、身份证号码、单位等信息填入既定格式的excel表格,与申请人照片保存在同一文件夹内打包提报。
照片文件为jpg格式,以申请人姓名加“-”再加出生日期命名,如“张三-19810213.jpg”。
为了保证照片质量,通常需要对照片尺寸和文件大小提出要求,如照片尺寸指定为413×579像素,文件大小不超过300k。
这种数据采集方式大大减轻了制证人员的工作量,提高了工作效率。
在实际应用中我们也遇到了一些问题:一是导入信息时缺少照片。
有些是因为确实漏报了照片,有些是因为照片不是jpg格式,更多的是因为照片文件命名错误,比如姓名、出生日期与表格内容不一致,文件名中有多余空格,以及因为扩展名被隐藏而在文件名中多输入了“.jpg”,把照片文件命名成类似“张三-19810213.jpg.jpg”的情况。
二是提交的照片不符合要求。
普遍存在尺寸不符的情况,并且很多照片的宽高比例不合适,制作证件时因为拉伸而严重变形。
三是普遍反映填报信息时效率不高。
特别是命名照片文件时,一一核对出生日期比较麻烦,很容易出现错误。
为了解决以上问题,本人对批量提报表格进行了改进。
在使用excel表格的有效性规则防止在表格内输入无效内容的基础上,利用excelvba设计校验程序,对申请人信息以及照片的有效性进行校验,对填报错误或不完整数据进行提醒或自动修正,从而降低了信息填报的难度,提高了提报数据的质量。
2 excelvba及vba插件介绍vba全称为“visualbasicforapplication”,是一种依附于应用软件的二次开发语言。
作为vb家族的成员之一,它是一种面向对象的程序语言,用一种所见即所得的方式编写代码,这使它在学习和使用方面都非常简单。
excel是目前制表软件中最优秀、市场占有率最高的一款软件,这归功于它拥有强大的制表功能,还归功于它提供了二次开发平台excelvba,允许用户自行开发excel本身不具备的功能,大大提升工作效率。
通过vba进行二次开发,可以强化excel功能,将某些烦杂或者重复的日常工作简化,还可以开发商业插件或者小型应用软件,其中比较常见和易于实现的就是通过开发应用vba插件,来简化自己的实际工作。
excel插件是利用vba开发的外置工具,通常是xla、xlam或者dll格式,其中xla和xlam插件可以直接用excel开发,而dll插件通常采用vb或才c++、等开发。
相对于excel的内置功能,vba插件具有很多优势。
它可以对操作对象进行批量处理,可以一键完成多个任务,可以将复杂的任务简单化,可以提升工作表数据的安全性和准确性,使工作更轻松,运算更快速、准确。
虽然vba插件具有以上优势,但它在某些方面也有一些限制。
比如说通用性方面,因为开发插件通常是个人行为,通用性可能不够完善,由于开发者测试的次数少以及测试条件不足等原因,导致某些插件藏有隐含缺陷。
另外,excelvba是依附于excel主体程序的附属程序,它可以开发强化excel功能的程序,但是不能开发脱离excel 单独存在的软件,不能用于开发全新而专业的应用程序。
3 利用excelvba实现证件照片批量校验为了解决前面提及的几个主要问题,需要利用excelvba编写三个函数(或过程),分别实现查找照片、分析尺寸和批量校验功能,并设置快捷键以方便调用。
3.1 查找照片并返回文件大小该函数根据申请人姓名和出生日期,在该申请表所在目录内查找申请人照片,并返回照片文件大小。
jpg格式文件有两种常见的扩展名:jpg和jpeg,编写程序时均需考虑。
以姓名为“张三”,出生日期为“19810215”为例,首先查找文件名为“张三-19810215.jpg”文件,如果找到,则返回文件大小,否则依次查找文件名为“张三.jpg”、“张三-19810215.jpg.jpg”、“张三.jpg.jpg”、“张三-19810215.jpeg”、”张三.jpeg”、“张三-19810215.jpg.jpeg”、“张三.jpg.jpeg”的文件,找到后将其文件名更改为“张三-19810215.jpg”,并返回文件大小。
如果以上文件都未找到,则返回-1。
这样既能够自动修正一些输入错误,提高容错能力,还能够简化操作,除了在申请人姓名相同时需要输入完整文件名外,其他照片仅需使用姓名命名,程序将自动为其补充完整。
该函数的主要代码如下:‘参数iname为申请人姓名,ibirthday为出生日期的8位阿拉字符串functionfilelength(byvalinameasstring,byvalibirth dayasstring)aslongdimfilename1asstring,filename2asstring‘查找文件名类似“张三-19810215.jpg”的文件,如果找到返回文件大小filename1=activeworkbook.path+”\”+name+”-”+birthday+”.jpg”ifdir(filename1)”“thennamefilename2asfilename1filelength=filelen(filename1)exitfunctionendif……省略依次查找文件名类似“张三.jpg”、“张三.jpg.jpg”等文件的过程filelength=-1 ‘未找到申请人照片,返回-1endfunction3.2 获取jpeg照片尺寸jpg即jpeg,是由jointphotographicexpertsgroup(联合图像专家组)制定的图像压缩标准,是常用的图像文件格式之一。
jpeg 文件是分段存储的,段的多少和长度不是一定的,段的排列也没有严格的顺序。
除了图像开始(soi)和图像结束(eoi)以外,每个段都是由段标识、段类型、段长度和段内容组成。
段标识1个字节,是十六进制固定值0xff,每个段标识前可以添加数量不限的0xff 填充字节。
段类型也是1个字节,不同的段有不同的值。
紧接其后的2个字节存放的是该段长度(以字节为单位,不包括段标识和段类型),使用motorola方式存储,即高位在前,低位在后。
图像开始段和图像结束段只包含段标识和段类型组成,都是只有2个字节。
段的类型很多,但是大多数的jpeg文件只包含几种,如soi(图像开始)、app0(应用数据块)、dqt(量化表)、sof0(帧图像开始)、dht(霍夫曼表)、sos(扫描线开始)以及eoi(图像结束)等,其中图像的大小存储于sof0段中。
同其它段一样,sof0段的起始字节值为0xff,第二字节即段类别字节值为0xc0,图像的高度和宽度(以像素为单位)分别存放于该段的第6、7和第8、9字节内,也是以motorola方式存储。
因为我们只是需要获取图像的高度和宽度,因此只需在jpeg文件中找到该段,并根据其相应位置的值计算图像高和宽即可。
当然,在查找sof0段以前,首先必须判断该文件是不是jpeg文件,也就是判断该文件开始两个字节的值是否为0xff和0xd8(即是否为soi段)。
该函数的主要代码如下:‘参数iwidth和iheight以地址引用方式返回照片宽度和高度‘函数返回值:0正确,1未找到文件,2文件格式错误functionphotosize(ifilenameasstring,iwidthasinteg er,iheightasinteger)asintegerdimfilebytes()asbytedimfilelengthaslong,indexaslong,filenumberas integer ‘如果文件不存在,返回1ifilename=activeworkbook.path+”\”+ifilenameifdir(ifilename)=““thenphotosize=1:exitfunction‘以二进制形式打开文件,如果错误返回1filenumber=freefile ‘获取可用文件句柄号onerrorresumenextopenifilenameforbinaryasfilenumberiferr.number255orfilebytes(2)=filelengththenexitdo‘否则指针移至下一段开始index=index+clng(filebytes(index+1))*256+filebytes (index+2)+1else :index=filelength:endif ‘数据错误,指针移到数组结尾loopwhileindex’如果未到数组结尾,说明找到了sof0段,计算并返回照片尺寸ifindex<filelengththen‘图像帧段第6、7两字节的数值是图像高度iheight=cint(clng(filebytes(index+4))*256+filebytes (index+5))‘图像帧段第8、9两字节的数值是图像宽度iwidth=cint(clng(filebytes(index+6))*256+filebytes (index+7))photosize=0 ‘成功获取照片尺寸,返回0else:photosize=2:endif’否则,文件格式错误,返回2 endfunction调用该函数时,需要先定义两个整型变量,然后以引用参数的方式返回图像高度和宽度。
3.3 证件信息批量校验主要是按照有关要求,对表格内的所有申请人信息逐一进行必填项和有效性检查,并根据申请人姓名和出生日期查找校验申请人照片。
对不符合要求的信息,用背景色加以突出显示,并以批注形式说明原因,方便填报人检查修改。
具体代码不再赘述。
3.4 使用快捷键调用校验过程在excel2003中,可以采取自定义工具栏或自定义菜单的方式调用校验过程,非常直观、方便。
但是excel2010用功能区替换了早期版本的命令栏,将工具栏和菜单都屏蔽了,尽管它仍然允许通过vba代码产生自定义菜单和工具条,但是自定义菜单和工具栏都显示在加载项功能区中,不直观,使用不便。