使用Office Word和Excel 打印成绩通知单和成绩条(批量,导入数据源)- 090409 更新小数点长度解决方法

方法一:
使用OfficeWord和Excel打印成绩通知单和成绩条 (2008-11-08 15:49:52)

  每到期末,班主任或者辅导员就要开始收集学生的各科成绩,统计总分,计算名次等。然后就要开始打印每个学生的成绩通知单,装入信封,寄给家长。最原始的做法当然是找两个动作麻利的班干部,在打印好的表格里填上成绩,再装入信封。这样,直到把全班几十个同学的成绩通知单都处理好时,已经是腰酸背痛,手腕麻木了。——既然有 microsoft office 为什么还要这样折磨人呢?

  成绩通知通常有两种形式,一种是“成绩通知单”的形式,即每页纸一个成绩,还附加一些关于本学期和下学期的信息,如报名时间、费用等,如图1所示:


图 1

  成绩通知的另一种形式是“成绩通知条”,即仅仅在一张小纸条上,填写了学生成绩,如图2所示:


图 2

  下面,我们就开始一步步制作成绩通知单(条)。首先来看看必需的数据,即成绩。它存放在一个名为“成绩.xls”的 excel 文档的“成绩”工作表中,如图3所示:


图 3

制作成绩通知单

  根据任务的特点,不难想到使用 word 的“邮件合并”。

  邮件合并功能需要两个文档,即数据源和模板文档。数据源通常可以是word表格、excel 表格以及数据库表格等,这里就用我们上面提到的那个存放数据的 excel 作为数据源。模板文档当然需要在 word 里新建了。现在我们来一步一步的准备成绩通知单吧(注:本文以 office 2003 为例,其余版本的 office 中操作类似,可能略有不同):

  第一步,新建一个 word 文档,打开“邮件合并”工具栏(右键单击 word 工具栏,在弹出菜单中选择“邮件合并”)。点击工具栏最左边的(设置文档类型)按钮设置主文档类型,即在弹出的对话框中选择“信函”。

  第二步,在“邮件合并”工具栏上点击(打开数据源)按钮,选择我们准备好的“成绩.xls”为作数据源。在这一步中请注意,如果“成绩.xls”中有多个工作表,请选择正确的工作表作为数据源。在 word 2000 中,没有提供对工作表的选择对话框,那么请把数据表移到 excel 文档中的第一个工作表位置。

  第三步,撰写模板文档内容,并在适当的位置插入正确的“域”。比如,先写好“学号: 总分:排名:”,再将光标移动到“学号:”之后,单击“邮件合并”工具栏上的(插入域)按钮,打开如图4所示的“插入合并域”对话框。注意对话框中已经根据数据源列出了所有的域名,即图3所示 excel 表格中的第一行。这里选择学号。同样,依次将光标移动到“总分:”和“排名:”之后,分别插入相应的“总分”域和“排名”域。完成的模板如图5所示:


图 4


图 5

  插入合并域的时候,如果需要控制格式,可以直接在合并域上进行格式操作,如图5中给“姓名”加下划线。但是一定要注意一点,域是一个整体(如果将文本光标移动到某个域上,整个域的背景都会变成灰色,以便区分),所以,无论做什么操作,都要把域作为一个整体来考虑;更不要手工去修改域的名字,虽然这样做时不会报错,但这样做不仅没有意义的,反而会把事情弄糟。

  模板文档完成了,不妨先看看实际效果。单击“邮件合并”工具栏上的(查看合并数据)按钮,此时文档中的域都会替换成数据源中的数据,至于是替换成那一条数据,则是由工具栏上的这组按钮决定的。

  最后核对无误之后,使用“邮件合并”工具栏上的(合并到新文档;合并到打印机)两个按钮中一个来进行合并。这里我们可以选用“合并到新文档”按钮看看合并的结果,如图6所示。最后只需要打印这个文档再分别装入信封即可。


图 6

制作成绩通知条

  制作成绩通知条完全可以使用和制作成绩通知单相同的办法,即邮件合并。只不过合并类型选择为“目录”,而不是“信函”。但是既然只需要用 excel 就成解决,何必再去麻烦 word 呢。

  实现成绩通知条,其难点在于给每一条数据都要加上表头,如果能有空格分隔便于裁切就更好。如果我们新建一个工作表,根据当前的行数引用“成绩”表中不同的行,那问题就能很好的解决了。原理说起来似乎有些复杂,所以请先跟着我做,之后再容我慢慢解释。

  在“成绩.xls”中新建一个工作表,命名为“成绩通知”。在“成绩通知”工作表的“a1”单元格中输入如下工式:

=if(mod(row(),3)=1,成绩!a$1,if(mod(row(),3)=2,offset(成绩!a$1,row()/3+1,0),""))

  输入公式并回车后,再次选中“a1”单元格式,向右拖动选中符号右下角的小方块进行填充,直到将“成绩”工作表中第一行的数据完全复制过来为止。本例中拖动到“k1”单元格。然后再选中“a1:k1”这些单元格,向下拖动选中符号右下角的小方块进行填充,直到第29行。

  最后结果如图7所示。将这个表格打印出来,裁切分装即可。


