求助:selection.paste出现4605错误
vba吧
全部回复
仅看楼主
level 6
jetamour90 楼主
当使用for循环调用range数组进行复制粘贴时,会随机地在循环进行到3或4次的时候报错。
注1:这样的错误不一定每次运行都发生。
注2:逐语句运行F8目前没有出现报错的情况。
求教错误发生的原因和解决办法!感谢!
2023年03月18日 13点03分 1
level 11
宏代码选手的通病!
先百度 关闭自动计算 和 屏幕刷新 看看
不行的话 就试着 舍弃 select selection 这类的代码
复制的话 cells.copy cells
2023年03月18日 18点03分 2
谷歌了无果 关闭刷新了 改成操作range而不是selection 问题依然存在
2023年03月19日 01点03分
我明白Excel可以把单元格的值赋给另一单元格以取代复制粘贴 但我这是Word 有类似方法可以绕过复制粘贴吗?
2023年03月19日 01点03分
查到最有可能的问题是剪切粘贴间隔时间太短 需要在之间加入一段等待时间
2023年03月19日 01点03分
@jetamour90 没仔细看,原来是word的。。。word的代码写的不多。。。写过也忘得差不多了,懒得去复习了。
2023年03月19日 01点03分
level 12
粘贴前加个插入新段落试试
2023年03月19日 01点03分 3
谢谢 我试试 所以这有说法吗
2023年03月19日 01点03分
最大的可能就是剪贴板被别的程序清空了
2023年03月19日 02点03分
level 6
jetamour90 楼主
问题以一种奇怪的方式解决了:
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:跑复杂的宏好慢啊,是电脑配置跟不上了吗...?
2023年03月19日 04点03分 4
@- 所以有替代嘛 我实在找不到
2023年03月20日 02点03分
@jetamour90 Private Declare 改成Private Declare PtrSafe
2025年02月26日 14点02分
吧务
level 11
1.会不会复制 的内容 太多,电脑也需要处理一段时间。需要等待,要加sleep
2.会不会在这个过程有其它 程序(或一些监控程序 对剪切板有处理动作)?
2023年03月19日 15点03分 5
1是有可能的,但因为sleep没有分配到每次循环,所以等待的作用不是每次给它一点时间copy,更像是一次性地让它重启。
2023年03月20日 02点03分
2的可能性小很多,因为我关掉了其它程序,同时几乎90%错误出现在第4次循环及之后(且与文档内容无关)。所以大概率是ms word自己的问题。
2023年03月20日 02点03分
level 1
遇到了同样的问题,换了一种方法。把复制的文本保存到变量中,然后打出变量:
Dim TX As String
'………
Selection.Copy
TX = Selection.Text
Selection.TypeText Text:=TX
2023年12月06日 04点12分 6
问题是这样无法带格式、图片图形啥的
2023年12月11日 07点12分
level 4
换成doevents试试,select范围太大的话计算机来不及运行完这个指令,vba已经开始下一句指令了
2023年12月27日 23点12分 7
level 4
按F8逐句有就有时间完成指令
2023年12月27日 23点12分 8
代码太长for循环次数太多,F8就不现实。好再琢磨出等来时间的那串代码,问题就解决了。
2023年12月28日 13点12分
level 11
电脑配置问题,不确定是不是内存不够。
加延时应该可以
2023年12月29日 06点12分 9
level 11
4605是对象的方法或属性不可用。哪个方法?paste方法,哪个对象?section对象。selection对象的贴粘动作为什么不可用? 瞅啥瞅我问你呢,程序执行到这为啥不能粘了?你动手手工粘一下不行吗?要么copy、cutt与paste之前的代码使copy效果消失了,要么所选对象不支持copy, paste. 这还有什么疑问吗
2024年01月02日 07点01分 10
虽然没有帮助 但打那么多字真是辛苦你了
2024年01月02日 13点01分
@jetamour90 没听懂,还是没效果。你把cut和paste中间那两行先注示掉,再执行看看有错误没?
2024年01月02日 13点01分
@lxlzmh2002 听懂了。但是1⃣️这样的错误不经常出现,一百次循环可能出现一次,F8逐行运行则完全不报错,所以大概率不是代码本身问题;2⃣️因为需要大量循环操作所以不能人工剪切黏贴。
2024年01月02日 13点01分
@lxlzmh2002 之前查了资料并且和朋友讨论以后,发现问题大概率出在cut/copy内容较多容易卡顿,还没完成上一步直接paste导致的错误。后来通过加等待时间避开了该错误,详情在4楼。
2024年01月02日 13点01分
level 1
只想问问,出错时,selection是什么内容?
2024年01月04日 00点01分 11
题目 包含各种带格式的文字图片公式
2024年01月04日 01点01分
@jetamour90 不是,我是指出错时SELECTION是什么对象,如果是EXCEL的话很多时候出错就是SELECTION引用的对象不正确造成的,WORD我没怎么做过,但原理应该是一样的
2024年01月04日 09点01分
@ISD_狮子座 range对象,不会有错的,正常都能运行,F8逐条运行也不会出问题,偶尔才报错。解决方法已经放在4楼了。
2024年01月04日 11点01分
@jetamour90 你那不应该叫解决方法,只能叫做可以凑巧少点报错,但不知道是什么原因。
2024年01月05日 00点01分
level 1
我是打开word文件第一次运行到新建word文件,粘贴用selection.paste会报4605错误,然后点调试,再运行就成功了。
此时不关闭这个word文件,再继续运行都不会报错了,但是每次新打开就会报错,在selection.paste之前加一个MsgBox就不报错了,但是这样会有个弹窗也很不爽
2024年03月18日 19点03分 12
小白刚接触这个,感觉挺凌乱的
2024年03月18日 19点03分
@壹统_天下 你在paste之前,一定是有个copy的。copy是把内容复制到内存中的剪贴板上,如果copy内容比较大,电脑是需要时间才能完成复制的,如果copy指令下了但实际电脑还没执行完复制过程,就执行了paste指令,此时就会出现那个错误代码
2024年03月19日 09点03分
@壹统_天下 这也是为什么中间加了个msgbox就不报错,这是因为在执paste动作之前,加了时间等待copy结果
2024年03月19日 09点03分
level 1
我这边也遇到这个问题,试了楼上说的msgbox弹窗,确实可以。我尝试了另一个办法也可以实现,doevents可以强势刷新系统。用法加上on error resume next,粘贴指令后面加一个判断,如果err.number<>0,则进入循环执行三行的doevents,然后再次粘贴,并执行err.clear,亲测有效。
2025年02月24日 05点02分 15
@聊吧草 三行的doevents怎么写的?求指教。半路自学的VBA,最近在WORD里粘贴表格也遇到这个问题,折腾几天刘,各种解决不了。求三行代码
2025年02月26日 14点02分
@霖骆 就是在粘贴指令前面写三行doevents这个单词啊
2025年03月16日 09点03分
三行doevents的原因是试过一行的,但是还是会粘贴不了,三行暂时没发现有问题
2025年02月24日 05点02分
加三个Doevents ,有效果,好用。另:我在word2013版本中,不会出现这个问题。
2025年12月07日 13点12分
1