ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] (请教高手!)单元格内的多个用分号隔开的字符串用另一个表格对应的数值代替

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-7-14 16:31 | 显示全部楼层 |阅读模式
本帖最后由 长春鱼鱼 于 2015-7-16 16:51 编辑

有2个表格(如下,更多数据见附件):
表格1,A列单元格内,每个数值被分号;隔开。
1)如果数值带有#,则数值用#后面的字符替换(如193#Black 用 Black 替换);如果#后的英文字符有重复的,则在字符后面加上1、2、3..以示区别(见例子A6)。

2)如果数值没有#,只有数字,则数值用表2中数字对应的“属性值"替换。(如771 用 Beige 替换)

替换后的结果,放到B列,且每个数值用逗号隔开。

表1 :
Color  Name
替换后结果
193#Black;10#Burgundy;175#Green
Black,Burgundy,Green
173;175;10#Rhodo;366
Blue,Green,Rhodo,Yellow
771;173
Beige,Blue
771#beige;1052#pink
Beige,Pink
771#multicolor;173#multicolor;1254#multicolor
Multicolor1,Multicolor2,Multicolor3


表2:
属性组
属性
属性值
173
Blue
绿
175
Green
366
Yellow
米色
771
Beige
173
Blue
10Red


Sample 2.zip

10.6 KB, 下载次数: 20

Color Name Codes

TA的精华主题

TA的得分主题

发表于 2015-7-14 18:14 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请测试。

长春鱼鱼_单元格内的多个用分号隔开的字符串用另一个表格对应的数值代替.rar

23.87 KB, 下载次数: 159

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-14 18:24 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

是不是传错附件了阿,大哥?附件中代码或公式都没有啊?

TA的精华主题

TA的得分主题

发表于 2015-7-14 18:27 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2015-7-14 18:45 | 显示全部楼层
本帖最后由 doitbest 于 2015-7-14 19:14 编辑

Public Sub abc()
Dim ar, rep, i, ii, str, tmp, d
Set d = CreateObject("Scripting.Dictionary")
ar = Range([a2], [a65536].End(3))
Set rep = CreateObject("vbscript.regexp")
rep.Global = True
For i = 1 To UBound(ar)
    rep.Pattern = "\d+#"
    If ar(i, 1) <> "" Then
      ar(i, 1) = rep.Replace(ar(i, 1), "")
      ar(i, 1) = Replace(ar(i, 1), " ", ";")
      str = Split(ar(i, 1), ";")
      For ii = 0 To UBound(str)
        str(ii) = StrConv(str(ii), 3)
        If IsNumeric(str(ii)) And Not Sheet2.[b:b].Find(str(ii), , , 1) Is Nothing Then
            str(ii) = Sheet2.[b:b].Find(str(ii), , , 1).Offset(, 1)
        End If
        d(str(ii)) = d(str(ii)) + 1
      Next
      For ii = 0 To UBound(str)
          If d(str(ii)) > 1 Then
             d(str(ii) & "@") = d(str(ii) & "@") + 1
              tmp = tmp & " " & str(ii) & d(str(ii) & "@")
          Else
              tmp = tmp & " " & str(ii)
          End If
      Next
      ar(i, 1) = Replace(Trim(tmp), " ", ",")
      tmp = ""
      d.RemoveAll
    End If
Next
[b2].Resize(UBound(ar)) = ar
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-14 19:01 | 显示全部楼层

真是太太太........强大呢!!测试后,100%解决问题。

能否帮忙看另一个帖子。它跟这个帖子问题90%类似,可能要在这个函数基础上修改下就好。我目前功底完全不行阿。多谢!
http://club.excelhome.net/thread-1217256-1-1.html

TA的精华主题

TA的得分主题

发表于 2015-7-14 19:18 | 显示全部楼层
请参考附件

SampleVBA2.rar

14.32 KB, 下载次数: 18

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-14 19:19 | 显示全部楼层
doitbest 发表于 2015-7-14 18:45
Public Sub abc()
Dim ar, rep, i, ii, str, tmp, d
Set d = CreateObject("Scripting.Dictionary")

代码有些错误,见附件测试结果。红色,就是代码返回的错误的值,左侧是正确的。

有些颜色名由2个单词构成,比如Light Blue。你的代码 Light Blue 分开了。

color error codes

color error codes

TA的精华主题

TA的得分主题

发表于 2015-7-14 19:24 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
长春鱼鱼 发表于 2015-7-14 19:19
代码有些错误,见附件测试结果。红色,就是代码返回的错误的值,左侧是正确的。

有些颜色名由2个单词 ...

略加修改即可
Public Sub abc()
Dim ar, rep, i, ii, str, tmp, d
Set d = CreateObject("Scripting.Dictionary")
ar = Range([a2], [a65536].End(3))
Set rep = CreateObject("vbscript.regexp")
rep.Global = True
For i = 1 To UBound(ar)
    rep.Pattern = "\d+#"
    If ar(i, 1) <> "" Then
      ar(i, 1) = rep.Replace(ar(i, 1), "")
      str = Split(ar(i, 1), ";")
      For ii = 0 To UBound(str)
        str(ii) = StrConv(str(ii), 3)
        If IsNumeric(str(ii)) And Not Sheet2.[b:b].Find(str(ii), , , 1) Is Nothing Then
            str(ii) = Sheet2.[b:b].Find(str(ii), , , 1).Offset(, 1)
        End If
        d(str(ii)) = d(str(ii)) + 1
      Next
      For ii = 0 To UBound(str)
          If d(str(ii)) > 1 Then
             d(str(ii) & "@") = d(str(ii) & "@") + 1
              tmp = tmp & "," & str(ii) & d(str(ii) & "@")
          Else
              tmp = tmp & "," & str(ii)
          End If
      Next
      ar(i, 1) = Right(tmp, Len(tmp) - 1)
      tmp = ""
      d.RemoveAll
    End If
Next
[b2].Resize(UBound(ar)) = ar
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-7-14 19:38 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
doitbest 发表于 2015-7-14 19:24
略加修改即可
Public Sub abc()
Dim ar, rep, i, ii, str, tmp, d

还是有个小小问题。部分数值,没有按照首字母A-Z排列阿?

见附件,红色为返回的错误的值。
另外,能不能帮忙解答下下面这个新帖子阿。它的问题同当前帖子90%类似。万分感谢!
http://club.excelhome.net/thread-1217256-1-1.html

code error2

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

本版积分规则

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

GMT+8, 2024-11-17 09:56 , Processed in 0.045211 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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