ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

多列日期转换成单列日期问题

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-10-12 08:32 | 显示全部楼层 |阅读模式
最近接手一些新工作,但旧的记录不规范、不利于统计分析,想梳理成规范的记录。今年9个月的数据如果靠人工处理就耗时太久、也机易出错,所以拜请各位老师提供个合适代码,在此先行谢过各位~

转换要求:主要是把多列日期转换成单列日期,且其余数据对应。转换后,删除生产数量为0的行数据,删除不合格数量为0的行数据。因为旧表本身不规范,可以先做简单的规范化处理再使用VBA,也可以使用辅助列。


微信截图_20191012082635.png

Book1.zip

95.84 KB, 下载次数: 7

TA的精华主题

TA的得分主题

发表于 2019-10-12 10:28 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-10-12 10:28 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
看一下,是不是你想要的

Book1.rar

94.27 KB, 下载次数: 2

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-12 11:05 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xuemei0216 发表于 2019-10-12 10:28
看一下,是不是你想要的

怎么没看到有公式/代码?

TA的精华主题

TA的得分主题

发表于 2019-10-12 11:08 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xiang当当 发表于 2019-10-12 11:05
怎么没看到有公式/代码?

哦,传错了。把你原附件传上来了。这个应该有了

Book1.rar

116.65 KB, 下载次数: 3

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-12 15:12 | 显示全部楼层

老师好,VBA整理之后,不合格数量之和是297;在旧表E列筛选“数量”后,F列求和是252;两者的不合格数量对应不上这是什么问题?
另外,麻烦老师帮忙修改下,数据重排后,只删除生产数量为0的行数据,不删除不合格数量为0的行数据(核对才发现删除不合格数量为0的行数据会把部分生产数量不为0的也删除了,影响生产数量的准确性)。
谢谢老师~

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-12 15:12 | 显示全部楼层
xuemei0216 发表于 2019-10-12 11:08
哦,传错了。把你原附件传上来了。这个应该有了

老师好,VBA整理之后,不合格数量之和是297;在旧表E列筛选“数量”后,F列求和是252;两者的不合格数量对应不上这是什么问题?
另外,麻烦老师帮忙修改下,数据重排后,只删除生产数量为0的行数据,不删除不合格数量为0的行数据(核对才发现删除不合格数量为0的行数据会把部分生产数量不为0的也删除了,影响生产数量的准确性)。
谢谢老师~

TA的精华主题

TA的得分主题

发表于 2019-10-12 16:40 | 显示全部楼层
  1. Option Explicit

  2. Sub Test()
  3.     Dim shData As Worksheet, shResult As Worksheet
  4.     Dim lngMax As Long, arrData As Variant, arrDateTitle As Variant
  5.     Dim lngCur As Long, arrResult As Variant
  6.     Dim rgType  As Range, lngRows As Long
  7.     Dim lngRowID As Long, lngColID As Long
  8.     Dim strType As String, strID As String, strMemo As String
  9.     Dim lngProNum As Long, strUnCause As String
  10.     Dim lngNum As Long, strDate As String, lngCountNum As Long
  11.    
  12.     Set shData = Sheets("旧表数据")
  13.     Set shResult = Sheets("新表")
  14.     arrDateTitle = shData.Range("G2").Resize(1, 31)
  15.    
  16.     lngMax = shData.Range("E" & Rows.Count).End(xlUp).Row
  17.     ReDim arrResult(1 To lngMax * 31, 1 To 7)
  18.     lngCur = 0
  19.    
  20.     Set rgType = shData.Range("A3")
  21.     Do Until rgType.Row > lngMax
  22.         If rgType.MergeCells Then Set rgType = rgType.MergeArea
  23.         lngRows = rgType.Rows.Count
  24.         
  25.         If lngRows > 3 Then
  26.             strType = rgType(1).Value '物料种类
  27.             strID = rgType.Offset(0, 1)(1).Value '物料编码
  28.             strMemo = rgType.Offset(0, 2)(1).Value '物料描述

  29.             
  30.             arrData = rgType.Offset(0, 4).Resize(lngRows, 33)
  31.             
  32.             For lngColID = 3 To 31
  33.                 strDate = arrDateTitle(1, lngColID) '日期
  34.                 lngProNum = Val(arrData(2, lngColID)) '生产数量
  35.                 lngCountNum = Val(arrData(3, lngColID)) '不合格数量
  36.                 If lngProNum > 0 Then '如果生产数量>0
  37.                     If lngCountNum > 0 Then '如果不合格总数量>0
  38.                         For lngRowID = 4 To lngRows
  39.                             strUnCause = arrData(lngRowID, 1) '不合格原因
  40.                             lngNum = arrData(lngRowID, lngColID) '不合格数量
  41.                             If lngNum > 0 Then '如果具体不合格项的数量>0
  42.                                 lngCur = lngCur + 1
  43.                                 arrResult(lngCur, 1) = strType
  44.                                 arrResult(lngCur, 2) = strID
  45.                                 arrResult(lngCur, 3) = strMemo
  46.                                 arrResult(lngCur, 4) = lngProNum
  47.                                 arrResult(lngCur, 5) = strUnCause
  48.                                 arrResult(lngCur, 6) = lngNum
  49.                                 arrResult(lngCur, 7) = strDate
  50.                             End If
  51.                         Next
  52.                     Else '如果没有不合格,增加一条生产数量的记录
  53.                         lngCur = lngCur + 1
  54.                         arrResult(lngCur, 1) = strType
  55.                         arrResult(lngCur, 2) = strID
  56.                         arrResult(lngCur, 3) = strMemo
  57.                         arrResult(lngCur, 4) = lngProNum
  58.                         arrResult(lngCur, 7) = strDate
  59.                     End If
  60.                 End If
  61.             Next
  62.         End If
  63.         
  64.         Set rgType = rgType.Offset(1, 0)
  65.     Loop
  66.    
  67.     shResult.Range("A2:G" & Rows.Count - 1).ClearContents
  68.     shResult.Range("A2").Resize(lngCur, 7) = arrResult
  69.    
  70.     MsgBox "OK"
  71. End Sub
复制代码

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-10-15 13:28 | 显示全部楼层

你好,代码达到的效果是我需要的,不过数据不对应了,如附件,挑选了旧表28号的数据作对比,生产数量和不合格数量对应不上。
另外总的生产数量去重后是149713,总的不合格数量是297。
补充:旧表中,“合计”所在的列与“数量”所在的行,是包含求和公式的;但我核对了好几次,才发现这些公式中有部分单元格没有填充到(例如旧表AH205),所以这两行数据是不准确的,不能直接使用。

Book2.zip

114.65 KB, 下载次数: 0

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

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 06:49 , Processed in 0.050722 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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