ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 619|回复: 6

[求助] 从源表中读取固定信息

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-3 14:10 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
年份        物品编号        物品名称        规格型号        单位        参考单价        配备标准        库存数量
这是源表sheets("小学数学"),源表中从第4行起记录不同年份的小学数学所有仪器,每一年都是按相同的物品编号先后顺序记录的。每个相同物品编号有库存数量上的不同,其余各列每年信息都是一样的。现在我想根据源表得到一个新表。年份  物品编号        物品名称        规格型号        单位        参考单价        配备标准        增加数量 减少数量 这分别是新表列标题。实现的功能:1、源表的第一年的所有行的数据记录前8列复制到新表的前8列,源表中第一年有多少行数据,新表就有多少行数据。在新表从第二行开始记录,第一行为列标题行(原表列“库存数量”到新表叫“增加数量”)新表中第一年数据只有8列。2、从第二年起每一物品编号的库存数量要与上一年的库存数量比较,比上一年库存数量有增减的所在记录行的数据前7列复制到新表,接着已有的新表末行的下一行开始存放,是增加的把增加值写入复制过来的对应行的第8列,是减少的把减少值写在复制过来的对应行的第9列。源表中相邻年份同一物品编号的库存数量相同的不复制。第三年的物品的库存数量与对应的第二年的库存数量比较,以此类推。3、在新表中记录行的顺序是源表中第一年的所有物品记录数据行;第二年比第一年库存数量有增加的数据行,第二年比第一年库存数量有减少的数据行;第三年比第二年库存数量增加的数据行,第三年比第二年库存数量有减少的数据行;以此类推,至到源表中的相邻年份的同一物品比较完成。用excelvba宏代码实现。提示,年份列是用数字表示的(如2015、2016、2017等),每个物品相邻年份相隔的行数相同,每年的数据都是按物品编号排序的。新表中从第二年起记录是库存数量与上一年的增减情况。向各位大神求助!

TA的精华主题

TA的得分主题

发表于 2023-5-3 16:07 | 显示全部楼层
说明很详细,但是缺少最关键的东西——附件,上传附件才可能得到别人的帮助

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-4 14:46 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
3190496160 发表于 2023-5-3 16:07
说明很详细,但是缺少最关键的东西——附件,上传附件才可能得到别人的帮助

获取数据.zip (106.37 KB, 下载次数: 10)

自定义菜单.zip

44.18 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2023-5-4 14:53 | 显示全部楼层
大哥,你至少传个3年的数据吧

TA的精华主题

TA的得分主题

发表于 2023-5-4 15:14 | 显示全部楼层
基本上看明白了,工作量不小,

TA的精华主题

TA的得分主题

 楼主| 发表于 2023-5-4 15:59 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
3190496160 发表于 2023-5-4 15:14
基本上看明白了,工作量不小,

有劳了,不愖感激。我这里有一段代码,搞来搞去都是错的,结果是把整个表复制过去了,不知道哪里出了问题。
Sub GenerateNewTable()
Dim srcSheet As Worksheet, destSheet As Worksheet
Dim srcLastRow As Long, destLastRow As Long
Dim srcYear As Integer, destYear As Integer
Dim srcItemNum As String, destItemNum As String
Dim srcStockQty As Double, destStockQty As Double
Dim changeQty As Double

'源表与新表
Set srcSheet = ThisWorkbook.Sheets("小学数学")
Set destSheet = ThisWorkbook.Sheets.Add(After:=srcSheet)
destSheet.name = "增减记录"

' 新表第一行列标题
destSheet.Cells(1, 1) = "年份"
destSheet.Cells(1, 2) = "物品编号"
destSheet.Cells(1, 3) = "物品名称"
destSheet.Cells(1, 4) = "规格型号"
destSheet.Cells(1, 5) = "单位"
destSheet.Cells(1, 6) = "参考单价"
destSheet.Cells(1, 7) = "配备标准"
destSheet.Cells(1, 8) = "增加数量"
destSheet.Cells(1, 9) = "减少数量"

'源表与新表遍历
srcLastRow = srcSheet.Cells(Rows.count, 1).End(xlUp).Row
destLastRow = 1
For i = 4 To srcLastRow
    srcYear = srcSheet.Cells(i, 1)
    srcItemNum = srcSheet.Cells(i, 2)
    srcStockQty = srcSheet.Cells(i, 8)

    If i = 4 Or (srcItemNum <> prevItemNum) Then
        destLastRow = destLastRow + 1
        destYear = srcYear
        destItemNum = srcItemNum
        destStockQty = srcStockQty

        destSheet.Cells(destLastRow, 1) = destYear
        destSheet.Cells(destLastRow, 2) = destItemNum
        destSheet.Cells(destLastRow, 3) = srcSheet.Cells(i, 3)
        destSheet.Cells(destLastRow, 4) = srcSheet.Cells(i, 4)
        destSheet.Cells(destLastRow, 5) = srcSheet.Cells(i, 5)
        destSheet.Cells(destLastRow, 6) = srcSheet.Cells(i, 6)
        destSheet.Cells(destLastRow, 7) = srcSheet.Cells(i, 7)
    Else
        changeQty = srcStockQty - destStockQty

        If changeQty > 0 Then
            destLastRow = destLastRow + 1
            destYear = srcYear
            destStockQty = srcStockQty

            destSheet.Cells(destLastRow, 1) = destYear
            destSheet.Cells(destLastRow, 2) = destItemNum
            destSheet.Cells(destLastRow, 3) = srcSheet.Cells(i, 3)
            destSheet.Cells(destLastRow, 4) = srcSheet.Cells(i, 4)
            destSheet.Cells(destLastRow, 5) = srcSheet.Cells(i, 5)
            destSheet.Cells(destLastRow, 6) = srcSheet.Cells(i, 6)
            destSheet.Cells(destLastRow, 7) = srcSheet.Cells(i, 7)
            destSheet.Cells(destLastRow, 8) = changeQty
        ElseIf changeQty < 0 Then
            destLastRow = destLastRow + 1
            destYear = srcYear
            destStockQty = srcStockQty

            destSheet.Cells(destLastRow, 1) = destYear
            destSheet.Cells(destLastRow, 2) = destItemNum
            destSheet.Cells(destLastRow, 3) = srcSheet.Cells(i, 3)
            destSheet.Cells(destLastRow, 4) = srcSheet.Cells(i, 4)
            destSheet.Cells(destLastRow, 5) = srcSheet.Cells(i, 5)
            destSheet.Cells(destLastRow, 6) = srcSheet.Cells(i, 6)
            destSheet.Cells(destLastRow, 7) = srcSheet.Cells(i, 7)
            destSheet.Cells(destLastRow, 9) = -changeQty
        End If
    End If

    prevItemNum = srcItemNum
Next i

End Sub

TA的精华主题

TA的得分主题

发表于 2023-5-5 09:30 | 显示全部楼层
论坛只能解决一般性问题,毕竟大家都是一种业余爱好而已,
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-17 05:26 , Processed in 0.041810 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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