ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH云课堂-专业的职场技能充电站 Excel转在线管理系统,怎么做看这里 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 EH云课堂直播课程免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
查看: 380|回复: 11

[求助] 求助大神如何排序附件的数据

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-9-7 12:52 | 显示全部楼层 |阅读模式
大神:
        第一行是我希望的参数名排序,第二行是顺序打乱了的参数名,麻烦编个程序把第二行及以下的数据对应到第一行相应参数名下面,谢谢!
       第二行的参数名个数可能比第一行多,多出来的列就放数据的最后面。

Template1_2.zip

94.59 KB, 下载次数: 26

TA的精华主题

TA的得分主题

发表于 2019-9-7 16:10 | 显示全部楼层
  1. Sub 排列()
  2. Dim arr, brr

  3. arr = Range("a2", Cells([a2].End(xlDown).Row, [a2].EntireRow.Columns.Count).End(xlToLeft))

  4. 'Range("a2", [a2].End(xlDown)).EntireRow.ClearContents '需要删除源数据,解除注释

  5. ReDim brr(1 To UBound(arr, 1), 1 To UBound(arr, 2))
  6. a = 1
  7. For Each Rng In Range("a1", [a1].End(xlToRight))
  8.     For i = 1 To UBound(arr, 2) '循环比较数组首行与目标序列
  9.         If arr(1, i) = Rng Then
  10.         
  11.         For j = 1 To UBound(arr, 1) '循环赋值
  12.             brr(j, a) = arr(j, i) 'arr赋值给brr
  13.         Next
  14.         a = a + 1 'brr 列往后推移
  15.         End If
  16.     Next
  17. Next
  18. Range("a40").Resize(UBound(brr, 1), UBound(brr, 2)) = brr '输出位置
  19. End Sub
复制代码

试试看,是不是你要的

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-7 16:56 | 显示全部楼层
Jason_WangSS 发表于 2019-9-7 16:10
试试看,是不是你要的

运行宏后,除了里面第二行以下数据被清空,没有其他动作哦

TA的精华主题

TA的得分主题

发表于 2019-9-7 17:13 来自手机 | 显示全部楼层
zy89021098 发表于 2019-9-7 16:56
运行宏后,除了里面第二行以下数据被清空,没有其他动作哦


你仔细看一下,40行是不是有数据
还有,不要重复运行

TA的精华主题

TA的得分主题

发表于 2019-9-7 18:07 | 显示全部楼层
PQ参考解法
screenshot.PNG

Template.rar

209.67 KB, 下载次数: 2

TA的精华主题

TA的得分主题

发表于 2019-9-7 18:11 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-9 15:35 | 显示全部楼层
Jason_WangSS 发表于 2019-9-7 17:13
你仔细看一下,40行是不是有数据
还有,不要重复运行

谢谢大神,但有一个问题,看BB列,如果第一行有的参数第二行没有,就会出现错行,我希望是第一行有的参数第二行没有,那这列参数下面就空着,如果第二行有的参数第一行没有,那这个参数下的数据就放在全部数据的最后面,大神有没有好办法,跪拜!!!

TA的精华主题

TA的得分主题

发表于 2019-9-9 20:28 | 显示全部楼层
zy89021098 发表于 2019-9-9 15:35
谢谢大神,但有一个问题,看BB列,如果第一行有的参数第二行没有,就会出现错行,我希望是第一行有的参数 ...
  1. Sub 排序()
  2.     Dim arr, brr, crr, d As Object
  3.     Set d = CreateObject("scripting.dictionary")
  4.    
  5.     For Each Rng In Range("a1", Cells(2, Cells(1, Columns.Count).End(xlToLeft).Column))
  6.         d(Rng.Text) = d(Rng.Text)
  7.     Next
  8.     brr = Range("a2", Cells([a1].End(xlDown).Row, Cells(1, Columns.Count).End(xlToLeft).Column))
  9.    
  10.     ReDim arr(1 To UBound(brr, 1) + 1, 1 To d.Count)
  11.     crr = d.keys
  12.    
  13.     For i = 1 To d.Count
  14.         arr(1, i) = crr(i - 1)
  15.     Next
  16.    
  17.     For i = 1 To UBound(arr, 2)
  18.         For j = 1 To UBound(brr, 2)
  19.             If brr(1, j) = arr(1, i) Then
  20.                 For k = 1 To UBound(brr, 1) - 1
  21.                     arr(k + 1, i) = brr(k + 1, j)
  22.                 Next
  23.             End If
  24.         Next
  25.     Next
  26.     [a40].Resize(UBound(arr, 1), UBound(arr, 2)) = arr
  27. End Sub
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-9-15 12:41 | 显示全部楼层

大神,还是有错行,不知道什么原因,麻烦看看,见附件图片。

错行

错行

TA的精华主题

TA的得分主题

发表于 2019-9-15 13:21 | 显示全部楼层
Option Explicit

Sub test()
  Dim arr, brr, i, j, cnt, p, dic, t
  Set dic = CreateObject("scripting.dictionary")
  cnt = [a1].End(xlToRight).Column
  arr = [a1].CurrentRegion.Resize(, 2 * cnt)
  brr = arr
  For i = 1 To cnt
    dic(LCase(arr(1, i))) = i
  Next
  For j = 1 To cnt
    t = LCase(brr(2, j))
    If Len(t) Then
      If dic.exists(t) Then p = dic(t) Else cnt = cnt + 1: p = cnt
      For i = 2 To UBound(arr, 1)
        arr(i, p) = brr(i, j)
      Next
      If arr(1, j) <> arr(2, j) Then
        For i = 2 To UBound(arr, 1)
          arr(i, j) = vbNullString
        Next
      End If
    End If
  Next
  [a1].Resize(UBound(arr, 1), cnt) = arr
End Sub

评分

参与人数 1鲜花 +2 收起 理由
LSYYLW + 2 太强大了

查看全部评分

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

本版积分规则

关闭

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

关注官方微信,高效办公专列,每天发车

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

GMT+8, 2019-12-10 12:30 , Processed in 1.516325 second(s), 33 queries , Gzip On.

Powered by Discuz! X3.4

© 1999-2020 Wooffice Inc.

   

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

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

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