ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: cnko

[已解决] 求教怎样将不同列中不同行的单元格内容相同的整理到同一列中去!

[复制链接]

TA的精华主题

TA的得分主题

发表于 2012-7-23 19:36 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
cnko 发表于 2012-7-23 16:09
我刚用一个16列42行的数据样本测试了一下,遇到问题了,最后就乱了,并没有得到这样的效果

因为EE中不像excel有单元格的区别,所以,在排序时需要把长度超过1的内容替换为长度为1的特殊符号,这样才能保证复制回来的列号是正确的……

这个宏只是无聊的产物,之前不能用时因为宏里面输入的特殊符号太少了,不够用……现在多加了点,如果还有问题就忘了它吧,速度又慢,准确率又低=。=

px.rar

1.27 KB, 下载次数: 55

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2012-7-23 19:47 | 显示全部楼层
hbpaopao 发表于 2012-7-23 19:36
因为EE中不像excel有单元格的区别,所以,在排序时需要把长度超过1的内容替换为长度为1的特殊符号,这样才 ...

哈哈,原来是这样,还是谢谢你啊!方法很独特,原来EE也有这样强大的功能,我用了这么久这个软件,到今天才知道呢!

TA的精华主题

TA的得分主题

发表于 2012-7-24 10:07 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
小花鹿 发表于 2012-7-23 02:23
凑个热闹:
Sub test()
Dim ar, br(), i&, j&, d

我喜欢4楼yangyangzhifeng的字典用法: 把行信息直接存入items

字典运行结束后,取出items中信息,用split方法拆分,然后填入结果数组。

具体代码写法略有不同。(我的代码稍微简洁一些)
  1. Sub kagawa()
  2.     Set d = CreateObject("Scripting.Dictionary") '定义字典d
  3.     arr = [a1].CurrentRegion
  4.     arr = Sheets(1).[a1].CurrentRegion '获取原始数据存入数组arr,范围可以自己修改

  5.     For i = 2 To UBound(arr)
  6.         For j = 2 To UBound(arr, 2)
  7.             If arr(i, j) <> "" Then d(arr(i, j)) = d(arr(i, j)) & " " & i
  8.             '按行开始逐列遍历原始数据,如果不是空格就把行信息存入item,以空格区分
  9.         Next
  10.     Next
  11.    
  12.     p = d.keys '取出字典keys的数组结果
  13.     q = d.items '取出字典items的数组结果
  14.     ReDim brr(1 To UBound(arr), d.Count) '定义结果数组brr
  15.     For i = 0 To d.Count - 1 '遍历每个字典key
  16.         s = Split(q(i)) '拆分item得到对应的行信息
  17.         For j = 1 To UBound(s) '遍历所有对应信息(注意从1开始,因为0是空白)
  18.             brr(s(j), i) = p(i) '直接把对应key存入结果数组中相应行
  19.         Next
  20.     Next
  21.    
  22.     [s1].Resize(UBound(arr), d.Count) = brr '输出结果到同一工作表
  23.     Sheets(2).[a1].Resize(UBound(arr), d.Count) = brr '或输出结果到工作表2
  24. End Sub
复制代码
建议小花鹿仔细看一看,研究一下代码写法的细节问题,对今后的代码编写,会有参考的。


呵呵。

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-24 10:43 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2012-7-24 14:56 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
小花鹿 发表于 2012-7-23 02:23
凑个热闹:
Sub test()
Dim ar, br(), i&, j&, d

代码还可以这样改,一次循环就解决了。
  1. Sub kagawa()
  2.     Set d = CreateObject("Scripting.Dictionary") '定义字典d
  3.    
  4.     arr = Sheets(1).[a1].CurrentRegion '获取原始数据存入数组arr,范围可以自己修改
  5.    
  6.    ReDim brr(1 To UBound(arr), 1 To UBound(arr, 2)) '定义结果数组brr,和原始数据范围一样大。
  7.     For i = 2 To UBound(arr)
  8.         For j = 2 To UBound(arr, 2) '按行开始逐列遍历原始数据
  9.             If arr(i, j) <> "" Then '如果不为空
  10.                 t = d(arr(i, j)) '检查字典对应项目值(即结果数组brr中列位置序号)
  11.                 If t = "" Then k = k + 1: d(arr(i, j)) = k: t = k
  12.                  '如果字典中无此项目,则总序号+1,把该元素加入字典,然后列位置赋值
  13.                 brr(i, t) = arr(i, j) '把原始数据写入结果数组中新的对应列位置。
  14.             End If
  15.      Next
  16.     Next
  17.    
  18.     [h1].Resize(UBound(arr), d.Count) = brr '输出结果到同一工作表
  19.    Sheets(2).[a1].Resize(UBound(arr), d.Count) = brr '或者输出结果到工作表2
  20. End Sub
复制代码
小花鹿看一下这个代码算法怎么样? 更高效、更快捷。


TA的精华主题

TA的得分主题

发表于 2012-7-24 15:25 | 显示全部楼层
香川群子 发表于 2012-7-24 10:07
我喜欢4楼yangyangzhifeng的字典用法: 把行信息直接存入items

字典运行结束后,取出items中信息,用s ...

记住每个人在哪一行里有,将行号保存起来,以后在同一列的相应行里写入名字.................................
这种思路不知道有什么特别的优点?

TA的精华主题

TA的得分主题

发表于 2012-7-24 16:05 | 显示全部楼层
香川群子 发表于 2012-7-24 14:56
代码还可以这样改,一次循环就解决了。小花鹿看一下这个代码算法怎么样? 更高效、更快捷。

如果按这个思路的话,中间列号判断有点复杂了,直接这样不就行了吗?
Sub test()
Dim ar, br(), i&, j&, k&, d
Set d = CreateObject("scripting.dictionary")
ar = [b2].CurrentRegion
ReDim br(1 To UBound(ar), UBound(ar, 2))
For i = 3 To UBound(ar)
    For j = 2 To UBound(ar, 2)
        If ar(i, j) <> "" Then
            If d.exists(ar(i, j)) = 0 Then
                d(ar(i, j)) = d.Count
            End If
            br(i - 2, d(ar(i, j))) = ar(i, j)
        End If
    Next j
Next i
[j4].Resize(i - 3, d.Count) = br
End Sub

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2012-7-25 13:36 | 显示全部楼层
小花鹿 发表于 2012-7-24 16:05
如果按这个思路的话,中间列号判断有点复杂了,直接这样不就行了吗?
Sub test()
Dim ar, br(), i&, j& ...

【中间列号判断有点复杂了,直接这样不就行了吗?】

从代码结果来看,你这样改当然可以。


问题是,算法就不同了。这个你能自己想明白么?


…………
而我的算法,代码看上去虽然似乎比你改写的要繁琐一点,
但是,如果数据量很大、比如2万行,几千个不同姓名(字典对象)的话,

显然我的算法在速度和内存上都有很大优势。


…………
因此,我的代码的优点,你还要好好研究。

(好的算法,不是为了让别人看得舒服,而是要让机器/电脑高效地运作。)


当然,一般情况下,好的代码算法,往往从结构上看也应该是最简单的……
但是,不能说代码结构越简单,则效率越高 → 这个是不同的含义。








TA的精华主题

TA的得分主题

发表于 2013-1-1 06:49 | 显示全部楼层
好难学呀,难道都这么困难吗

TA的精华主题

TA的得分主题

发表于 2018-3-10 17:07 | 显示全部楼层
将不同列中不同行的单元格内容相同的整理到同一列中去
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 20:42 , Processed in 0.040777 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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