科普
筛选并自动另存为新工作簿
2018-08-28 17:20  浏览:258

最近总部老是发超级大的表格要求各办事处与辖区的供应商进行订单的确认,多至数千行的表格常常涉及近百家供应商,每次我们必须要把各供应商的订单记录筛选出来,复制粘贴并另存为新的表格,然后才能发邮件给各供应商。虽然筛选、复制粘贴和另存为新表格都是很简单的操作,但是再简单的操作如果重复一百多次也是件很费时间很没意思的事情,于是某个想偷懒的人就开始研究起了excel和Visual Basic,希望可以找到简化操作的方法。大学的时候曾经学过VB,但当时就为了那张证书,考完后几乎什么都忘了,如今真的需要用时只能瞪眼干着急,幸好现在的网络十分发达,只要搜一下就可以找到很多答案,即使没有完美的答案也能给人很多启发。就这样,某枫在参考了很多高手写的代码之后,自己七拼八凑总算是完成了这个“筛选-复制-粘贴-另存为新表格”的代码。在此分享一下代码和整个过程,希望可以给有需要的人提供一点帮助,也能让自己在忘记的时候可以重温一下。

假设有如下一张表格,需要以B列的“V特别声明:本文为企业作者上传发布,仅代表该作者观点、快闻网仅提供信息发布平台。OR#”进行筛选,并把筛选出来的内容另存为新的工作簿,新工作簿的名称为筛选的“V特别声明:本文为企业作者上传发布,仅代表该作者观点、快闻网仅提供信息发布平台。OR#”值。注:以下所有操作都是基于Excel2003进行的,其他版本没有试过。


1、打开[工具]-[宏]-[安全性]:将宏的安全性设置为“低”,否则代码如法运行。
2、在Excel页面空白处建立一个命令按钮
  打开[视图]-[工具栏]-[控件工具箱],选择第四列左边的长方形命令按钮,在空白处画一个命令按钮,如下图:


3、双击命令按钮,跳出如下Visual Basic编辑器:


4、在VB编辑器中输入如下代码:
Private Sub CommandButton1_Click()
Set newbk = Workbooks.Add
[a1].AutoFilter 2, (Range("e1").Value)
[a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Copy newbk.Sheets(1).[a1]

x = (Range("e1").Value)
ActiveWorkbook.SaveAs "f:" x ".xls"
  ActiveWorkbook.Close True
  Application.ScreenUpdating = True
End Sub


这就是最关键的内容了,懂行的人只要看代码就明白了,但是不懂得就如看天书一样。虽然某枫也是小白级的,就我所明白的稍微解释一下这段代码吧。

Set newbk = Workbooks.Add  新建一个工作簿
[a1].AutoFilter 2, (Range("e1").Value)  根据单元格E1中的值,对原表中的第二列进行自动筛选
[a1].CurrentRegion.SpecialCells(xlCellTypeVisible).Copy newbk.Sheets(1).[a1]  把筛选出来的内容复制粘贴到新建的工作簿中

x = (Range("e1").Value) 设置一个函数x,x的值等于单元格E1中的值
ActiveWorkbook.SaveAs "f:" x ".xls" 把新建的工作簿保存到f盘根目录下,命名为x.xls (x是一个变量,会随单元格E1中的值而变化,就会命名为不同名字的工作簿啦)
  ActiveWorkbook.Close True 关闭新建的工作簿
  Application.ScreenUpdating = True  原工作簿显示筛选的结果(其实这句我也不太明白)

5、关闭VB编辑器,保存一下,然后关闭表格。再次打开表格,在单元格E1中输入“30001”(就是B列中需要进行筛选的内容),然后按一下命令按钮,你会发现屏幕闪了一下,打开f盘,可以看到一个名为30001.xls的新文件,而原来的表格则变为如下样子:


继续在E1中输入30002,点击命令按钮,就会在f盘得到名为30002.xls的文件,依次类推。至此这个小程序就算基本完成啦~

不过,在单元格E1中输入这一点还可以进行以下修改,因为输入难免会有错误,而且当内容比较多时,反复输入也是挺麻烦的,因此我们可以在E1单元格中作一个数据有效性列表,具体操作如下:
首先要做一些准备工作:
1、使用高级筛选,选出B列“V特别声明:本文为企业作者上传发布,仅代表该作者观点、快闻网仅提供信息发布平台。OR#”的所有不重复记录,然后把这些不重复记录复制粘贴到sheet2,列A中;
2、选中sheet2列A,打开[插入]-[名称]-[定义]:给sheet2列A定义一个名称,如abc
设置数据有效性:
3、回到sheet1,选中单元格E1,打开[数据]-[有效性],跳出一个对话框,在“允许”中选择“序列”,“来源”中填写“=abc”,此时在单元格E1的右侧会出现下拉箭头,点击一下就能看到下拉列表中出现了“30001”“30002”“30003”,这样只要在列表中选择想要筛选的数值即可,免去了输入的麻烦。

 写了一堆,也不知道有没有说明白,呵呵~虽然上述代码基本实现了我所要的结果,但仍然有不足之处,例如:复制粘贴在新表格中的内容无法保持原有表格中的格式,如行距、列宽、字体等,虽然这个不是太重要,但总是不太完美,不知道有没有高手可以修正一下!
  Excel功能很强大,加上VB的Excel更强大。VB真的是一个非常有用的东西,虽然写代码很难,但是真的写出来了,可以简化很多office的操作,有空继续研究下去~