举一反三,简单的案例「复杂化」,这样学习VBA效果杠杠的!查询时间最近的记录:如何提取所有车牌号最近时间的手机号

文摘   教育   2024-10-03 12:36   江苏  

点【关于本公众号】了解一下,欢迎关注谢谢!

快速浏览

实用案例

|日期控件||简单的收发存||收费管理系(Access改进版)|

|电子发票管理助手||电子发票登记系统(Access版)|

|文件合并||表格拆分||审计凭证抽查底稿|

|中医诊所收费系统(Excel版)||中医诊所收费系统(Access版)||银行对账单自动勾对|

|印章使用登记系统|

收费使用项目

|财务管理系统||工资薪金和年终奖个税筹划||新税法下工资表模版|

内容提要

  • 查找符合条件的记录
  • 数组、字典、工作表排序、SQL、SortedList
大家好,我是冷水泡茶,今天在论坛上看到一个求助贴:[求助] vba查找最近的数据
具体要求:

请教大侠们:怎样根据表里要求查找时间最近的那个手机号

需求:

把D列车牌号去重复后,再根据车牌号查找时间最近的那个手机号(表里有的一个车牌号有多个手机号).

看这个需求描述,估计不是太难,下载附件打开一看,数结构比较简单。
我们先看一下数据表格,就是一张Sheet1工作表。左侧是数据区域,右则是结果区域:
基本思路与需求分析:

1、找到每个车牌号时间值最大的记录,问题就解决了。

2、我们可以使用字典,通过比较每个车牌号所有时间,找到最大的那个时间值。

3、也可以使用SQL查询,查询每个车牌号最大时间的记录。

4、考虑一些特殊情况,

(1)有的车牌号为空的,这样的数据我们不提取,没有任何意义;

(2)有些车牌号对应的手机号是空的,如果所有时间对应的手机号都是空的,那无妨,我们得到一个手机号为空的记录,表明这个车牌号没有手机号;

(3)如果一个车牌号对应的手机号,有的是空的,有的不是空的,如果最大日期对应的手机号是空的,如果简单处理就会得到一个手机号为空的记录,我觉得如果有手机号,我们还是应该把它提取出来,那规则就是如果最大时间对应的手机号为空,则选择次大时间对应的手机号,依次下推。

5、呼应文章标题,我们采用三种方法来处理数据。

方法1:字典+SortedList,

1、字典用来存储车牌号对应的最大时间,用来定位符合条件的记录;

2、SortedList用来存储车牌号、手机号,并对车牌号进行排序;

3、这里SortedList也可以换成字典,这样一来,车牌号就没有顺序了,如果需要排序,也可以把字典的key存到数组中进行排序,然后再重新对应手机号;

4、如果用两个字典,并且需要对车牌号进行排序的话,也可以参考方法2,先对工作表进行排序。

方法2:工作表排序+字典,

1、把原始数据按照车牌号升序、时间降序排序,然后再装入数组arr进行处理;

2、这里也可以先把原始数据保存到一个数组arrOriginal,排序读取后,再把arrOriginal回写到工作表,恢复原状;

3、字典用来存储车牌号、手机号,由于数据已经排了排序,每个车牌号的第一条记录一般就是我们所要的数据(跳过空手机号);

4、在这个方法下,我们提取了每个车牌号对应的所有非空手机号,按时间由近到远排列。我觉得提取所有手机号,可能也有这样的需求吧。

方法3:ADO对象+SQL查询

1、设置数据库dbs为当前工作簿完整路径,设置数据表tbl为"[Sheet1$A:D]" ;

dbs = ThisWorkbook.FullName  '//数据库tbl = "[Sheet1$A:D]"   '//数据表

2、创建    ADO连接:

Set cnn = CreateObject("ADODB.Connection")

3、设置数据库连接字符串:

cnnStr = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & dbs & ";Extended Properties=Excel 12.0;"

4、编写SQL查询语句(详见代码文章)。

5、执行查询,把数据写入工作表。

示例代码详见当天其他推文,代码中有详细注释。

后记

1、数据的“顺序”很重要,特别是记录比较多的情况,除非特别要求,我们在呈现结果的时候,都应该按照一定的规则排序,这样肉眼查找起来比较方便。

2、所有手机号、车牌号都进行了替换,我发现我这个小过程还是挺方便的,在一张工作表“dataLaundry”中,A列放原始数据,B列放模拟数据,运行下以过程就可以把所有工作表中的数据都替换掉,包括这张“dataLaundry”表中的,也可以不替换这张表,只要把注释掉的if语句恢复

Sub replaceData()    Dim dic As Object, ws As Worksheet, wsDataLaundry As Worksheet    Dim arr()    Set dic = CreateObject("Scripting.dictionary")    Set wsDataLaundry = ThisWorkbook.Sheets("dataLaundry")    arr = wsDataLaundry.UsedRange.Value    For i = 1 To UBound(arr)        If arr(i, 1) <> "" Then            dic(arr(i, 1)) = arr(i, 2)        End If    Next    For Each ws In ThisWorkbook.Sheets        'If ws.Name <> "dataLaundry" Then        For Each rng In ws.UsedRange.Cells            If dic.exists(rng.Value) Then                rng.Value = dic(rng.Value)            End If        Next        'End If    Next    MsgBox "替换成功!"End Sub

好,今天就到这里,我们下期再会!


~~~~~~End~~~~~~

安利小店
安利的牙膏非常不错,用了以后就不想再用其他的了;洗洁精洗衣液也是日常必备,用过都说好!

合谷医疗
合谷医疗专攻各种疑难杂症,尤其擅长抑郁症焦虑失眠儿童神经发育异常多动症自闭孤独症腰颈椎疾病治疗,可谓神乎其技!体验过的直呼早点来就好了

喜欢就点个、点在看留言评论、分享一下呗!感谢支持!

案例文件分享说明

  • 案例文件可免费分享,但需符合以下要求:

  • 关注点赞点在看点...留言,方便的话分享一下就完美啦!如果不便走上面的“流程”,请打赏,万分感谢!

  • 请添加上方我的合谷医疗企业微信,案例文件通过微信发送。如有定制需求,亦可通过微信联系。

  • Excel问题,请在文章下面留言讨论!或者加入我的付费交流群提问

VBA编程实战
Excel应用案例、Excel VBA、公式函数使用技巧分享,思路解读...... 这里有鲜活案例、实用的技巧......
 最新文章