作者Kamikiri (☒☒)
看板Office
标题[算表] VBA 暗号解码比对抓错运算 需提高效率
时间Tue Oct 8 00:40:26 2019
软体:OFFICE 365 EXCEL
版本:1908
目前正在编写的功能是直接把一个工作表当成暗号表
A栏=暗号,B栏=解码後的对应词
另一个工作表则是杂乱无章的暗号跟解码後的词汇
然後要用暗号表去抓出文章内是否有出现暗号
而且是否解码後的词汇是否是正确的
例如
暗号表
A1=9527 B1=唐伯虎
A2=88 B2=掰掰
(下略)
解码表
A1=pppij"9527"clizxj B1=pppij"唐伯X"clizxj
C1=解码侦错:出现暗号:9527 解码遗漏:唐伯虎
大概是这种感觉
目前编写的代码大致如下:
For Row1 = 2 To 10000
For Row2 = 4 To 10000
Sheets("解码").Activate
If Sheets("暗号").Cells(Row1, 1).value <> "" Then
If Sheets("解码").Cells(Row2, 1).value <> "" Then
Code = Sheets("暗号").Cells(Row1, 1).value '暗号
Decry = Sheets("暗号").Cells(Row1, 2).value '解码对应词
Decode1 = InStr(1, (Cells(Row2, 1)), Code) '判断暗号文章是否有暗号
Decode2 = InStr(1, (Cells(Row2, 2)), Decry) '判断解码後是否有对应词
If Decode1 <> 0 And Decode2 = 0 Then '若暗号文章有暗号但解码後无对应词
For Col = 7 To 52
If Cells(Row2, Col).value = "" Then
Cells(Row2, Col).value = "解码遗漏:" & Decry
'在该文章列的7~52栏个别记下解码遗漏的对应词(因为可能一格内有多个不同暗号)
Exit For
End If
Next
End If
End If
End If
Next
Next
最後再用Textjoin把纪录在7~52栏的遗漏纪录整合在同一格内
然後为了方便辨识杂乱文章中的各个暗号
也去网路上找了帮特定字串上色的写法
https://access-excel.tips/excel-vba-change-partial-text-color/
我是用Macro 1 – Change partial text color using VBA Macro这个
目前的写法虽然可以正常运作
但速度上还是有点慢,在有600条暗号的情况下,至少也要60秒才能检查完
不知道是否有其他方式可以加快运算的速度?
而且现在还有个问题是如果暗号中有两个9527
但解码後只有一个唐伯虎,这种情况也不会被判断成解码缺失
所以在想是不是应该写另一个用资料剖析功能运算的版本来测试看看.....
把每个暗号个别分开,就可以连同数量不一致的也抓出来
希望有人可以提供意见,感谢
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 123.193.189.222 (台湾)
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Office/M.1570466433.A.3AB.html
1F:→ soyoso: 1.减少巢状回圈次数range.end().row来取得最後一笔有值的 10/08 07:27
2F:→ soyoso: 储存格列号 10/08 07:27
3F:→ soyoso: 2.只针对出现暗号的储存格,range.find或range.autofilter 10/08 07:27
4F:→ soyoso: 3.减少range.value的写入,而是先写入变数内,最後再一次 10/08 07:27
5F:→ soyoso: 性的写入范围内 10/08 07:27
6F:→ soyoso: 暗号有2个9527,只有1个唐伯虎方面(len(储存格)-len( 10/08 07:27
7F:→ soyoso: replace(取代9527[变数])))/len(9527[变数]),或是ubound( 10/08 07:27
8F:→ soyoso: split()),这样可得知字串内有出现多少次 10/08 07:27
9F:→ soyoso: 再判断是否次数有相符 10/08 07:27
啊 忘了修文 回圈上限的部分我後来有修正了
这样就不用多检查没有值的栏位
range.find或range.autofilter我会再研究看看
另外 写入变数内再拿出来的做法有范例吗? 网站也可
然後虽然可能不会用到了,但还是想问一下
range.value=值 跟 range="值" 在运算速度上是有差的吗?
※ 编辑: Kamikiri (60.248.94.55 台湾), 10/08/2019 10:16:46
10F:→ soyoso: 写入再拿出来,不确定所谓的拿出来是指?一次性写入范围内 10/08 09:56
11F:→ soyoso: 吗?如果是的话写入变数的话,变数(索引值,索引值[二维])= 10/08 09:58
12F:→ soyoso: 判断内原本要写入储存格的值;最後回圈都执行完毕,在 10/08 09:59
13F:→ soyoso: range(和变数维度、个数相同的范围)=变数 的方式写入 10/08 10:00
14F:→ soyoso: range.value 或 range=值方面测试写入10次10万资料上 10/08 10:06
感谢,刚刚在看到你的推文前上网查了一下
目前只想出以下写法(还没写好写正确 但应该类似)?
Dim Array(1,52) as Variant
if 解码有误
Array(Row2,Col) = "解码遗漏:" & Decry
不知道创个Dictionary写进去之後再整批拿出来是否也相同
总之目前大致上已经有方向,应该没问题了,感谢解答
※ 编辑: Kamikiri (60.248.94.55 台湾), 10/08/2019 10:22:03
16F:→ soyoso: 如非一维的话,这要看dictionary是否可产生二维以上 10/08 10:22
17F:→ soyoso: 一维的话,一样range= dictionary.keys的方式 10/08 10:23
18F:→ soyoso: dictionary.key写入列的话,应需用工作表函数transpose转 10/08 10:24
19F:→ soyoso: 置 10/08 10:24
了解,我晚点再GOOGLE研究看看
最後一问,如果你还有看到的话再麻烦解答
假如我想在解码中使用万用字元*
例如 95*7 让9507~9597全部都视为应该被解码为唐伯虎的话
是否只能使用Range.Find才有办法?
发现其他写法似乎都只会把*视为一般字元而非万用字元
万分感谢
※ 编辑: Kamikiri (60.248.94.55 台湾), 10/08/2019 11:33:39
20F:→ soyoso: like或range.autofilter 方面可用万用字元 10/08 11:59
21F:推 foolkids: 一样推荐Dictionary,30万笔的比较时,效率还可以;超过 10/10 17:57
22F:→ foolkids: 的时候一样有效能问题,要再多做些手段 10/10 17:57