VBA用MSForms.DataObject读写剪贴板在部分企业设备失效如何解决?
故障原因
- MSForms.DataObject 天生兼容性缺陷:该组件是32位Office时期的老旧组件,在64位Office、Office 365/2021及部分企业定制版Office环境中,就算正确勾选了Microsoft Forms 2.0 Object Library引用,也会因为系统UAC权限限制、Office安全策略拦截、剪贴板内存在非文本格式内容等原因,出现读写剪贴板失败的情况,且静默报错(你的代码里的On Error逻辑会直接退出过程,不会抛出报错提示)。
- 部分企业设备的注册表中未正确注册MSForms相关组件,就算勾选引用也无法正常创建DataObject实例。
稳定剪贴板读写实现方案
推荐无需额外引用、兼容性更强的HTML对象实现方案,适配32/64位全版本Office,不受Forms库限制:
首先封装两个通用剪贴板操作函数:
' 写入文本到剪贴板 Function Clipboard_SetText(sText As String) As Boolean On Error Resume Next Dim objHTML As Object Set objHTML = CreateObject("htmlfile") objHTML.ParentWindow.ClipboardData.SetData "Text", sText Clipboard_SetText = (Err.Number = 0) Set objHTML = Nothing End Function ' 从剪贴板读取文本 Function Clipboard_GetText() As String On Error Resume Next Dim objHTML As Object Set objHTML = CreateObject("htmlfile") Clipboard_GetText = objHTML.ParentWindow.ClipboardData.GetData("Text") Set objHTML = Nothing End Function
改造原有业务代码直接调用通用函数即可:
改造后的生成文件名写入剪贴板代码
Sub x_copiar_nome_arquivo() Dim arquivo As String On Error GoTo ErrorHandler With Selection.Rows(1).EntireRow arquivo = .Range("G1").Value & " - " & Format(.Range("E1").Value, "#000000000") End With Call Clipboard_SetText(arquivo) ErrorHandler: Exit Sub End Sub
改造后的剪贴板内容处理代码
Sub y_chave_danfe() Dim chave As String Dim danfe As String On Error GoTo ErrorHandler chave = Clipboard_GetText() If chave = "" Then Exit Sub danfe = Replace(Replace(Replace(Replace(Replace(chave, " ", ""), "/", ""), "-", ""), ".", ""), "_", "") Call Clipboard_SetText(danfe) ErrorHandler: Exit Sub End Sub
注:该方案不需要勾选任何额外引用,直接复制代码即可使用,兼容绝大多数企业Office设备环境。
内容的提问来源于stack exchange,提问作者Afonso Medeiros
相关产品推荐
相关产品推荐

