Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 5871|回复: 12

[已解决]如何实现由原始表和汇总表的自动生成?

[复制链接]
发表于 2015-5-11 09:00 | 显示全部楼层 |阅读模式
如何实现由原始数据(表2和表3)生成汇总数据(表1),反之,有表1的数据后,可以生成表2和表3的数据。
因为汇总表按品名汇总的,原始数据是按天记录的,感觉有点儿难了。
最佳答案
2015-5-12 11:08
  1. Sub 生成入库单()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     For Each sh In Worksheets
  4.         dw = Right(sh.[i2], 1)
  5.         If InStr(sh.Name, "库单") = 0 Then
  6.             arr = sh.Range("a4:j19")
  7.             For i = 1 To UBound(arr)
  8.                 For k = 1 To 10 Step 5
  9.                     x = arr(i, k)
  10.                     If Len(x) > 0 Then
  11.                         xmonth = Split(x, ".")(0): xday = Split(x, ".")(1)
  12.                         x = DateSerial(2015, xmonth, xday)
  13.                         If arr(i, k + 2) > 0 Then d(x) = d(x) & "," & sh.Name & "," & dw & "," & arr(i, k + 2)
  14.                     End If
  15.                 Next
  16.             Next
  17.         End If
  18.     Next
  19.     n = -10: k = 0
  20.     Application.ScreenUpdating = False
  21.     With Sheets("入库单")
  22.         .[a:f] = ""
  23.         Set copyrng = .Range("J1:O10")
  24.         For Each x In d.keys
  25.             k = k + 1
  26.             xrr = Split(d(x), ",")
  27.             n = n + 11
  28.             copyrng.Copy .Cells(n, 1)
  29.             s = 0
  30.             .Cells(n + 1, 1) = "编号:" & Format(k, "000")
  31.             .Cells(n + 1, 3) = x
  32.             For i = 1 To UBound(xrr) Step 3
  33.                 s = s + 1
  34.                 If s = 6 Then
  35.                     s = 1
  36.                     n = n + 11
  37.                     k = k + 1
  38.                     copyrng.Copy .Cells(n, 1)
  39.                     .Cells(n + 1, 1) = "编号:" & Format(k, "000")
  40.                     .Cells(n + 1, 3) = x
  41.                 End If
  42.                 .Cells(n + s + 2, 1) = s
  43.                 .Cells(n + s + 2, 2) = xrr(i)
  44.                 .Cells(n + s + 2, 3) = xrr(i + 1)
  45.                 .Cells(n + s + 2, 5) = xrr(i + 2)
  46.             Next
  47.         Next
  48.     End With
  49.     Application.ScreenUpdating = True
  50. End Sub
复制代码

工作簿1.zip

22.15 KB, 下载次数: 30

发表于 2015-5-11 09:17 | 显示全部楼层
建议你重新设计表格结构,你这不是玩Excel,是被Excel玩
回复

使用道具 举报

 楼主| 发表于 2015-5-11 11:38 | 显示全部楼层
Excel学徒123 发表于 2015-5-11 09:17
建议你重新设计表格结构,你这不是玩Excel,是被Excel玩

表格是固定了的,全市统一了的。这样搞的话真的很麻烦,而且这到还要制成模板了发给企业的(企业人员水平比我还低,只会用)。所以我想要做的就是要么录入出库单和入库单,要么只录入过录表,另一边的数据直接就出来。

点评

建议请软件公司定制,论坛上的基本都是学习的,一般很少有人会做容错处理,而且代码只针对你发的这个表,所以后续会有很多调整的  发表于 2015-5-11 13:21
回复

使用道具 举报

发表于 2015-5-11 12:57 | 显示全部楼层
表格里自己填点内容再说,空表格叫人如何汇总。
回复

使用道具 举报

 楼主| 发表于 2015-5-11 14:38 | 显示全部楼层
