年底了要打印库存商品明细账,要按每个型号打印,一个一个的筛选容易出错
这个问题我思考了一下,暂时想到的呢是用VBA去解决。
说一下我的思路:
-
进销存明细表数据量较为庞大,涉及商品几百个之多,不能用筛选的笨方法去逐个打印
-
可能存在每个型号有多行数据的可能
-
利用VBA将每个型号的数据单独查询出来
-
再将查询出来的数据附上表头
-
然后将带有表头的有效数据复制到新的工作簿中
-
以产品型号为新的工作簿命名并保存
-
多次循环以达到查询出所有型号的产品的目的
-
将所有单个产品型号的工作薄存储在一个文件夹中
-
最后打印所有新工作博
我简单的做了一个进销存的明细表,包含20个产品,示例如下:
VBA代码示例如下(由于代码占用篇幅较大,我放在文末了):
执行代码后,已经创建好的存储文件夹中:
随便打开一个文件查看,新文件查询生成ok
表头没问题,数据查询没问题,也不存在空文件
接下来,鉴于不能一次性打印太多的文件,只能选中一部分文件打印,如下:
此VBA代码使用说明
-
由于需要定义要查找的内容,所以,在运行代码前,我们需要将所有的产品类型找出来,相信这是个简单的过程,大家能会做,如果有重复项,去重即可。
-
新建一个叫做“数组”sheet,并将所有的产品类型复制到第一列中,当然了,你也可以根据自己的需要去创建,但是在代码中得随着更改。如下图:
- 修改你的进销存的表头在表格中的区域区域,如下图:
- 修改表头以下,数据内容的起始单元格,如下图:
-
然后创建一个新文件夹,并将文件的地址,更改到代码中,如下图:
需要注意的最后一定要加一个“/”用以表示文件夹层级,在我的示例中,如果不标,就会把查询后生成的文件都放到Desktop文件夹下,并且工作簿名会带上“test”,这样不行
-
将sheet切换到你的要查询的进销存表格,让表格处于激活状态
-
最后即可执行VBA代码了
如果有报错,就得自己检查一下代码了
代码如下:
Sub test()
Dim myText$, myRow As Long
Dim d As Object, myRng As Range, myRng1 As Range, i%
Application.ScreenUpdating = False '禁止运行时刷新
Application.DisplayAlerts = False '禁止告警
Set myRng1 = ActiveSheet.[A1:T2] '定义表头位置
For i = 1 To 20 Step 1
Set d = CreateObject("scripting.dictionary")
myText = Sheets("数组").Cells(i, 1) '要查找的内容位置
With ActiveSheet.Cells '查找的范围
Set c = .Find(myText, Lookat:=xlPart)
If Not c Is Nothing Then
firstAddress = c.Address
Do
myRow = c.Row
If d.exists(myRow) = False Then
If myRng Is Nothing Then Set myRng = Rows(myRow) Else Set myRng = Union(myRng, Rows(myRow))
d(myRow) = 0
End If
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address firstAddress
End If
End With
If Not myRng Is Nothing Then
myRng1.Copy Workbooks.Add.Sheets(1).Range("A1") '复制表头
myRng.Copy ActiveSheet.Range("A3") '复制内容
ActiveWorkbook.SaveAs Filename:="C:UsershxyuhDesktop est" & myText & ".xlsx" '新工作簿保存位置及工作簿名定义
ActiveWindow.Close
End If
Set myRng = Nothing
Next i
Application.ScreenUpdating = True '开启运行时刷新
Application.DisplayAlerts = True '开启告警
End Sub
回答完毕,我就不一一写代码的注释了,有需要的朋友私信或者评论问我就行了。
太晚了,回答的比较仓促,代码没写的那么便于使用。欢迎大神们来补充优化,谢谢!