除去注释的部分,实际上只有句代码。不用我细讲,大家已经知道它们的作用分别是:第一句选中A1单元格,第二句复制选中的单元格,第三句选中B1单元格,第四句粘贴。 但是,就像我们用VBA在单元格输入数据不用先选中它一样,我们同样可以在不选中单元格的情况下就执行复制粘贴命令。所以,以上的代码实际上我们可以简化为: 复制内容到剪贴板 代码:
Sub Macro1()
Range(\ End Sub
以上的代码只是发生在活动工作表内,如果要在其他工作薄或工作薄中实现复制粘贴的命令,只需要改变引用即可。如我们要将Book1.xls的第一个工作表中的A1:A10复制到Book2.xls的第一个工作表中的B1:B10单元格,则代码为: 复制内容到剪贴板 代码:
Sub mycopy()
Workbooks(\ Workbooks(\ End Sub 引用:
提示:一行的代码过长,可以用空格加下划线进行换行。
复制的区域过大时,对于目标区域,我们可以只指定一个单元格,这时它代表目标区域的左上角单元格。如上面的代码,我们可以写成这样: 复制内容到剪贴板 代码:
Sub mycopy()
Workbooks(\ Workbooks(\ End Sub
如果你需要只粘贴数值,或其他什么,你可以利用录制选择性粘贴的宏来进行修改。同样的道理,我就不再多说。 二、剪切单元格
剪切单元格,或者说移动单元格和复制单元格类似,有了上面的经验,我们不难得到它的语句。其实它和复制单元格的命令大同小异,唯一不同的是使用Cut方法代替了Copy方法。 下面的代码是将A1:A10单元格的数移动到B1:B10单元格: 复制内容到剪贴板 代码:
Sub mycut()
[a1:a10].Cut [b1] End Sub
三、删除单元格
删除一个单元格的命令也很简单,调用Range对象的Delete方法即可。同我们用鼠标操作一样,同样有四个选项,下面以删除A1单元格为例: 复制内容到剪贴板 代码:
[a1].Delete Shift:=xlUp ' 下方单元格上移
[a1].Delete Shift:=xlToLeft ' 右侧单元格左移 [a1].EntireRow.Delete ' 整行删除 [a1].EntireColumn.Delete ' 整列删除
只写成[a1].Delete时,默认为?下方单元格上移?。 Range对象的End属性
Range对象有一个End属性,也许你在阅读别人的例子里经常会看到如?[A65536].End(xlUp).Row?这样的语句,这就是End属性的利用。
End属性应用于Range对象,同样也返回一个Range对象。该对象代表包含源区域的区域结尾处的单元格。如果你还是不明白,那请你在工作表里试一试,分别按Ctrl+上、下、左、右方向键,看看得到的是什么?End属性返回的单元格就相当于在源单元格按住Ctrl键+上(或下、左、右)方向键所得到的单元格。它的语句格式简单写为: 源区域.End(移动方向) 移动方向可以是:
xlToLeft :向左移动,相当于在源区域按Ctrl+左方向键。 xlToRight:向右移动,相当于在源区域按Ctrl+右方向键。 xlUp:向上移动,相当于在源区域按Ctrl+上方向键。 xlDown:向下移动,相当于在源区域按Ctrl+下方向键。
所以在程序设计的过程中,很多人喜欢用?[A65536].End(xlUp).Row?语句来返回A列的最后一个非空单元格的行号。
如果当前活动工作表的A列填写的是学生的姓名,现在我们想在表中A列最后一个学生的后面增加一个叫?张青?的学生,则代码为: 复制内容到剪贴板 代码:
ActiveSheet.Cells([A65536].End(xlUp).Row + 1, 1).Value = \张青\
语句 [A65536].End(xlUp).Row + 1中,行号加1的目的是在最后一个非空单元格的下一个单元格里输入数据。需要注意的是:如果你的A列全为空的话,?[A65536].End(xlUp).Row?这个语句返回的是1。
我们来做一个简易的学生信息录入的例子:
(1)点工作表中的?录入资料?按钮,弹出?录入?窗体; (2)录入信息后,点击?确定?按钮即完成记录追加; (3)不考虑录入内容是否规范。
详细请看附件, 信息录入.rar (11.09 KB) 信息录入.rar (11.09 KB)
附件没有设密码,希望大家尝试过后再看代码! 汇总多工作表花名册 上一贴中,?花名册分类?的题目主要是检验大家对循环语句、判断语句及一些单元格数据处理的方法。因为目标工作表和源工作表的格式都是一样的,所以处理起来也相对比较简单,无非就是给数据搬了个家。所以可以用我们前面贴子里说的Copy的方法,当然,也可以直接等于源区域的Value属性,即:目标区域.value=源区域.value。比如我们想把Sheet1里的第一行数据复制到Sheet2的第一行,可以用以下两句代码中的任意一句: 复制内容到剪贴板 代码:
Sheets(\ 代码:
Sheets(\ 这一点,在?宝贝?的作业里已经用到了。
上次的作业是对名册进行分类,进行原样的搬家。这一次的作业还是搬家,和上次不一样的是,这次是将名册汇总到一个工作表,而且只汇总相应的内容,不再是那种原封不动的搬家了。当然,原理还是一样,如果你会了前一题,这一题对你来说,就显得很小儿科了。 设计一个程序,能否实现目的很重要,实现目的的同时,高效率的程序也是我们追求的。但是我们现在才开始,大家不必太过于考虑效率的问题,管他什么代码,只要能实现目的即可。在附件里,我加了计算程序执行时间的代码,你不用去管它,之所以加上这段代码,是因为在下面的帖子里我可能会用到。 复制内容到剪贴板 代码:
Sub mysub()
Dim start As Double start = Timer
'在这里添加你的代码
MsgBox \程序共执行了\秒!\ End Sub
作业见附件, 学生花名册汇总.rar (21.53 KB) 学生花名册汇总.rar (21.53 KB) 下载次数: 218 2009-8-27 12:53
此贴到此为止,咱们不见不散,楼下见!
新建工作表
---------------------
在?花名册分类?的作业里,moon2778加入了为不同地区建立工作表代码,让?沧海一滴?和?宝贝有酒窝?两个朋友都跟贴问了新建工作表的相关问题。有需要就有市场,呵呵......那我再在这里简单讲一讲我对新建工作表的认识,希望对大家学习有帮助。
新建一个工作表(Worksheet),要调用工作表(Worksheet对象)的Add方法(可以建制一个新建工作表的宏来查看相关的代码)。
如果我们想在当前工作表中新建一个工作表,代码可以写为: 复制内容到剪贴板 代码:
Worksheets.Add '新建的工作表的位臵在当前活动工作表的前面
此时,新建的工作表Excel默认把它放在活动工作表的前面,如果我们需要改变它的位臵也是可以的。例如: 复制内容到剪贴板 代码:
Worksheets.Add before:=Worksheets(\ '在工作表sheet2之前添加一个工作表
Worksheets.Add before:=Worksheets(1) '在最前面添加一个工作表
Worksheets.Add after:=Worksheets(\在工作表sheet2之后添加一个工作表\
Worksheets.Add after:=Worksheets(Worksheets.Count) '在最后面添加一个工作表
试了以上的代码,我们会发现,新添加的工作表都是采用?老大、老二、老三.....?的命名方式,如果你需要为新添加的工作表改一个名字,也是可以的,只需要再添加一句代码即可: 复制内容到剪贴板 代码:
Worksheets.Add before:=Worksheets(1) '在最前面添加一个工作表 ActiveSheet.Name = \ '将新建的工作表更名为?abc?
如果想更简单点,这句代码还可以合二为一: 复制内容到剪贴板 代码:
Worksheets.Add(before:=Worksheets(1)).Name = \在最前面添加一个名称为?abc?的工作表
有时,也许需要一步就添加多个工作表,那可用下面的代码: 复制内容到剪贴板 代码:
Worksheets.Add Count:=3 '添加三个工作
但是一次性添加多个工作表时,好像就无法同时对其重新命名了。
--------------------------------------------------------------------------------------------------------- 关于247楼朋友的提问 引用:
原帖由 沧海一滴 于 2009-8-27 19:13 发表 楼主你好!
我可能没有表达完整,现再重新解释如下: 1、?花名册?中有固定的工作表三个或四个,而?花名册?只是其中之一工作表;
2、用?moon2778?作业为例子,当没有建立子工作表情况下,建立时,如何在固定工作表后重新建立分配后的工作表。
moon2778的例子里,在新建工作表之前,先执行了一个删除工作表的操作,把工作薄中所有不是当前工作表的所有工作表全部删除。如果你的工作薄里原有子工作表的话,建议你用我在213楼(http://club.excelhome.net/viewthread.php?tid=470603&page=22#pid3110867)的回复里的方法。我们可以在新建工作表的时候,先在工作表集合里看一下是否有我们需要添加的工作表,如果没有,则执行添加操作。这样,就不用去删除所有的工作表了。
还是拿?花名册汇总?例子的工作表来说吧,如果我们需要自己新建相应的工作表,并命名,可用以下代码: 复制内容到剪贴板 代码:
Sub shtadd()
On Error Resume Next '出现错误继续执行下一句 Dim xrow As Integer
xrow = Worksheets(\外在本就读花名册\
For i = 3 To xrow
If Worksheets(\外在本就读花名册\清镇\
If Worksheets(Worksheets(\外在本就读花名册\Then ' '判断是否存在该地区的子工作表
Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = Worksheets(\外在本就读花名册\新建表并命名 End If nd If Next
If Worksheets(\清镇市外\ '判断是否存在?清镇市外?工作表 Worksheets.Add(after:=Worksheets(Worksheets.Count)).Name = \清镇市外\End If End Sub
以上代码是按moon2278的思路更改,但只是添加表格并给表格命名,并没有对表格进行设臵,所以如果需要对表格进行格式设臵(比如添加表头),可再自行添加相应的代码。
表头都是一样的,大家有没有想过用复制来代替新建?复制后,将第三行以下的值全部删除,再对工作表重新命名,也是可以的!
PS:我休息两天,周一见!
引用:
原帖由 宝贝有酒窝 于 2009-8-30 15:51 发表 我的作业
原本是想在利用字段调用子表合并到汇总表中的但是目前的技术实现不了 另外绿色底纹被我覆盖了……
底纹我只是给来作标记的,盖了没事。如果想不覆盖底纹,可以使用选择性粘贴或直接等于Value,都可以的。
对于你的代码,能实现需要得到的结果,但可以再完善一下。比如,其实程序中并不需要定义那么多的变量,也不用使用两层循环。这样只会让程序进行许多多余的计算,增加程序执行的时间。
楼上的jiminyanyan 朋友已经给你修改了一下,可以参考一下,但他在修改时,可能不小心把?为第三列(性别)添加数据的代码?删到了。我按照你的思路,把代码整理了一下(几乎和楼上的一样),供参考。
虽然我说了,只需要完成目的即可,但你你也可以看一下程序执行的时间,对比一下两次代码的区别,同样的思路,甚至是同样的语句,整理过的效率可是你原来的效率的七倍以上哦。 (回复)宝贝有酒窝的学生花名册汇总.rar (23.92 KB)
VBA数组(一)
一、什么是数组
对于数组,在前面7楼的贴子里我们已经简单介绍了一些简单的概念,如果你忘记了,请回过头去花两分种读一读。
读完了也许你还是不清楚,没关系,请接着往下看。
新学期开始了,我上七(1)班数学,学生太多了,我老是记不住学生的名字,还好班主