1.需求场景
看到知乎上一个问题,"怎么用excel自动提取数据生成调拨单?",问题描述是:表1中有多个产品,每个产品都有ABCD仓,A仓为主仓,可以给BCD仓调拨,填写调拨数量后(正为调入,负为调出)怎么自动在表2中生成发生了调拨的产品的明细?
2.解决思路
其实这个问题的本质是从数据表中查找调拨数量不为空的数据行,将数据转移到调拨单的表格中。可以在数据表中加入一个按钮,编写一个方法,实现从数据表逐行读取向调拨单复制的效果,读取前对调拨数量C列单元格进行判断,如果单元格为空则跳过。
3.VBA实现
'定义工作簿变量
Dim wb As Workbook
'定义工作表变量
Dim ws, sh As Worksheet
'定义临时存储基本信息数据各字段的变量
Dim goods, store, amount As String
'循环变量
Dim i, j As Integer
Public Sub 提取数据生成调拨单()
'设置工作簿为当前工作簿
Set wb = Workbooks(1)
'设置基础数据表、填表模板到表变量
Set ws = Worksheets("数据")
Set sh = Worksheets("调拨单")
'关闭屏幕刷新
Application.ScreenUpdating = False
'设置调拨单表为当前激活的表格
sh.Activate
'清空表格中旧数据,填入标题行信息
sh.UsedRange.Delete
Cells(1, 1).value = "商品名称"
Cells(1, 2).value = "仓库"
Cells(1, 3).value = "调拨数量"
j = 2
'设置数据表为当前激活的工作表
ws.Activate
'逐行读取商品数据信息,根据调拨数量是否为空判断是否需要填入调拨单
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(i, 3).value <> "" Then
'将当前行各列单元格信息存至临时变量
goods = Cells(i, 1).value
store = Cells(i, 2).value
amount = Cells(i, 3).value
'设置调拨单为当前激活的工作表
sh.Activate
'将临时变量信息写入调拨单对应单元格
Cells(j, 1).value = goods
Cells(j, 2).value = store
Cells(j, 3).value = amount
j = j + 1
'设置数据表为当前激活的工作表
ws.Activate
End If
Next i
'释放工作表和工作簿变量
Set sh = Nothing
Set ws = Nothing
Set wb = Nothing
'开启屏幕刷新
Application.ScreenUpdating = True
'显示提示信息
MsgBox "生成完毕,请到“调拨单”表格中查看。"
End Sub
4.运行效果
5.改进输出格式
实现了提取调拨数据的功能,但对照题主的要求,输出格式要调整,需要列出调出仓库和调入仓库。但从题主给出的条件看,调出仓库为主仓库A,调入仓库可能是B、C、D中的任意一个。因此,调出数量是个冗余信息,问题的实质是只需要判断调出数量C列为正的数据,提取到调拨单表格中即可。对代码进行简单修改:
'定义工作簿变量
Dim wb As Workbook
'定义工作表变量
Dim ws, sh As Worksheet
'定义临时存储基本信息数据各字段的变量
Dim goods, store, amount As String
'循环变量
Dim i, j As Integer
Public Sub 提取数据生成调拨单()
'设置工作簿为当前工作簿
Set wb = Workbooks(1)
'设置基础数据表、填表模板到表变量
Set ws = Worksheets("数据")
Set sh = Worksheets("调拨单2")
'关闭屏幕刷新
Application.ScreenUpdating = False
'设置调拨单表为当前激活的表格
sh.Activate
'清空表格中旧数据,填入标题行信息
sh.UsedRange.Delete
Cells(1, 1).value = "商品名称"
Cells(1, 2).value = "调出仓库"
Cells(1, 3).value = "调入仓库"
Cells(1, 4).value = "调拨数量"
j = 2
'设置数据表为当前激活的工作表
ws.Activate
'逐行读取商品数据信息,根据调拨数量是否为空判断是否需要填入调拨单
For i = 2 To Range("A" & Rows.Count).End(xlUp).Row
If Cells(i, 3).value > 0 Then
'将当前行各列单元格信息存至临时变量
goods = Cells(i, 1).value
store = Cells(i, 2).value
amount = Cells(i, 3).value
'设置调拨单为当前激活的工作表
sh.Activate
'将临时变量信息写入调拨单对应单元格
Cells(j, 1).value = goods
Cells(j, 2).value = "A仓库"
Cells(j, 3).value = store
Cells(j, 4).value = amount
j = j + 1
'设置数据表为当前激活的工作表
ws.Activate
End If
Next i
'释放工作表和工作簿变量
Set sh = Nothing
Set ws = Nothing
Set wb = Nothing
'开启屏幕刷新
Application.ScreenUpdating = True
'显示提示信息
MsgBox "生成完毕,请到“调拨单”表格中查看。"
End Sub
运行后效果:
如果这个思路有帮助,欢迎点赞、回复交流或关注!
#点赞富三代,分享美一生#