图 7

  现在来说说为什么要这样做。

  当然首要的是解释那个公式的意思,我们先把公式中的两个if语句标记出来:

=if(mod(row(),3)=1,成绩!a$1,if(mod(row(),3)=2,offset(成绩!a$1,row()/3+1,0),""))

  可以看出,第一个if语句(标记为红色)中,“mod(row(),3)=1”是条件。当条件成立时,结果为“成绩!a$1”;条件不成立时,结果由第二个if语句决定。这个if语句的意思是,当前行号(由row()返回)除以3的余数为1的时候,本单元格的内容就是“成绩”表a1的内容;否则,其内容由第二个if语句决定。

  第二个if语句(标记为蓝色)中,“mod(row(),3)=2”是条件。条件成立时,结果为“offset(成绩!a$1,row()/3+1,0)”取得的值;条件不成立时,结果为空白。其中“offset(成绩!a$1,row()/3+1,0)”表示,从“成绩”表的a1往下数第row()/3+1行处的单元格的值。这个if语句的意思就是,如果当前行号除以3的余数为2的时候,本单元格的内容是“成绩”表a列1+row()/3+1行处的值;否则,其值为空白(用于产生空行作为分隔)。

  所以,整个公式就是根据当前行号计算出来应该引用“成绩”表中表头、对应行数据还是空白。而后之所以要复制29行是因为原来10行数据,每行数据在“成绩通知”表中都是3行,即表头、数据和空白,这样就是10*3=30行,因为最后一条数据的空白可以不要,所以是30-1=29行。

  注意公式中的行号都是使用的绝对引用,因为所有内容的引用位置都是以“成绩”表的第一行为基础进行计算的。

结束语

  这样制作成绩通知单(条)是不是自动化多了?而且大大提高了效率,值得推广。同样的原理,公司或者机关里发放的工资对帐单(条),也可以使用这个办法,以减轻工作量,赶快试试吧!

方法二:

用VBA实现Excel打印成绩通知单
  《中国电脑教育报》2005年第5期G5版与第28期E6版分别介绍了两种制作成绩通知单的方法,但存在一个共同的问题是:最后在成绩通知单格式上还得对每位考生进行一一设置,如果考生人数多同样显得繁琐。本文介绍利用VBA实现Excel打印成绩通知单,可以避免这一问题。 (点击查看更多软件使用技巧)
  准备工作
  为便于理解、记忆,将工作表的名称分别更改为“考试成绩”、“通知单”。在“考试成绩”工作表中是每个学生的考试成绩A1至K64,在“通知单”工作表中建立一个空白表格,作为成绩通知单模板,如图1所示。
图1
  编写代码
  1. 进入VB编辑环境,依次点击“工具→宏→Visual Basic 编辑器”。
  2. 定义触发事件。鼠标双击“工程”窗体中的“通知单”工作表,窗体右侧就出现了对应于该工作表的一些事件。选择响应“激活工作表”动作的事件activate,在窗体右侧的代码区域就出现了worksheet_activate()过程。接下来要做的就是在这个过程中添加代码了。
  3.为事件添加代码如下:
  Private Sub Worksheet_Activate()
  Dim i As Integer '循环变量
  For i = 1 To 100
  If Sheet1.Cells(i, 1) = "" Then
  '如果“考试成绩”工作表的考号中没有内容,则退出循环
  Exit For
  End If
  sbegin = (i - 1) * 5 1
  send = i * 5
  dbegin = i * 5 1
  dend = (i 1) * 5
  '确定复制、粘贴“通知单”格式区域的起止行,5为复制区域的行数
  Sheet2.Range(Cells(sbegin, 1), Cells(send, 11)).Copy _
  Destination:=Sheet2.Range(Cells(dbegin, 1), Cells(dend, 11))
  '将(Cells(sbegin, 1), Cells(send, 11))区域中的格式拷贝到(Cells(dbegin, 1), Cells(dend, 11))
  Cells(sbegin 3, 1).Value = Sheet1.Cells(i 1, 1).Value
  Cells(sbegin 3, 2).Value = Sheet1.Cells(i 1, 2).Value
  Cells(sbegin 3, 3).Value = Sheet1.Cells(i 1, 3).Value
  Cells(sbegin 3, 4).Value = Sheet1.Cells(i 1, 4).Value
  Cells(sbegin 3, 5).Value = Sheet1.Cells(i 1, 5).Value
  Cells(sbegin 3, 6).Value = Sheet1.Cells(i 1, 6).Value
  Cells(sbegin 3, 7).Value = Sheet1.Cells(i 1, 7).Value
  Cells(sbegin 3, 8).Value = Sheet1.Cells(i 1, 8).Value
  Cells(sbegin 3, 9).Value = Sheet1.Cells(i 1, 9).Value
  Cells(sbegin 3, 10).Value = Sheet1.Cells(i 1, 10).Value
  Cells(sbegin 3, 11).Value = Sheet1.Cells(i 1, 11).Value
  '将“考试成绩”工作表的数据填入“通知单”相应位置
  Next i
  End Sub
  检验成果
  进入工作簿,按下“通知单”工作表,即可得到所有学生的成绩通知单了

