ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] vba根据表1的列1数据顺序,对表二的数据排序

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-8-4 23:13 | 显示全部楼层 |阅读模式
用vlookup表1和表2没有匹配项,试了很多公式也解决不了,不太懂VBA,恳请大神帮忙。

表1

表1

变化

变化

根据表一排序.rar

6.76 KB, 下载次数: 16

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-4 23:14 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-5 00:07 | 显示全部楼层
在表1添加一个辅助列填入序号,用vlookup将对应的序号引用到表2,然后在表2对序号进行排序就好了呀

TA的精华主题

TA的得分主题

发表于 2019-8-5 08:56 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
根据表一排序.rar (17.08 KB, 下载次数: 17)
不知道你想在A列直接重排还是在右侧J列排,我就按得J列

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-5 09:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
Edugaoqi 发表于 2019-8-5 08:56
不知道你想在A列直接重排还是在右侧J列排,我就按得J列

你好,我是希望在表二的A直接重排的。
另外我想自己在表二增加列,可当我把代码里头的4改为5,增加新的代码时,却出现报错。能教教我怎么改动吗?

改动的

改动的

TA的精华主题

TA的得分主题

发表于 2019-8-5 10:05 | 显示全部楼层
fang159 发表于 2019-8-5 09:52
你好,我是希望在表二的A直接重排的。
另外我想自己在表二增加列,可当我把代码里头的4改为5,增加新的 ...

arr = .Range("A1:D" & .Range("A65536").End(xlUp).Row)
改成 arr = .Range("A1:E" & .Range("A65536").End(xlUp).Row)
不然没有数组的第五列(E列),就没法赋值

要在A列重排 你加一句  
.UsedRange.Clear
然后最下面两行代码的 J 改成A

TA的精华主题

TA的得分主题

发表于 2019-8-5 10:34 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-8-5 11:45 | 显示全部楼层
'数据量大考虑用字典,这里key数组非常小字典都可以不用

'如果无法找到匹配序列按原序排在最后

'另外你这示例结果为非稳定排序,,,

Option Explicit

Sub test()
  Dim arr, brr, i, j
  arr = Sheets("sheet2").[a1].CurrentRegion.Resize(, 5)
  brr = Sheets("sheet1").[a1].CurrentRegion.Resize(, 2)
  For i = 2 To UBound(brr, 1)
    brr(i, 2) = i
  Next
  For i = 2 To UBound(arr, 1)
    arr(i, 5) = UBound(brr, 1) + 1
    For j = 2 To UBound(brr, 1)
      If arr(i, 1) = brr(j, 1) Then arr(i, 5) = brr(j, 2): Exit For
    Next
  Next
  Call bsort(arr, 2, UBound(arr, 1), 1, UBound(arr, 2), 5)
  [j1].Resize(UBound(arr, 1), UBound(arr, 2) - 1) = arr
End Sub

Function bsort(arr, first, last, left, right, key)
  Dim i, j, k, t
  For i = first To last - 1
    For j = first To last + first - 1 - i
      If arr(j, key) > arr(j + 1, key) Then
        For k = left To right
          t = arr(j, k): arr(j, k) = arr(j + 1, k): arr(j + 1, k) = t
        Next
      End If
    Next
  Next
End Function

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-8-5 12:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
二维数组多key稳定排序可以用香川老师的代码了,非常快,而且适应于大量数据。这种简单的实例用不牛刀。

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-8-5 20:13 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

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

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

GMT+8, 2024-4-25 09:35 , Processed in 0.038693 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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