- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个宏可以在后端打开Word文档并将所有数据表拉入Excel模板。
当我在一些同事的机器上测试它时,他们收到“VBA PasteSpecial 错误”。
我检查了同事机器中的引用文献和加载项是我的。
Dim sht As Worksheet
Dim WordDoc As Word.Document
Dim WordApp As Word.Application
Dim i As Long, r As Long, c As Long
Dim rng As Range, t As Word.Table
Dim ia As Integer
Dim OpenForms
Dim target As Range
ia = 1
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
Set WordDoc = WordApp.Documents.Open(DOC_PATH, ReadOnly:=True)
Set sht = Sheets("test")
Set rng = sht.Range("A5")
sht.Activate
For Each t In WordDoc.Tables
OpenForms = DoEvents
t.Range.Copy
OpenForms = DoEvents
ThisWorkbook.Sheets.Add(After:=Sheets(Sheets.Count)).Name = "Table_" & ia ' add new sheet
Range("a1").Select ' paste table
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
OpenForms = DoEvents
最佳答案
OP 将问题诊断为并发问题,即剪贴板未及时复制以进行粘贴操作。下面的代码将解决此问题,同时保持响应式 UI 以及合理的超时和通知。
On Error Resume Next
Dim TimeoutLimit
TimeoutLimit = 300
Dim TimeoutCounter
TimeoutCounter = 0
Do
Err.Clear
DoEvents 'Yield thread execution
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
TimeoutCounter = TimeoutCounter + 1
Loop Until (Err.Number = 0 Or TimeoutCounter > TimeoutLimit )
On Error GoTo 0
If TimeoutCounter > TimeoutLimit Then
MsgBox "Paste failed because of operation timeout", vbCritical
'Is this fatal? Abort by proper exiting...
'Exit Sub
'Exit Function
End If
<小时/>
根据您所做的测试和此 MSDN Documentation,我认为您对 ActiveSheet.PasteSpecial
的使用可能没问题。 。但是,您的问题可能是您获取的数据与文本
格式不兼容,如下所述。
就方法而言,Worksheet.PasteSpecial
方法与Range.PasteSpecial
完全不同。我觉得奇怪的是,如果您调用工作表方法,您收到的错误表明范围方法失败。如果这是准确的,我怀疑 Worksheet 方法在某个时刻调用了 range 方法。
我可以重现具体错误
PasteSpecial method of Range class failed
对于 Range.PasteSpecial
在以下条件下:
事实证明,有一个 Office 剪贴板和一个 Windows 剪贴板。例如,Application.CutCopyMode
仅控制办公室剪贴板。 Range.PasteSpecial
在 Office 剪贴板中工作,而 Workbook.PasteSpecial
在系统或 Windows 剪贴板中工作。因此,如果 Office 剪贴板为空,它不会抛出错误,事实上,如果强制使用 Text
作为格式,它会在复制 Excel 范围的相反情况下抛出错误。
PasteSpecial method of Worksheet class failed
如果剪贴板数据无法转换为文本(如图片),它也会抛出此错误。您可以通过不指定格式并使用默认格式来处理此问题。那么它不一定是文本,但这解决了粘贴 Excel 范围的错误。
要说明这一点并检查剪贴板内容的存储方式,请从 Excel 中进行查看,如下所示。
由于在不同条件下,一件事或另一件事可能会给您带来不同的问题,因此您可以尝试通过这样的选项来取得进展......
On Error Resume Next
ActiveSheet.Range("A1").PasteSpecial Paste:=xlPasteValues
If Err > 0 Then
Err.Clear
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
If Err > 0 Then
Err.Clear
'You could also try to manually retrieve data from clipboard at this point
ActiveSheet.PasteSpecial
End If
End If
On Error GoTo 0
就像我在评论中所说的那样,PasteSpecial
可能很挑剔。因此,我建议删除它作为一个因素并测试您是否可以直接访问剪贴板内容,如下面的代码( copied from here )...
Sub GetClipBoardText()
Dim DataObj As MSForms.DataObject
Set DataObj = New MsForms.DataObject '<~~ Amended as per jp's suggestion
On Error GoTo Whoa
'~~> Get data from the clipboard.
DataObj.GetFromClipboard
'~~> Get clipboard contents
myString = DataObj.GetText(1)
MsgBox myString
Exit Sub
Whoa:
If Err <> 0 Then MsgBox "Data on clipboard is not text or is empty"
End Sub
查看此documented case of the same error这是由于剪贴板为空而导致的,而且使用 Office 宏很容易发生这种情况。您正在宏中复制,所以我不认为这是您的问题。此外,此代码片段将防止 Range
方法出现空值,但不会防止 Worksheet
方法出现空值,因为它只检查应用程序的剪贴板,而不检查系统的剪贴板。
If Application.CutCopyMode = True Then
ActiveSheet.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False
Else
MsgBox("There is no data on the clipboard to be pasted.")
End If
关于excel - ActiveSheet.PasteSpecial 中的 VBA PasteSpecial 错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46571633/
我习惯于总是使用ActiveSheet,如下所示:ActiveWorkbook.ActiveSheet。我最近偶然发现this Microsoft page代码包含 ActiveSheet,但不包含
我录制了一个宏,它在“ActiveSheet”上创建了一个 With 循环。我想指定哪个工作表,这样我就可以创建一个按钮,其中包含该宏,它将引用正确的工作表。在 vba 中如何指定特定工作表而不是“W
在我使用的工作表工具中,我有一个指向 Sharepoint 列表的链接表。我编写的宏会刷新表格并删除任何过滤器(如果有的话)。 我通过快速更改代码解决了此代码的问题,但我不太明白为什么 actives
我在这里得到了一些非常好的帮助,编写了一个简短的宏,如下所示(效果完美)。 我遇到的问题是我不明白如何在每一步中使用 ActiveSheet 删除常量。理想情况下,我希望能够在具有不同名称的工作表上运
有用户定义函数(UDF),位于工作簿的所有工作表上。 如何引用该函数所在的工作表? 我正在使用ThisWorkbook.ActiveSheet,但结果不断变化。 Function äëÿñèò(Dia
Dim wsCopy As Worksheet Dim wsDest As Worksheet Set wsCopy = Workbooks(ThisWorkbook.Path).ActiveSh
我的工作簿中有 10 张工作表 - 这些工作表是从各个工作簿中导入的 - 这些工作簿是从不同的监控工具中提取的 我需要在所有 10 个工作表中应用过滤器,但是,并非所有工作表都采用相同的格式/结构。
我正在使用 Excel for Mac 2011,我在一张纸上有几个复选框。我正在尝试使用以下代码使它们自动化: Private Sub CheckBox12_Click() Dim ws A
我已经找到了解决方案,但代码太长了。然后我决定搜索一种将我想要查找和突出显示的所有单词插入到单个查找方法中的方法。我遇到了一些使用数组来执行此操作的想法,并使用这 3 个代码来编写我的代码( this
对于我的第一个 AddIn Excel,我想选择事件工作表并计算工作表中的列和行。 我在自定义功能区中创建了一个按钮。 private void AddValues_Click(object
Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B4")) Is Nothing
我编写了一个带有 if 语句的代码,如果满足某些条件,则可以将复选框添加到 ActiveSheet 中的某些单元格。我下面的代码显示了该代码。 'To add checkboxes Dim ToRow
我有一个读取文本文件并将数据导入到定义名称单元格的子程序。文本文件中有一些我不需要的数据,所以如果子找不到匹配的单元格,它只是假设忽略它。 但是,当函数找到不存在的定义名称时,它会引发 1004 错误
我一直在放QueryTables结果 ActiveSheet ,但现在我想把它们放在另一张纸上。在下面的代码中,注释掉的行是我最初的,下面的“with”行是我的新尝试。 Dim QuerySheet
一些背景:我有一张图表,上面有一张计数表。当切片器更改时,我需要单击计算来更新计数和图表。 (由于工作簿大小,计算设置为手动)。 信不信由你,使用计算按钮超出了某些用户的范围。我希望将它作为一个表单按
当您在 Excel 中打开工作簿时,它会显示您上次保存时正在查看的工作表。 当您使用 EPPlus 打开工作簿时,如何确定这是哪个工作表? 最佳答案 ExcelWorksheet activeShee
对于这个问题,我引用下面的帖子来澄清自己: Why is my conditional format offset when added by VBA? 在我这些天看到的很多很多帖子中,OP 都被默默
我有这个简单的代码,我只想将值从 WoorkBook1 复制到 Workbook2,只有值,因为 Workbook2 具有特定格式。 Sub Test() Workbooks("Workbook
我有 2 个工作表(输入和记录),我只想将一些数据从“输入”复制到“记录”,它有效,但如果我保护“记录”...。 Worksheet类的粘贴方法失败过来。 因此,我为未 protected 工作表和保
我可能在这里遗漏了一些非常明显的东西,但为什么以下内容不向日志写入任何内容? (jsfiddle 在这里 - http://jsfiddle.net/hiwilson1/qk9cjuh2/ - 虽然它
我是一名优秀的程序员,十分优秀!