ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

小白,交作业了…

[复制链接]

TA的精华主题

TA的得分主题

发表于 2024-1-16 20:53 来自手机 | 显示全部楼层 |阅读模式
本帖最后由 周某人就是我 于 2024-1-17 12:24 编辑

Sub Action()
Dim reg As Object
Dim mat As Object
Dim arr, arr1, arr2
Dim i%, n%, j%
Set reg = Create Object("vbscript.regexp")
arr = Range("A3:I252").Value2
arr1 = Array("A", "B", "C", "D", "E", "F")
arr2 = Array("字符1", "字符2", "字符3", "字符4", "字符5", "字符6")
Application.ScreenUpdating = False
i = 1
Do While arr(i, 6)) <> ""
Select Case arr(i, 6)
Case Is > 2
arr(i, 7) = "文本1"
Case Is > 0
arr(i, 7) = "文本2"
End Select
If InStr(8, arr(i + 1, 4), "C", 0) > 0 Then
Select Case arr(i + 1, 7)
Case Is = "文本3", "文本4"
arr(i + 1, 9) = "文本5"
End Select
ElseIf InStr(8, arr(i + 1, 4), "D", 0) > 0 Then
Select Case arr(i + 1, 7)
Case Is = "文本3", "文本4"
arr(i + 1, 9) = "文本6"
End Select
End If
If InStr(14, arr(i + 2, 4), "-1", 0) > 0 Then
If Len(arr(i + 3, 4)) < 14 Then
Select Case Len(arr(i + 4, 4))
Case Is > 14
arr(i + 3, 4) = Replace(arr(i + 2, 4), "-1", "-2")
Case Is < 14
arr(i + 3, 4) = Replace(arr(i + 2, 4), "-1", "-2")
arr(i + 4, 4) = Replace(arr(i + 2, 4), "-1", "-3")
End Select
End If
ElseIf InStr(14, arr(i + 2, 4), "-2", 0) > 0 Then
Select Case Len(arr(i + 3, 4))
Case Is < 14
arr(i + 3, 4) = Replace(arr(i + 2, 4), "-2", "-3")
End Select
ElseIf InStr(14, arr(i + 2, 4), "-3", 0) > 0 Then
If Len(arr(i + 3, 4)) < 14 Then
Select Case Len(arr(i + 4, 4))
Case Is > 14
arr(i + 3, 4) = Replace(arr(i + 2, 4), "-3", "-2")
Case Is < 14
arr(i + 3, 4) = Replace(arr(i + 2, 4), "-3", "-2")
arr(i + 4, 4) = Replace(arr(i + 2, 4), "-3", "-1")
End Select
End If
End If
If InStr(14, arr(i + 3, 4), "-1", 0) > 0 And Len(arr(i + 4, 4)) < 14 Then
arr(i + 4, 4) = Replace(arr(i + 3, 4), "-1", "-2")
ElseIf InStr(14, arr(i + 3, 4), "-2", 0) > 0 And Len(arr(i + 4, 4)) < 14 Then
arr(i + 4, 4) = Replace(arr(i + 3, 4), "-2", "-3")
ElseIf InStr(14, arr(i + 3, 4), "-3", 0) > 0 And Len(arr(i + 4, 4)) < 14 Then
arr(i + 4, 4) = Replace(arr(i + 3, 4), "-3", "-2")
End If
i = i + 5
Loop

For i = 1 to UBound(arr)
If arr(i, 6) = "" Then Exit For
arr(i, 1) = Date
If arr(i, 7) = "" Then
arr(i, 7) = "文本7"
End If
With reg
.Global =True
.Pattern ="\*\d{1,2}"
Set mat = .Execute(arr(i, 9))
If mat.Count > 0 Then
For n = 0 To mat.Count - 1
arr(i, 9) = .Replace(arr(i, 9), mat(n) & "MM")
Next
End If
For j = 0 to UBound(arr1)
.Pattern =arr1(j)
If .test(arr(i, 9)) Then
arr(i, 9) = .Replace(arr(i, 9), arr2(j))
End If
Next
End With
Next
Set reg = Nothing
Set mat = Nothing
Application.ScreenUpdating = True
Range("A3:I252").Value2 = arr
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-16 21:07 来自手机 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
老师们,看看有什么不足之处可以优化的。
另外请教:
1,Application.ScreenUpdating = False和Application.ScreenUpdating = True分别放在什么位置最好。
2,数组元素多次出现,是否有必要设个变量替代,如 t = arr(i + 2, 4)
3,对于常规数据,正则匹配替换和Instr函数配合Replace函数哪个更高效

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-16 21:15 来自手机 | 显示全部楼层
有两处手误:
Setreg应为Set reg
Range(A3:I252).Value2 = arr应为Range("A3:I252").Value2 = arr

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-16 21:26 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
周某人就是我 发表于 2024-1-16 21:15
有两处手误:
Setreg应为Set reg
Range(A3:I252).Value2 = arr应为Range("A3:I252").Value2 = arr

Set reg = Create Object("vbscript.regexp")

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-16 21:35 来自手机 | 显示全部楼层
:: L又一处错误
If arr(i, 7) = "" Then
arr(i, 7) = "文本7"
End If     '少了结尾

TA的精华主题

TA的得分主题

发表于 2024-1-17 07:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
没有附件,这代码也看不出是不是真的好用。

TA的精华主题

TA的得分主题

发表于 2024-1-17 08:17 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
你这代码自己都查出这么多问题,上传以前代码有没有调试过啊。

TA的精华主题

TA的得分主题

发表于 2024-1-17 09:30 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-17 12:18 来自手机 | 显示全部楼层
ykcbf1100 发表于 2024-1-17 08:17
你这代码自己都查出这么多问题,上传以前代码有没有调试过啊。

这些代码都是在手机上敲出来的。之前是分段分过程写的,都是在电脑上验证过的。现在揉在一起了,揉在一起就要改许多地方

TA的精华主题

TA的得分主题

 楼主| 发表于 2024-1-17 12:21 来自手机 | 显示全部楼层
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-19 08:36 , Processed in 0.035309 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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