ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 怎样用宏替换指定的字符为相应的文本

[复制链接]

TA的精华主题

TA的得分主题

发表于 2019-6-5 21:00 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
在图1 中的c1:d10的区域中,给每个教室安排了老师监考,语文,数学,英语,物理,生物,地理这6个科目。其中“语数英物生地”这6个科目分别用了ab cdef这6个英语字母来代表。详细的对应关系见这两列I2:h7,如图2, 最后要求把这6个字母还原成汉字。效果达到第3张图中的示范效果,请注意英语字母ABCdef是动态的。它们之间的对应关系不一定一直是按“语数英物生地””来对应的哦,所以在使用宏公司的时候,字母a的取值只能用单元格i2的取值。这个值不一定是语文哈。是动态的,

1

1

2

2
3.png

宏替换指定字符.rar

6.81 KB, 下载次数: 30

TA的精华主题

TA的得分主题

发表于 2019-6-5 21:19 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-6-5 22:00 | 显示全部楼层
  1. Sub macro()
  2.     Dim arr, brr, i%, j%, m%, n%, str$, str1$
  3.     Set d = CreateObject("scripting.dictionary")
  4.     arr = [h2:i7]
  5.     brr = [c2:d10]
  6.     For i = 1 To UBound(arr)
  7.         d(arr(i, 1)) = arr(i, 2)
  8.     Next i
  9.     For m = 1 To UBound(brr)
  10.         For n = 1 To UBound(brr, 2)
  11.             brr(m, n) = Replace(brr(m, n), "(", "(")
  12.             str = Split(brr(m, n), "(")(1)
  13.             L = Len(str) - 1
  14.             ReDim crr(1 To L)
  15.             For j = 1 To L
  16.                 crr(j) = d(Mid(str, j, 1))
  17.             Next j
  18.             str1 = Join(crr, ",")
  19.             brr(m, n) = Split(brr(m, n), "(")(0) & "(" & str1 & ")"
  20.         Next n
  21.     Next m
  22.     [k2:l10] = brr
  23.     Set d = Nothing
  24. End Sub
复制代码

TA的精华主题

TA的得分主题

发表于 2019-6-5 22:03 | 显示全部楼层
附件供参考:

宏替换指定字符.rar

14.76 KB, 下载次数: 32

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2019-6-6 14:29 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Public dic

  2. Sub pey_testb()
  3. Dim brr, k2
  4. k2 = [h1].End(4).Row - 1
  5. brr = [h2].Resize(k2, 2)

  6. Set dic = CreateObject("scripting.dictionary")
  7. For i = 1 To k2
  8.    dic(brr(i, 1)) = brr(i, 2)
  9. Next

  10. ''''''''''''''''''''''''''''
  11. k0 = [c1].End(4).Row - 1
  12. arr = [c2].Resize(k0, 2)

  13. With CreateObject("VBScript.RegExp")
  14.   .Global = True
  15.   .IgnoreCase = False
  16.   .Pattern = "([a-f]*)"
  17.   
  18.   For i = 1 To k0
  19.   For j = 1 To 2
  20.      txt = arr(i, j)
  21.      arr(i, j) = Evaluate("=""" & .Replace(txt, """&qukh(" & """$1""" & ")&""") & """")
  22.   Next
  23.   Next
  24. End With

  25. Cells(2, 11).Resize(k0, 2) = arr
  26. End Sub

  27. Function qukh(a) 'a-b规则,可以自由定制
  28. b = dic(Mid(a, 1, 1))
  29. For i = 2 To Len(a)
  30.     b = b & "、" & dic(Mid(a, i, 1))
  31. Next

  32. qukh = b
  33. End Function
复制代码


TA的精华主题

TA的得分主题

发表于 2019-6-6 15:05 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
'有大写左括号,,,

Option Explicit

Sub test()
  Dim arr, i, j, brr
  arr = [c1].CurrentRegion: brr = [h2:i7]
  For i = 2 To UBound(arr, 1)
    For j = 1 To UBound(brr, 1)
      arr(i, 1) = Replace(arr(i, 1), brr(j, 1), "、" & brr(j, 2))
      arr(i, 2) = Replace(arr(i, 2), brr(j, 1), "、" & brr(j, 2))
    Next
    arr(i, 1) = Replace(arr(i, 1), "(、", "(")
    arr(i, 2) = Replace(arr(i, 2), "(、", "(")
  Next
  [k1].Resize(UBound(arr, 1), 2) = arr
End Sub

评分

2

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-6 20:06 | 显示全部楼层

非常感谢,几位的答案你的最简洁,改编也很容易,但是发现个你给的代码的中的新问题,就是你的代码运行时必须要求c2:d10的单元格原数据都不能为空,如果其中有一个空格,运行时就出现下标越界的情况,比如下图4最后两格我把它调整为空单元格后,我在指定的区域c2:10内一运行就出错,请问有办法避免吗?谢谢
4.png

宏替换指定字符2.zip

6.85 KB, 下载次数: 4

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-6 20:08 | 显示全部楼层
iris_2356 发表于 2019-6-5 21:19
直接Ctrl H 替换就行了吧

要替换很多次,依次输入查询a ,b ,c d,e,f,然后依次输入语文数学英语物理,生物,地理等,且以后可能还有不同的学科,用公式我相信会批量解决,而且可以有扩展性

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-6 21:21 | 显示全部楼层
一把小刀闯天下 发表于 2019-6-6 15:05
'有大写左括号,,,

Option Explicit

仔细对比了,发现你的代码很简单,而且上边一位给的代码在运行时碰到单元格为空就出错,你的代码就能兼容这种,但是我在改编时有个新问题,就是如果原始数据从c列扩展到了e列,(即增加了1列,)此时我改编代码后,第一排的数据始终还是字母ab等等,没法转换为相应的字符,请你帮我看下,我的代码改编后是Sub test()
  Dim arr, i, j, brr
  arr = [c1].CurrentRegion: brr = [h2:i7]
  For i = 3 To UBound(arr, 1)
    For j = 1 To UBound(brr, 1)
      arr(i, 1) = Replace(arr(i, 1), brr(j, 1), "、" & brr(j, 2))
      arr(i, 2) = Replace(arr(i, 2), brr(j, 1), "、" & brr(j, 2))
      arr(i, 3) = Replace(arr(i, 3), brr(j, 1), "、" & brr(j, 2))
    Next
    arr(i, 1) = Replace(arr(i, 1), "(、", "(")
    arr(i, 2) = Replace(arr(i, 2), "(、", "(")
    arr(i, 3) = Replace(arr(i, 3), "(、", "(")
  Next
  [k1].Resize(UBound(arr, 1), 3) = arr
End Sub

错在哪里呢,附件见下图

TA的精华主题

TA的得分主题

 楼主| 发表于 2019-6-6 21:23 | 显示全部楼层
一把小刀闯天下 发表于 2019-6-6 15:05
'有大写左括号,,,

Option Explicit

如果增加一列,结果就出现第2行字母不能转换,其余行正常,如图6

增加1列

增加1列

图6错误结果

图6错误结果

宏替换指定字符3.zip

13.21 KB, 下载次数: 8

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

本版积分规则

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

GMT+8, 2024-6-3 09:04 , Processed in 0.046698 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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