【发布时间】:2021-03-22 18:07:30
【问题描述】:
我有下面的代码将 Word 中的一组表格复制到 Excel。正在复制的数据量会导致内存问题,所以我想避免使用剪贴板 - 即避免使用Range.Copy
Word 不支持Range.Value,我无法让Range(x) = Range(y) 工作。
对于避免剪贴板的方法有什么建议吗?文字格式可能会被垃圾。
Sub ImportWordTableArray()
Dim WordApp As Object
Dim WordDoc As Object
Dim arrFileList As Variant, FileName As Variant
Dim tableNo As Integer 'table number in Word
Dim tableStart As Integer
Dim tableTot As Integer
Dim Target As Range
On Error Resume Next
arrFileList = Application.GetOpenFilename("Word files (*.doc; *.docx),*.doc;*.docx", 2, _
"Browse for file containing table to be imported", , True)
If Not IsArray(arrFileList) Then Exit Sub
Set WordApp = CreateObject("Word.Application")
WordApp.Visible = False
Worksheets("Test").Range("A:AZ").ClearContents
Set Target = Worksheets("Test").Range("A1")
For Each FileName In arrFileList
Set WordDoc = WordApp.Documents.Open(FileName, ReadOnly:=True)
With WordDoc
'For array
Dim tables() As Variant
Dim tableCounter As Long
tableNo = WordDoc.tables.Count
tableTot = WordDoc.tables.Count
If tableNo = 0 Then
MsgBox WordDoc.Name & "Contains no tables", vbExclamation, "Import Word Table"
End If
tables = Array(1, 3, 5) '<- define array manually here if not using InputBox
For tableCounter = LBound(tables) To UBound(tables)
With .tables(tables(tableCounter))
.Range.Copy
Target.Activate
'Target.Parent.PasteSpecial Format:="Text", Link:=False, DisplayAsIcon:=False '<- memory problems!
'Or
ActiveSheet.Paste '<- pastes with formatting
Set Target = Target.Offset(.Rows.Count + 2, 0)
End With
Next tableCounter
.Close False
End With
Next FileName
WordApp.Quit
Set WordDoc = Nothing
Set WordApp = Nothing
End Sub
【问题讨论】:
-
你可以试试
(x)= .Tables.Item(1).range.FormattedText。如果这不起作用,则将表的内容复制到 VBA 数组,然后粘贴该数组。如果这对您很重要,您将丢失格式。 -
即使您将excel范围设置为与Word表格相同的大小/形状?
-
我不知道该怎么做,因为范围是一个数组(表的集合),表的大小(行数)可以从文件中的一个表更改为下一个并从循环中的一个文件到下一个文件。
标签: vba ms-word copy range clipboard