【发布时间】:2021-12-03 00:58:44
【问题描述】:
我只想将形状(形状是画布)从 Word 文档“A”的一部分复制到 Word 文档 B 的一部分。
我做了下一个代码:
Sub CopyInfo()
Dim A_Path, Prop As String 'path of A,title
Dim dlgSelectFile As FileDialog 'Object for selecting path
'Create File dialog oject
Set dlgSelectFile = Application.FileDialog(msoFileDialogFilePicker)
With dlgSelectFile
.Filters.Clear
.AllowMultiSelect = False
.Show
A_Path = .SelectedItems(1) 'saving selected document
End With
'Open ESI
Dim ADoc As Document
Set ADoc = Documents.Open(A_Path)
Dim MyRange As Range
'State Diagram
Documents(ADoc).Activate 'Activate A document
Set MyRange = ActiveDocument.Content
With ActiveDocument.Range
With .Find 'find logical description heading
.ClearFormatting
.Replacement.ClearFormatting
.Text = "Logical Description"
.Style = "Heading 2"
.Format = True
.Forward = True
.MatchCase = True
.Wrap = wdFindStop
.MatchWildcards = False
.Execute
End With
If .Find.Found = True Then
Set MyRange = .Duplicate.GoTo(What:=wdGoToBookmark, Name:="\HeadingLevel") 'set range of heading section
MyRange.Start = MyRange.Paragraphs.First.Range.End
MyRange.SetRange Start:=MyRange.Start, End:=MyRange.End - 1
For i = 1 To MyRange.ShapeRange.Count 'search and copy/paste only images
MyRange.ShapeRange.Item(MyRange.ShapeRange.Count + 1 - i).Select
Selection.Copy
ThisDocument.Activate 'Activate document B
Selection.GoTo What:=wdGoToBookmark, Name:="StateDiagram" 'go to bookmark where i want to paste images
Selection.PasteSpecial Placement:=wdInLine 'paste on document B
Documents(ADoc).Activate 'Activate A document
Next i
End If
End With
End Sub
在我的代码中,我从文档“B”打开文档“A”,并在我想要从中获取形状的部分(这是标题中的内容)中设置 MyRange。然后对于 MyRange 中的所有形状,我将它们一个一个复制并粘贴到文档 B 中(从最后一个形状开始到第一个形状)。
问题是有时它会复制数字,有时则不会。 我认为问题出在 selection.copy 中,因为它确实选择了形状,但剪贴板仍然是空的。有谁知道问题出在哪里?
注意:我不知道这是否有关系,但是当文档“A”已经打开并且我的光标位于最后一个形状下方时,它确实会复制它们。我已经在许多不同的“A”文档中尝试过,结果也是一样。
我是 VBA 的新手,如果我的问题的解决方案真的很明显或者我没有说清楚,我很抱歉。
【问题讨论】:
-
您是否从 Excel 运行此代码?如果是这样,
Selection指的是 Excel,而不是 Word。 -
Range.Select Selection.Copy可以简化为Range.Copy。并将Selection.Paste改进为Range.Paste。通过消除对Selection的依赖,您可以提高代码的准确性和可靠性。例如ThisDocument.Range.Goto(What:=wdGoToBookmark, Name:="StateDiagram").PasteSpecial Placement:=wdInLine -
@Toddleson - 除了
Shape或ShapeRange没有Copy方法。当然,如果源文档中的标题范围仅包含形状,那么targetRange.FormattedText = sourceRange.FormattedText将起作用并避免使用剪贴板。 -
@TimothyRylatt 我正在使用 word 运行代码,选择对象是否不适用于 word?不幸的是,标题范围还包含文本。
-
@Toddleson,首先感谢您的回答。正如蒂莫西所说,我不能直接复制 ShapeRange 的项目,这就是我选择它的原因,但我想也许我可以设置另一个只包含 1 个 shaperange 项目的范围,然后复制这个范围。