grf1973 发表于 2015-5-11 12:57
表格里自己填点内容再说,空表格叫人如何汇总。

好的,就是将各种产品的汇总按天分到每张入库出库单中去。

1月产品产量出入库过录账.zip

21.4 KB, 下载次数: 9

回复

使用道具 举报

发表于 2015-5-12 11:08 | 显示全部楼层    本楼为最佳答案   
  1. Sub 生成入库单()
  2.     Set d = CreateObject("scripting.dictionary")
  3.     For Each sh In Worksheets
  4.         dw = Right(sh.[i2], 1)
  5.         If InStr(sh.Name, "库单") = 0 Then
  6.             arr = sh.Range("a4:j19")
  7.             For i = 1 To UBound(arr)
  8.                 For k = 1 To 10 Step 5
  9.                     x = arr(i, k)
  10.                     If Len(x) > 0 Then
  11.                         xmonth = Split(x, ".")(0): xday = Split(x, ".")(1)
  12.                         x = DateSerial(2015, xmonth, xday)
  13.                         If arr(i, k + 2) > 0 Then d(x) = d(x) & "," & sh.Name & "," & dw & "," & arr(i, k + 2)
  14.                     End If
  15.                 Next
  16.             Next
  17.         End If
  18.     Next
  19.     n = -10: k = 0
  20.     Application.ScreenUpdating = False
  21.     With Sheets("入库单")
  22.         .[a:f] = ""
  23.         Set copyrng = .Range("J1:O10")
  24.         For Each x In d.keys
  25.             k = k + 1
  26.             xrr = Split(d(x), ",")
  27.             n = n + 11
  28.             copyrng.Copy .Cells(n, 1)
  29.             s = 0
  30.             .Cells(n + 1, 1) = "编号:" & Format(k, "000")
  31.             .Cells(n + 1, 3) = x
  32.             For i = 1 To UBound(xrr) Step 3
  33.                 s = s + 1
  34.                 If s = 6 Then
  35.                     s = 1
  36.                     n = n + 11
  37.                     k = k + 1
  38.                     copyrng.Copy .Cells(n, 1)
  39.                     .Cells(n + 1, 1) = "编号:" & Format(k, "000")
  40.                     .Cells(n + 1, 3) = x
  41.                 End If
  42.                 .Cells(n + s + 2, 1) = s
  43.                 .Cells(n + s + 2, 2) = xrr(i)
  44.                 .Cells(n + s + 2, 3) = xrr(i + 1)
  45.                 .Cells(n + s + 2, 5) = xrr(i + 2)
  46.             Next
  47.         Next
  48.     End With
  49.     Application.ScreenUpdating = True
  50. End Sub
复制代码

1月产品产量出入库过录账.rar

31.36 KB, 下载次数: 60

回复

使用道具 举报

 楼主| 发表于 2015-5-12 12:01 | 显示全部楼层
grf1973 发表于 2015-5-12 11:08

谢谢,太厉害了!
回复

使用道具 举报

发表于 2015-5-12 15:57 | 显示全部楼层
grf1973 发表于 2015-5-12 11:08

我是新人,可不可以帮我看看帖子http://www.excelpx.com/thread-343048-1-1.html
回复

使用道具 举报

 楼主| 发表于 2015-5-15 17:05 | 显示全部楼层
grf1973 发表于 2015-5-12 11:08

大师,还有一个问题,第一列可以执行(A1:A19),后面的(F1:F19)不能行啊。也就是说只点自动生成后,F1-F9内的日期没有执行。是不是还要加一段代码?
回复

使用道具 举报

 楼主| 发表于 2015-5-15 17:11 | 显示全部楼层
grf1973 发表于 2015-5-12 11:08

对不起,我表述错了,能不能让编号先排A4-A19,再排F4-F19?第编号001是1月1日,编号002是1月18日,编号003又到1月4日了感觉不是很符合逻辑。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-20 17:00 , Processed in 0.440367 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表