Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2458|回复: 12

[已解决]VBA:搜寻一列数据中的特定值,取另一列的同行数值

[复制链接]
发表于 2021-11-3 17:00 | 显示全部楼层 |阅读模式
本帖最后由 lijian8003 于 2021-11-3 17:27 编辑

Sheet2
BA列        BB列
...        ...
张三        5
...        ...
李四        4
王五        7
...        ...
赵六        7
王五        7
...        ...
王五        7

Sheet1
AF2=4,AF3=1,AF4=2

1、现欲搜寻Sheet2 BB列中有哪些单元格,与Sheet1 AF2+AF3+AF4=7相同,并提取Sheet2 BA列同行对应单元格数值,依次写入Sheet1 BA1 BA2 BA3...(上例提取:王五 赵六 王五 王五)。

2、上例提取的 王五 赵六 王五 王五,欲去掉重复值,只保留王五 赵六。

两个宏代码恳请都贴出,以利于揣摩比较学习。


最佳答案
2021-11-3 17:59
  1. Option Explicit

  2. Sub 搜寻()
  3. Dim x, i, k As Long
  4. Dim arr, arr2(1 To 100000, 1 To 1)
  5. x = Application.WorksheetFunction.Sum(Sheet1.Range("AF2:AF4"))
  6. arr = Sheet2.Range("ba1:bb" & Sheet2.[Bb100000].End(xlUp).Row)
  7. For i = 1 To UBound(arr)
  8.     If arr(i, 2) = x Then
  9.         k = k + 1
  10.         arr2(k, 1) = arr(i, 1)
  11.     End If
  12. Next
  13. Sheet1.[ba1].Resize(k, 1) = arr2
  14. End Sub

  15. Sub 去重()
  16. Dim dicc, arr, arr1, i%
  17. Set dicc = CreateObject("scripting.dictionary")
  18. arr = Sheet1.Range("ba1:ba" & Sheet1.[Ba100000].End(xlUp).Row)
  19. Sheet1.Range("ba1:ba100000").ClearContents
  20. For i = 1 To UBound(arr)
  21.     dicc(arr(i, 1)) = ""
  22. Next
  23. Sheet1.[ba1].Resize(UBound(dicc.keys) + 1) = Application.Transpose(dicc.keys)
  24. End Sub
复制代码

VBA:搜寻一列数据中的特定值,取另一列的同行数值.zip

7.53 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2021-11-3 17:59 | 显示全部楼层    本楼为最佳答案   
  1. Option Explicit

  2. Sub 搜寻()
  3. Dim x, i, k As Long
  4. Dim arr, arr2(1 To 100000, 1 To 1)
  5. x = Application.WorksheetFunction.Sum(Sheet1.Range("AF2:AF4"))
  6. arr = Sheet2.Range("ba1:bb" & Sheet2.[Bb100000].End(xlUp).Row)
  7. For i = 1 To UBound(arr)
  8.     If arr(i, 2) = x Then
  9.         k = k + 1
  10.         arr2(k, 1) = arr(i, 1)
  11.     End If
  12. Next
  13. Sheet1.[ba1].Resize(k, 1) = arr2
  14. End Sub

  15. Sub 去重()
  16. Dim dicc, arr, arr1, i%
  17. Set dicc = CreateObject("scripting.dictionary")
  18. arr = Sheet1.Range("ba1:ba" & Sheet1.[Ba100000].End(xlUp).Row)
  19. Sheet1.Range("ba1:ba100000").ClearContents
  20. For i = 1 To UBound(arr)
  21.     dicc(arr(i, 1)) = ""
  22. Next
  23. Sheet1.[ba1].Resize(UBound(dicc.keys) + 1) = Application.Transpose(dicc.keys)
  24. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2021-11-3 18:04 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2021-11-3 18:19 | 显示全部楼层

感谢帮助!去重的结果,在搜寻后直接写入Sheet1 BA列,代码如何修改?(非先搜寻到全部有重复的数值并写入Sheet1 BA列后,再对Sheet1 BA列去重。)
回复

使用道具 举报

发表于 2021-11-3 18:33 | 显示全部楼层
本帖最后由 lisongmei 于 2021-11-3 18:36 编辑
lijian8003 发表于 2021-11-3 18:19
感谢帮助!去重的结果,在搜寻后直接写入Sheet1 BA列,代码如何修改?(非先搜寻到全部有重复的数值并写 ...

那就直接用一个字典就搞定了。改就是重写。。。。
  1. Sub test()
  2. Dim x, i, k As Long, dicc
  3. Dim arr, arr2(1 To 100000, 1 To 1)
  4. Set dicc = CreateObject("scripting.dictionary")
  5. Sheet1.Range("ba1:ba100000").ClearContents
  6. x = Application.WorksheetFunction.Sum(Sheet1.Range("AF2:AF4"))
  7. arr = Sheet2.Range("ba1:bb" & Sheet2.[Bb100000].End(xlUp).Row)
  8. For i = 1 To UBound(arr)
  9.     If arr(i, 2) = x Then
  10.         dicc(arr(i, 1)) = ""
  11.     End If
  12. Next
  13. Sheet1.[ba1].Resize(UBound(dicc.keys) + 1) = Application.Transpose(dicc.keys)
  14. End Sub
复制代码


回复

使用道具 举报

 楼主| 发表于 2021-11-3 18:43 | 显示全部楼层
lisongmei 发表于 2021-11-3 18:33
那就直接用一个字典就搞定了。改就是重写。。。。

学习了。愿您工作生活蒸蒸日上!
回复

使用道具 举报

 楼主| 发表于 2021-11-3 23:19 | 显示全部楼层
本帖最后由 lijian8003 于 2021-11-3 23:46 编辑
lisongmei 发表于 2021-11-3 18:33
那就直接用一个字典就搞定了。改就是重写。。。。

老师您好!如果没有搜索到数值,则代码运行出错。实际运用时,Sheet2 BB列中常常会没有特定搜索的数值,此时Sheet1 BA列则输出为空。如何加个判断,烦请老师不吝指教。
回复

使用道具 举报

发表于 2021-11-3 23:50 | 显示全部楼层
lijian8003 发表于 2021-11-3 23:19
老师您好!如果没有搜索到数值,则代码运行出错。实际运用时,Sheet2 BB列中常常会没有特定搜索的数值, ...

一般在代码刚开始加句:
On Error Resume Next

回复

使用道具 举报

 楼主| 发表于 2021-11-4 00:06 | 显示全部楼层
lisongmei 发表于 2021-11-3 23:50
一般在代码刚开始加句:
On Error Resume Next

OK  问题解决了。谢谢您!

回复

使用道具 举报

 楼主| 发表于 2021-11-4 19:22 | 显示全部楼层
本帖最后由 lijian8003 于 2021-11-4 19:56 编辑
lisongmei 发表于 2021-11-3 18:33
那就直接用一个字典就搞定了。改就是重写。。。。

老师,您好!有问题询问:
x = Application.WorksheetFunction.Sum(Sheet1.Range("AF2:AF4"))
如果取值范围是 Sum(Range("AF2:AF4"))- n 与 Sum(Range("AF2:AF4") )之间,n 是 1 2 3 4 ...(例如:Sum(Range("AF2:AF4"))=10,n=3,取值范围是 7-10)
宏代码该如何表达?
回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-4-26 16:57 , Processed in 0.386290 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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