问题以一种奇怪的方式解决了:
0. 如果增加on error resume next,4605错误出现的for周期后的循环也同样会报错。
1. 首先,由于我需要移动的段落可能包含图片和表格,无法使用range.text或range.formattedtext的方法代替range.copy/cut-paste实现段落的移动。
2. 其次,由于错误的随机性,将程序逻辑从cut→paste改成了copy→paste→if not err→delete。防止因为剪切段落未成功粘贴从而从文档消失。
3. 最后,解决方案如下:在模块开头声明kernel32.dll的Sleep函数,并在4605错误发生时用Sleep函数使程序待机一段时间后,重新尝试复制粘贴。代码后附。
----------------------------------------------------------------
出于不为人知的原因,我设置的等待时间越长,发生4605错误的for周期越少。最后当把Sleep时间设定为40000毫秒时,第一次错误仍会出现错误,但在Sleep后,重新尝试复制粘贴成功,且后面的循环不再报错。
猜测sub过程在执行时,剪贴板有时候会出错/崩溃。需要(一次性地)等待一段时间,使剪贴板修复/重启。这个时间不确定,在我电脑上大约是25~40秒之间。
----------------------------------------------------------------
附1:Sleep函数的声明代码
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
附2:修改后的sub过程代码
vArr(i).tAnsRng.Copy
vTmpRng.Paste
If Err.Number = 4605 Then
Debug.Print vArr(i).tQueInd & "出现错误4605"
Sleep 40000 ' 等待时间越少,错误且无法修复的次数越多
Err.Clear
vArr(i).tAnsRng.Copy
vTmpRng.Paste
If Err.Number = 4605 Then ' 等待后二次尝试
Err.Clear
Debug.Print "错误未修复"
Else
vArr(i).tAnsRng.Delete
End If
Else
vArr(i).tAnsRng.Delete
End If
----------------------------------------------------------------
感想1:吐了,以后从业务层面尽量避免复制粘贴吧。
感想2:跑复杂的宏好慢啊,是电脑配置跟不上了吗...?
0. 如果增加on error resume next,4605错误出现的for周期后的循环也同样会报错。
1. 首先,由于我需要移动的段落可能包含图片和表格,无法使用range.text或range.formattedtext的方法代替range.copy/cut-paste实现段落的移动。
2. 其次,由于错误的随机性,将程序逻辑从cut→paste改成了copy→paste→if not err→delete。防止因为剪切段落未成功粘贴从而从文档消失。
3. 最后,解决方案如下:在模块开头声明kernel32.dll的Sleep函数,并在4605错误发生时用Sleep函数使程序待机一段时间后,重新尝试复制粘贴。代码后附。
----------------------------------------------------------------
出于不为人知的原因,我设置的等待时间越长,发生4605错误的for周期越少。最后当把Sleep时间设定为40000毫秒时,第一次错误仍会出现错误,但在Sleep后,重新尝试复制粘贴成功,且后面的循环不再报错。
猜测sub过程在执行时,剪贴板有时候会出错/崩溃。需要(一次性地)等待一段时间,使剪贴板修复/重启。这个时间不确定,在我电脑上大约是25~40秒之间。
----------------------------------------------------------------
附1:Sleep函数的声明代码
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
附2:修改后的sub过程代码
vArr(i).tAnsRng.Copy
vTmpRng.Paste
If Err.Number = 4605 Then
Debug.Print vArr(i).tQueInd & "出现错误4605"
Sleep 40000 ' 等待时间越少,错误且无法修复的次数越多
Err.Clear
vArr(i).tAnsRng.Copy
vTmpRng.Paste
If Err.Number = 4605 Then ' 等待后二次尝试
Err.Clear
Debug.Print "错误未修复"
Else
vArr(i).tAnsRng.Delete
End If
Else
vArr(i).tAnsRng.Delete
End If
----------------------------------------------------------------
感想1:吐了,以后从业务层面尽量避免复制粘贴吧。
感想2:跑复杂的宏好慢啊,是电脑配置跟不上了吗...?