最近工作中有需求,要从Excel表中提取一些统计信息,因为需求变动可能比较频繁,所以用VBA来做了。调试数据操作部分颇费周折,特记录一下。

1.数据源文件:[D:\4月份统计表.xlsx]:

2.最终的统计表格式:

3.计算规则:

要求:

A. 外观等级A,且WLD在451.5-458之间,且LOP在82-200之间判定为OK,其他为NG。

B.将NG的按照表面等级→WLD→LOP的优先顺序,判定是哪一项引起的不良,更新到数据源的 [筛选结果] 中。

C.在统计表中按照入库日期分组,统计总数量、OK数量、NG数量,以及NG产品中外观等级、WLD、LOP各占多大比例。

4.代码:

Option ExplicitPublic Sub DataInquire()Dim strCnn As String, sqlStr As String, subSqlStr As String, strSql(1 To 4) As String '判断条件 1=OK,2=外观等级NG,3=WLDNG,4=LOPNGDim MainBook As WorkbookDim Arr() As Variant, rngA As Range, rngB As RangeDim cnn As Object, rs As ObjectDim i As Long, itemStr(1 To 4) As String '判定标志 1=OK,2=外观等级,3=WLD,4=LOPDim sourceFile As StringSet cnn = CreateObject("ADODB.Connection")Set rs = CreateObject("ADODB.Recordset")Set MainBook = ThisWorkbooksourceFile = "D:\4月份统计表.xlsx"strCnn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source='" + sourceFile + "';Extended Properties='Excel 12.0;HDR=YES,IME=1'"With ThisWorkbook.Worksheets(1)strSql(1) = " And [外观等级] ='A' And [WLD] >=451.5 And [WLD] <=458 And LOP>=82 And LOP<200"strSql(2) = " And [外观等级] <>'A'"strSql(3) = " And ([WLD] <451.5 or [WLD] >458)"strSql(4) = " And (LOP>=82 or LOP<200"itemStr(1) = "OK"itemStr(2) = "外观等级"itemStr(3) = "WLD"itemStr(4) = "LOP"Set rngA = .Range("B" & .Cells(6000, "B").End(xlUp).Row + 1).Resize(1, 12) '//找到写数据的位置End Withcnn.Open strCnnIf cnn.State = 1 ThenFor i = 4 To 1 Step -1 '//更新筛选结果sqlStr = "update [数据源$] set [筛选结果]= '" & itemStr(i) & "' where 1=1 " & strSql(i)cnn.Execute sqlStrNext i'//Excel/Access不支持case when then end结构,要用IIF来代替
'        subSqlStr = "(select [序号], case [筛选结果] when 'OK' then 1 end as [OK]," & _
'                " case [筛选结果] when '外观等级' then 1 end as [外观等级]," & _
'                " case [筛选结果] when 'WLD' then 1 end as [WLD]," & _
'                " case [筛选结果] when 'LOP' then 1 end as [LOP]," & _
'                " from [数据源$]) B "
'       ///subSqlStr = "(select [衬底编号], iif( [筛选结果] = 'OK',1,0 ) as [OK]," & _" iif( [筛选结果] = '外观等级',1,0 ) as [外观等级]," & _" iif( [筛选结果] = 'WLD',1,0 ) as [WLD]," & _" iif( [筛选结果] = 'LOP',1,0 ) as [LOP]," & _" from [数据源$]) B "sqlStr = "select A.[入库日期],count(A.[入库日期]) as 总数量,sum(B.[OK]) as OK,(count(A.[入库日期])-sum(B.[OK])) as NG,sum(B.[外观等级])/(count(A.[入库日期])-sum(B.[OK]))," & _" sum(B.[WLD])/(count(A.[入库日期])-sum(B.[OK])),sum(B.[LOP])/(count(A.[入库日期])-sum(B.[OK]))" & _"from [数据源$] A, " & subSqlStr & " where A.[序号]=B.[序号] " & _"group by A.[入库日期] order by A.[入库日期] asc"Set rs = cnn.Execute(sqlStr)If Not rs.EOF ThenArr = WorksheetFunction.Transpose(rs.GetRows())Set rngA = rngA.Resize(UBound(Arr, 1), 12)rngA = ArrrngA.Borders.LineStyle = xlContinuousrngA.Resize(, 1).Offset(, 4).Resize(, 8).NumberFormatLocal = "0.00%"End IfSet rs = NothingEnd Ifcnn.Close
End Sub

说明:

A.要将[筛选结果]做细项分析,就要用到行转列。而Excel/Access中没有case when then end 结构,更没有pivot可以用,幸好有IIF可用。

B.Transpose函数使用有些限制,要求结果集不超过1024行[未验证],且结果集不包含null[已验证]。

C.Excel作为数据库,查询速度明显比Access数据库以及SqlServer、Oracle速度慢很多。5万多行数据,要查询大约20秒了。

D.Excel表作为数据库使用,select和update可正常使用,但insert和delete不能用。使用select into 可以创建新的Excel工作表。

VBA 使用Excel数据库:行转列相关推荐

  1. Excel高亮显示行、列

    Excel高亮显示行.列 高亮行 在需要操作的工作表中ALT+F11进入VBA编辑器,选择worksheet (sheet1等),插入如下代码可高亮显示单击所在行 Private Sub Worksh ...

  2. 数据库行转列的sql语句

    前段时间参加公司的面试,其中有一道面试题就是sql中行列互换问题.我晓得这个思想但是不晓得具体用sql语句来实现.通过在网上寻找和自己的尝试.终于解决了.下面是我从网站上转载的文章.觉得入门还比较可以 ...

  3. excel表格行宽列高怎么设置_excel表格怎么设置行高列宽

    excel表格怎么设置行高列宽 你是怎么调整Excel表格的行高和列宽的? 如果还在用原始的手动调整方法,那你赶紧看看下面这几种解决方法,不仅效率高,而且调整的行高和列宽还很统一整齐哦,快和小编来学习 ...

  4. 数据库行转列的sql语句(zt)

    转载:http://www.cnblogs.com/Charles2008/archive/2008/03/04/1090162.html 问题描述 假设有张学生成绩表(CJ)如下 Name Subj ...

  5. Excel分组行转列(Power Query透视列,一维表转二维表)

    MySQL的行转列,知道吧!不知道也没关系,往下看!!! 如何把一维表转成二维表(行转列/透视列): 这里我们使用的是Excel内置的PowerQuery功能: 笔者使用的版本是:2019: 效果 表 ...

  6. Excel分组行转列

    表格一 表格二 Excel表格一分组行转列变为表格二所示的格式怎么弄? 方案一: 转置粘贴, 每组数据单独处理,一组一组的选择,然后右键"粘贴选项"->"转置&qu ...

  7. python xlwings追加数据_Python学习随笔:使用xlwings设置和操作excel多行多列数据以及设置数据字体颜色填充色对齐方式的方法...

    一.关于整行整列数据读写的问题 在<Python学习随笔:使用xlwings读取和操作Excel文件>介绍了一次读写整行和整列的方法,整行数据写入时可以简单将读取的赋值语句交换一下等号左右 ...

  8. python实现Excel多行多列的转换

    目录 前言 一.使用需求 二.使用步骤 1.引入库 2.读入数据 3.将需要合并的列的列名先放在列表中 4.填充空值为0 5.添加新列,把待合并的所有列变成一个大字符串(传入函数处理) 6.删除合并之 ...

  9. 巧妙使用excel 实现行转列

    1. 本来想通过写sql的方式来实现简单的行转列 但是 时间要求很紧 (主要是自己懒 并且sql写的不好. ) 通过同事提醒 以及百度 找到一个很简单的方法,通过excel 来实现. 2. 具体操作步 ...

最新文章

  1. “一碗牛肉面”引发的管理难题
  2. OpenStack-Pike(一)
  3. Python爬虫入门教程 26-100 知乎文章图片爬取器之二
  4. 一个让我很不爽的外包项目——奔驰Smart2015新官网
  5. WordPress中使主题支持小工具以及添加插件启用函数
  6. 多线程下实现自增的几种方式
  7. Hadoop精华问答 | 非大数据的项目能否用Hadoop?
  8. 病人排队(信息学奥赛一本通-T1183)
  9. phpmyadmin/scripts/setup.php,Linux下phpMyAdmin安装过程中的问题解决
  10. linux sftp创建多用户,同一台 Centos (Linux)服务器设置多个sftp 账号,并限制用户只能访问指定文件路径...
  11. python前端Django指南之Hello worldl输出
  12. Intel SGX官网
  13. 【docker】win10系统下docker容器安装及使用(二):docker通过commit及dockerfile进行创建
  14. sre_constants.error: unbalanced parenthesis
  15. 阴暗的底层阶级版罗密欧与朱丽叶——甲贺忍法帖
  16. pdf文件如何删除其中一页内容
  17. 520谁才是你的真爱?
  18. Skyline WEB端开发3——添加一个弹框
  19. Nature综述:大脑中的音乐
  20. 服务器4个网口只显示2个,服务器4个网口的作用

热门文章

  1. 腾讯云短信接口实现(亲测可用,不能用来捶我)
  2. NI.LabVIEW.v8.6.1
  3. ESP8266 SGP30检测eCO2和TVOC
  4. (php毕业设计)基于php的宫崎骏动漫电影网站管理系统源码
  5. 服务器中毒了,无法登陆,开启拷贝恢复之路
  6. 面了1个自动化测试,开口就是20k,只能说痴人做梦...
  7. android 应用数据分析
  8. 1444_TC275 DataSheet阅读笔记5_部分管脚功能的梳理
  9. 计算机语音处理包括,关于用于计算机语音识别的隐马尔科夫模型和自然语言的计算机处理...
  10. vue-router 源码阅读 - 文件结构与注册机制