20170813xlVBA跨表筛选数据
一、数组方案
Sub CustomFilter()
Dim Rng As Range, Arr As Variant
Dim EndRow As Long, EndCol As Long
Dim i As Long, j As Long
Dim n As Long
Dim StartDate, EndDate
Dim BeginTime, EndTime
Dim Brr() As String Dim StartTime As Variant
Dim UsedTime As Variant
StartTime = VBA.Timer '获取原始数据
With Sheets("原始数据")
'获取A列最后一行(非空行)的行号
EndRow = .Cells(.Cells.Rows.Count, 1).End(xlUp).Row
'获取第一行最后一列(非空列)的列号
EndCol = .Cells(1, .Cells.Columns.Count).End(xlToLeft).Column
'保存数据
Set Rng = .Range(.Cells(2, 1), .Cells(EndRow, EndCol))
'Debug.Print Rng.Address
'存入数组
Arr = Rng.Value
End With '获取时间设定
With Sheets("筛选设定")
StartDate = .Range("A2").Text
EndDate = .Range("B2").Text
BeginTime = .Range("A4").Text
EndTime = .Range("B4").Text
End With '循环筛选符合条件的数据
'重新声明数组,用于保存筛选出来的数据
ReDim Brr(1 To EndCol, 1 To 1)
'初始化筛选结果的数量
n = 0
For i = LBound(Arr) To UBound(Arr)
If DateDiff("d", CDate(StartDate), CDate(Arr(i, 1))) >= 0 And _
DateDiff("d", CDate(Arr(i, 1)), CDate(EndDate)) >= 0 And _
Arr(i, 2) >= TimeValue(BeginTime) And _
Arr(i, 2) <= TimeValue(EndTime) Then
'时间在 Arr=Rng.Value的时候已经自动转为TimeValue
n = n + 1
ReDim Preserve Brr(1 To EndCol, 1 To n)
For j = 1 To EndCol
Brr(j, n) = Arr(i, j)
Next j
End If
Next i '输出结果
With Sheets("筛选数据")
'清除首行标题以外的内容
.UsedRange.Offset(1).ClearContents
'设置筛选数据的输出区域
Set Rng = .Range("A2")
Set Rng = Rng.Resize(UBound(Brr, 2), UBound(Brr))
'输出筛选结果
Rng.Value = Application.WorksheetFunction.Transpose(Brr)
End With Set Rng = Nothing UsedTime = VBA.Timer - StartTime
MsgBox "本次运行耗时:" & Format(UsedTime, "#0.0000秒") End Sub
二、SQL方案
Sub ADO_SQL_QUERY_LOOP()
Dim StartTime As Variant
Dim UsedTime As Variant
StartTime = VBA.Timer '变量声明
Dim Wb As Workbook
Dim ResultSht As Worksheet
Dim DataSht As Worksheet
Dim Rng As Range
Dim DataPath As String
Dim SQL As String
Dim StartDate, EndDate
Dim BeginTime, EndTime
Dim CNN As Object
Dim RS As Object
Dim DATA_ENGINE As String '实例化对象
Set Wb = Application.ThisWorkbook
DataPath = Wb.FullName Set DataSht = Wb.Worksheets("原始数据")
Set ResultSht = Wb.Worksheets("筛选数据") '获取时间设定
With Wb.Worksheets("筛选设定")
StartDate = .Range("A2").Text
EndDate = .Range("B2").Text
BeginTime = .Range("A4").Text
EndTime = .Range("B4").Text
End With '根据版本设置连接字符串
Select Case Application.Version * 1
Case Is <= 11
DATA_ENGINE = "Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties='Excel 8.0;HDR=YES;IMEX=2';Data Source="
Case Is >= 12
DATA_ENGINE = "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties='Excel 12.0;HDR=YES;IMEX=2'; Data Source= "
End Select '创建ADO Connection 连接器 实例
Set CNN = CreateObject("ADODB.Connection")
'创建 ADO RecordSet 记录集 实例
Set RS = CreateObject("ADODB.RecordSet")
'连接数据源
CNN.Open DATA_ENGINE & DataPath With ResultSht
'清除首行标题以外的内容
.UsedRange.Offset(1).ClearContents
EndRow = .Cells(.Cells.Rows.Count, 2).End(xlUp).Row
'设置输出结果区域
Set Rng = .Range("A2")
'设置查询语句
SQL = "SELECT * FROM [" & DataSht.Name & "$A1:Z] WHERE 日期 BETWEEN #" & StartDate & "# AND #" & EndDate & "# AND " & _
" 时间 BETWEEN #" & BeginTime & "# AND #" & EndTime & "#"
Debug.Print SQL
'执行查询 返回记录集
Set RS = CNN.Execute(SQL)
'复制记录集到指定Range
Rng.CopyFromRecordset RS
End With '关闭记录集
RS.Close
'关闭连接器
CNN.Close Set RS = Nothing
Set CNN = Nothing
Set Wb = Nothing
Set DataSht = Nothing
Set ResultSht = Nothing
Set Rng = Nothing UsedTime = VBA.Timer - StartTime
MsgBox "本次运行耗时:" & Format(UsedTime, "#0.0000秒") End Sub
20170813xlVBA跨表筛选数据的更多相关文章
- 如何Update跨表修改数据
大家都知道用Update修改单个表的使用方法,现在来看一下用update 跨表修改数据: 首先创建表 a 然后创建表b 现在要把表b的company 根据ID更新到表a 方法一: update a ...
- 20170621xlVBA跨表转换数据
Sub 跨表转置() Dim Wb As Workbook Dim Sht As Worksheet Dim oSht As Worksheet Dim Rng As Range Dim Index ...
- EXCEL 跨表比较数据
Public Sub Compare(fullname As String, sheet As String) Dim conn, sql, rows, i, cellContents ,rowInd ...
- excel跨表查询数据
环境:公司部分部门进行商品盘点,店铺经理要求不经过系统进行盘点,全程采用excel表格处理所示: 左图为总表,右图为首饰部门录入的数据 需求:找出盘点差异(即首饰部商品数量是否和 ...
- Drf 序列化 ModelSerializer跨表取数据
1.对于OneToOne.Foreignkey.choices字段可以使用source取出相关信息: class CourseSerializer(serializers.ModelSerialize ...
- django框架基础-ORM跨表操作-长期维护
############### 一对一跨表查询 ################ import os if __name__ == '__main__': os.environ.setde ...
- django(3) 一对多跨表查询、ajax、多对多
1.一对多跨表查询获取数据的三种形式:对象.字典.元组 例:有host与business两张表,host与business的id字段关联,business在host表中的对象名是b, 通过查询hos ...
- 教您如何进行SQL跨表更新
SQL跨表更新数据是在使用SQL数据库中比较常用的,下面就将为您详细介绍SQL跨表更新数据的步骤,希望对您学习SQL跨表更新数据有所启迪. 原始数据如下,首先是表结构 A_dept的初始数据 A_em ...
- sql 游标例子 根据一表的数据去筛选另一表的数据
sql 游标例子 根据一表的数据去筛选另一表的数据 DECLARE @MID nvarchar(20)DECLARE @UTime datetime DECLARE @TBL_Temp table( ...
随机推荐
- tomcat 的最大连接数设置
前提说明为了确保服务不会被过多的http长连接压垮,我们需要对tomcat设定个最大连接数,超过这个连接数的请求会拒绝,让其负载到其它机器.达到保护自己的同时起到连接数负载均衡的作用. 动手去做一开始 ...
- 数据仓库基础(八)Informatica 小例子
本文转载自:http://www.cnblogs.com/evencao/p/3147843.html 之前看了一段数据库的基础,感觉自己对数据库的基础挺薄弱的.以后再学习其他东西的时候也需要经常能学 ...
- python webdriver 从无到有搭建数据驱动自动化测试框架的步骤和总结
一步一步搭建数据驱动测试框架的过程和总结 跟吴老学了搭建自动化数据驱动的框架后,我在自己练习的时候,尝试从简单的程序进行一点一点的扩展和优化,到实现这个数据驱动的框架. 先说一下搭建自动化测试框架的目 ...
- Linux基础命令---dump
dump 检查ext2/3/4文件系统,确定哪些文件需要备份,这些需要备份的文件将会被复制到指定的磁盘或者其他存储介质.dump检查Ext 2/3/4文件系统上的文件,并确定哪些文件需要备份.这些文件 ...
- Python Web学习笔记之并发和并行的区别和实现
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行.你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发.你吃饭吃到一半,电话来了,你一边打 ...
- Python3.x:关于urllib中urlopen报错问题的解决方案
Python3.x:关于urllib中urlopen报错问题的解决方案 调用:urllib.urlopen(url) 报错:AttributeError: 'module' object has no ...
- linux平台关闭某个进程的脚本
在开发LINUX平台下的程序时,经常需要为我们的开发的程序写启动程序和关闭程序的脚本. 启动脚本比较好做,关闭程序脚本如下: 具体思路是通过ps命令找到程序的进程ID号,然后通过Kill命令将程序Ki ...
- Python3基础 os.path.splitext 处理文件名,得到文件名+扩展名
Python : 3.7.0 OS : Ubuntu 18.04.1 LTS IDE : PyCharm 2018.2.4 Conda ...
- 动态规划模板1|LIS最长上升子序列
LIS最长上升子序列 dp[i]保存的是当前到下标为止的最长上升子序列的长度. 模板代码: int dp[MAX_N], a[MAX_N], n; int ans = 0; // 保存最大值 for ...
- rabbitmq direct、fanout、topic 三种Exchange java 代码比较
Producer端 1.channel的创建 无论是才用什么样的Exchange,创建channel代码都是相同的,如下 ConnectionFactory factory = new Connect ...