教师备考宝典(22):机读卡篇——考生姓名轻松代码化

软件世界

  经过多年的普及,“机读卡”已经被广泛应用在报考、应考、批改标准试卷等方面,而“姓名代码”一栏是不少“机读卡”的必填项目。每当考试前夕,笔者都要给自己班的同学下发几本小册子,以查询自己汉字姓名所对应的代码(区位码),因为小册子数量少,填写时间紧,出错的情况经常发生。笔者于是就想到了下面的方法:用Excel自动将汉字转换成代码,从而大大提高了效率。

  一、创建窗体

  以Excel 2003为例,打开需要将汉字转为代码的工作表文件。

  单击“工具→宏→Visual Basic 编辑器”,执行“插入→用户窗口”,创建一个新窗体,从出现的工具箱中,依次拖拉出“标签”、“RefEdit”和“命令按钮”,建立一个简单的程序窗体(图1)。

  二、程序设计

  1.主程序设计

  单击“视图→代码窗口”,在代码窗口中输入以下代码(“'”后面为解释性文字):

  Private Sub CommandButton1_Click()

  Dim ChooseStr As String '选择的姓名区域

  ChooseStr = RefEdit1.Value '获取姓名区域信息

  If ChooseStr <> “” Then

  Call NameToNumber(ChooseStr)

  '处理单元格中的汉字

  Else

  Label1 = “没有选好,请重新拖动鼠标选择姓名区域”

  End If

  End Sub

  Private Sub CommandButton2_Click()

  Unload Me '退出宏命令

  End Sub

  2.功能模块设计

  单击“插入→模块”建立一个模块,在右边的窗口中输入以下代码:

  '修改控件Caption属性

  Sub 姓名的数字化()

  With VBAProject.UserForm1

  .Caption = “姓名的数字化”

  .Label1 = “请用鼠标选择姓名所在的单列区域”

  .CommandButton1.Caption = “开始转换”

  .CommandButton2.Caption = “退出”

  Call .Show'显示窗口

  End With

  End Sub

  '--姓名转换成区位码--

  Public Sub NameToNumber(ChooseStr As String)

  On Error GoTo Herror ' 出错处理方法

  Dim CS As String ' 姓名区域信息串

  Dim ccStr As String '字符串

  Dim ccNum As Integer '字符串的字符个数

  Dim outStr As String '输出的姓名代码

  Dim curSheet As String '当前工作表

  Dim StartRowNum As Integer

  '姓名区域起始行

  Dim EndRowNum As Integer

  '姓名区域结束行

  CS = ChooseStr

  ccNum = Len(CS)

  For i = 1 To ccNum

  If Mid$(CS, i, 1) = “!” Then

  curSheet = Left$(CS, i - 1)

  '获取当前工作表名

  colNum = Asc(Mid$(CS, i + 2, 1)) - 64

  '获取姓名区域的列数

  StartRowNum = Val(Right$(CS, ccNum - i - 3)) 

  '获取姓名区域开始的行数

  Exit For

  End If

  Next i

  For j = 1 To ccNum

  If Mid$(CS, ccNum - j, 1) = “$” Then

  EndRowNum = Val(Mid$(CS, ccNum - j + 1))  '获取姓名区域结束的行数

  Exit For

  End If

  Next j

  counter = StartRowNum '姓名区域的行首

  Set curCell = Worksheets(curSheet).Cells(counter, colNum) '获取单元格中的姓名

  ccStr = Trim(curCell.Value)

  '删除姓名的前后空格

  If curSheet <> “” And StartRowNum <> 0 And EndRowNum <> 0 Then

  '在姓名区域后插入一列,用于区位码

  Worksheets(curSheet).Columns(colNum + 1).Insert

  Do Until counter > EndRowNum

  ccNum = Len(ccStr)

  outStr = “”

  For i = 1 To ccNum

  '如果第i个字符是汉字,就计算区位码

  If Asc(Mid(ccStr, i, 1))< 0 Then

  outStr = outStr + NameNum(Mid(ccStr, i, 1))+ Chr(32)

  End If

  Next

  '代码输出到同行的后一单元格

  Worksheets(curSheet).Cells(counter, colNum + 1) = outStr

  counter = counter + 1

  '累加到下一行的姓名单元格

  '获取单元格中的姓名

  Set curCell = Worksheets(curSheet).Cells(counter, colNum)

  ccStr = Trim(curCell.Value)

  '删除姓名首尾的空格

  Loop

  Else

  GoTo HError

  End If

  Exit Sub

  HError:

  MsgBox “选择的姓名区域不正确,请重试!”

  End Sub

  '--输出一个汉字的区位码--

  Function NameNum(Str As String) As String

  Dim f

  Dim L1, R1

  Dim InputStr As String

  If Str <>“” Then

  InputStr = Str

  If Asc(InputStr) < 0 Then

  '小于0的ASCII代码是汉字

  f = Hex(Asc(InputStr  

  ' 汉字转区位码的算法

  L1 = Format(CInt(“&H” + Mid(f, 1, 2)) - 160, “00”)

  R1 = Format(CInt(“&H” + Mid(f, 3, 2)) - 160, “00”)

  If L1 < 0 Or R1 < 0 Then

  MsgBox InputStr & Chr(32) & “可能是繁体字不能转换为区位码!”

  NameNum = InputStr

  Else

  NameNum = L1 & R1

  End If

  End If

  End If

  End Function

  三、使用

  检查以上源代码无误后,保存文件。然后切换到Excel窗口,单击“工具→宏→宏”,在弹出的窗口中选择名为“姓名的数字化”的宏,单击“执行”按钮,即可进入我们刚才创建的程序界面。

  单击选择框,然后用鼠标框住要转换的区域,点击“开始转换”按钮即可得到转换结果,如图2所示。转换结果的正确性可以用区位码输入法来验证。

  提示:如果感觉使用不便,可以把宏命令添加到常用工具栏上。为了在其他表格上运行该宏,还可以导出窗体文件和模块文件这两个文件。方法如下:在工程窗口“窗体”分支中选中“UserForm1”,然后单击“文件→导出文件”,选择路径和文件名,保存即可。同理,在工程窗口“模块”分支中导出“模块1”。以后,如果其他Excel工作表文件需要进行转换工作,分别导入这两个文件即可。