================================================================

word导入后小数点长度不正常解决方法

三招“降服”Excel成绩数据
http://media.ccidnet.com/art/2993/20051018/351913_1.html

前几天,学校教务主任找到我,说有一个问题和我探讨,问题如下:平时学生成绩都是按学期、按班存储在Excel表中的。现在学生要毕业了,需要把每个学生各学期、各学科的成绩抽取出来,放到一张表格中,以便装入学生本人的档案中,问能不能编个程序做到这一点呢?

我问:“以前怎么做的呢?”主任说:“以前都是人工抄写,既不美观,又容易出错,还浪费大量的时间,现在计算机技术这么发达,怎能老是用笨方法呢?你研究一下,抓紧啊,后天要上报。”说完就走了。

天哪!编个程序哪是那么容易的?何况600多名毕业生,只给我留半天的时间。转念一想,先用Word的邮件合并功能救救急吧。赶紧打电话到教务处,让把数据和样表送过来。

接下来,启动Word→“制表”,单击“工具→信函与邮件→邮件合并向导”,在第一步“选择文档类型”中选“信函”,下一步“选择开始文档”中选“使用当前文档”,下一步“选取收件人”中选“使用现有列表”,并单击“浏览”,弹出“选取数据源”对话框,选取相应的Excel数据源,打开,在弹出的“选择表格”对话框中选取相应的数据表,确定。下一步“撰写信函”,把光标定位在所需位置,单击“其他项目”,在“插入和并域”中选择适当项目,插入,关闭。再定位光标,单击“其他项目”,选择项目,插入,关闭。如此重复,直至把所有项目插入完毕。终于完成了,此时已是深夜,赶紧预览一下吧。

并没有预期的顺利!问题出现了:有的数据本来是1位小数,现在却变成了15位小数(如图1)。该列被严重撑宽,其余列被挤得只能显示部分字符,整个表格变得不成样子。细心观察,发现只是保留小数的数据会出现这种情况,整数数据显示正常,怎么回事儿呢?

关闭Word,打开Excel数据源,发现上述数据实际为:88.3、94.4,增加小数位数,显示的也只是在其后补零。通过研究和咨询可知,成绩表中保留小数的数据分两种类型,一种是教师已计算好的总评成绩,并保留一位小数,录入在分数册上,成绩管理人员照分数册原样录入的。这类数据的显示应该没问题,但却出现了上述情况。另一种是由平时成绩、期中成绩、期末成绩按比例合成的,然后“复制、选择性粘贴”,只取其“数值”得到的。这类数据若不能整除,计算机将保留多位小数,虽然可以只显示一位小数,但这不等于计算机存储的就是一位小数。通过研究,用以下三种方法可以轻松“降服”Excel数据。



1. 把数值型数据转换成文本型数据

对于第一种数据,由于录入的就是保留一位小数的数值,所以只要让计算机按录入原样显示就行了。因为文本型数据在Word中显示正常,所以可以把数值型数据转换成文本型数据。选中该列数据,选择“数据→分列”命令,弹出“文本分列向导-3步骤之1”对话框,第一步、第二步选择默认设置,进入第三步“请设置每列的数据类型”中,选“文本”(如图2),单击“完成”即可。



若只是个别数据显示不正常,也可以在其前方加一英文半角的小撇“'”使其成为文本型数据。

注意,按下述方法:选中数据列→“格式”→“单元格”,在“数字”标签中设为“文本”,在Word中显示仍不正常。

2. 数据录入前,先把数据列设为文本型数据

选中待录入数据的各列→格式→单元格,在“数字”标签中设为“文本”,然后再录入数据,这样在Word中显示正常。

3. 利用四舍五入函数ROUND(number??num_digits)

既然数据含有多位小数,可以利用四舍五入函数,根据需要确定保留的小数位数。先把整列数据剪切、粘贴到一个空工作表的A列中,然后在B列中使用函数“??=ROUND(number??num_digits)”,对其进行四舍五入(如图3)。其中number是原数据,num_digits是要保留的小数位数,若不保留小数,该参数应设为0。这里公式的应为“:=ROUND(A2??1)”,确定,填充。然后选中B列,复制,再回到原成绩表,选择性粘贴,只取其“数值”即可。



(唐山师范学院玉田分校 弭宝国 于得海)

你可能感兴趣的:(Excel,Office,vb,中国移动,VBA)