这个系列主要是作为我的学习笔记,记录一下代码和心得防止丢失.
部分代码来自ahk群内热心群友,感谢诸位群友帮助 岁月如歌,僵尸,蜜罐哥,汤瞬,dbgba,无名,小马哥,枫叶,空 等(排名不分先后).
a=1280
截取次数=% StrLen(a)
i=1
loop
{
if (i=截取次数+1)
break
Clipboard:=SubStr(a,i,1)
ClipWait
if WinExist("ahk_class OpusApp")
WinActivate
else
MsgBox 报错
Sleep 500
SendInput,^v
Sleep 400
SendInput,{Tab}
i:=i+1
}
return
今天有了一个新的需求,想要把金额一个一个的粘贴进报销单中比如这样的
不能一次性send
思路就是用strlen可以把一个数字的位数给量出来比如1280就是四位,可以知道这个数字等于要粘贴四次最多
一个数字最少是粘贴一次,所以我们可以知道1280的截取是在1-strlen(1280)这个范围内进行的.
所以我们可以定义一个变量i,进行循环,每次i步进一个单位,直到strlen(1280)+1停止
截取数字的时候用的是substr这个,把截取的位数设为1,开始的位置就从1开始一直到strlen(1280)为止
个人感觉我这个方法还是有点绕,然后有个缺陷,用loop这么循环的话实际上我个人可以通过写入剪切板复制的方法来解决这次的需求了,但是没有办法把过程中的每个数字存变量,等于不能同时填好几张表.这个我感觉得修改循环才能解决.
暂时感悟只有这么多,另外提一下在这个报销单中粘贴数字目前的个人思路:
一个金额最大的位数在这个示例里面只有8个数字,2个小数点后面的毛和分,以及整数6位,那我在获取一个数字之后就有了两个分支选择,下面分析一下.
1.正向send,总数为8,那我可以先数据处理,把金额中的小数点给去掉然后全部强制保留两位小数,比如12.50变成1250,在send的时候只需要从左侧{tab % 8-strlen(1250)}就可以了然后开始输入数字,这个方案只要一开始的数据处理精确就可以了
2.反向send,这是我最开始的思路,其实也得数据处理,这次是1299.50这个数字,仍旧简化为129950,反向从末尾send,从右往左send6位即可,不用去算位数和8的差额了,其实也没简单多少,考虑到左边还要录入数据,实际上正向卢栓数据更合适.
题外话,近期好几个需求需要操作word,发现word的vba和excel的vba还是有很多的不同,准备好好研究一下,也看看ahk怎么操作word的对象.
谢谢大神分享,学习