ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 优化代码

[复制链接]

TA的精华主题

TA的得分主题

发表于 2023-5-4 14:58 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这是我网上凑出来的代码,代码的目的是,发现选区内的字母,大写字母或者小写字母,仅把字母标记为红色,其他的不标记。


代码可运行在数据区域小的地方,我正常需要的数据区域差不多是100列*10000行上下,这个代码就会让excel死机,求教该如何优化。
运行出来的效果如下,麻烦看下该如何优化,能让代码在大的数据区域下跑起来,感谢。

image.png

代码:

Sub 修改单元格内字母颜色()
Dim i As Integer
Dim MyKeys
'建立要设置颜色的文本数组
MyKeys = Array("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", "v", "w", "x", "y", "z", "A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z")

Dim TotalRange As Range
Dim ThisRange As Range
'指定要设置的单元格区域
Set TotalRange = Application.InputBox("选择具体区域,不要选择整行整列:", , , , , , , 8)
'用循环开始设置
For Each ThisRange In TotalRange
   For i = 0 To UBound(MyKeys)
      '调用自定义过程
      Call MyReplace(ThisRange, MyKeys(i))
   Next i
Next

End Sub

'自定义过程,对单元格里的指定文字设置为红色
Sub MyReplace(ByVal MyRange As Range, ByVal MyKey As String)
Dim LinStr As String
Dim L As Integer
Dim i As Integer

L = Len(MyKey)

LinStr = MyRange.Text
i = InStr(1, LinStr, MyKey)
Do While i <> 0
   MyRange.Characters(Start:=i, Length:=L).Font.Color = RGB(255, 0, 0)
   i = InStr(i + L, LinStr, MyKey)
Loop

End Sub



TA的精华主题

TA的得分主题

发表于 2023-5-4 16:21 | 显示全部楼层
要遍历每个单元格,再遍历每个字符,速度快不了

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-4 16:26 | 显示全部楼层
我能说这个比较无解吗?
因为运行机制的方式固定了,excel如果要修改单元格内部分字体的颜色,只能一个一个单元格操作,没法批量操作。
你这里仅仅能做的优化就是把刷新关闭。
Application.ScreenUpdating = False
运行完代码后再打开
Application.ScreenUpdating = True

TA的精华主题

TA的得分主题

发表于 2023-5-4 17:16 | 显示全部楼层
1、看贴图是对%后面的字符设为红色,那就简单了
2、就算不是上面1的规律,也应该是遍历单元格中文本的每个字符,去判断每个字符是否为字母再设置颜色,而不是拿52个字母去单元格的文本里找有没有这个字母

TA的精华主题

TA的得分主题

发表于 2023-5-4 17:26 | 显示全部楼层
可以用字典与数组,但同样要为众多单元格对象标色,速度肯定快不了,搞不好电脑死机是常有的.

评分

1

查看全部评分

TA的精华主题

TA的得分主题

发表于 2023-5-4 17:31 | 显示全部楼层
如果你数据确实都是abc,ABC这些需要判定,直接用if XXX like "[A-Za-z]" then 来判断看比数组是否快点。另外指定代码的时候screenupdating关了会不会好点。

TA的精华主题

TA的得分主题

发表于 2023-5-4 17:39 | 显示全部楼层
本帖最后由 tanglf188 于 2023-5-4 17:41 编辑

加个判断
If Right(ThisRange.Value,1)<> "%" And Len(ThisRange.Value)>1 Then Call MyReplace(ThisRange, MyKeys(i))

TA的精华主题

TA的得分主题

发表于 2023-5-4 17:58 | 显示全部楼层
直接对单元格操作估计快不了,需要从其他地方想办法了。。。
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-17 05:43 , Processed in 0.032758 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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