在word vba中 shape对象表示位于文字上方的位于图层的图片,InlineShape对象表示位于一段文字中间的,就像是字符一样的图片,但是有个特别要注意的就是 An inline shape can only be a picture, an OLE object, or an ActiveX control InlineShape对象 只能是图片、OLE对象或者 ActiveX控件。
如果要把shape对象转换为InlineShape对象,可以使用ConvertToInlineShape方法,并且返回InlineShape对象。【注:经过测验,这个方法仅仅是把shape对象的环绕方式改为嵌入式,并不能完全转成InlineShape对象】
如果要把InlineShape对象转换为shape对象,可以使用 ConvertToShape方法,并且返回shape对象。
凡是打开旧版本的word,所有的图形对象都会转换为InlineShape对象。
另外一个shape对象要转换为InlineShape对象,还可以直接设置shape对象的文字环绕方式为“嵌入型”,就可以转化为InlineShape对象。
【PS:设置shape对象的文字环绕方式为“嵌入型”,并不能把Shape对象都转换为InlineShape对象,因为有些Shape对象是不能转换为InlineShape对象的,比如在word中插入的形状就不能转换为InlineShape对象。An inline shape can only be a picture, an OLE object, or an ActiveX control 】
基于上述的知识,可以使用如下的vba代码将word文档中的所有Shape对象转成InlineShape对象:
Sub QQ1722187970() Dim oSP As Shape Dim oISP As InlineShape Dim oDoc As Document Set oDoc = Word.ActiveDocument For Each oSP In oDoc.Shapes Debug.Print oSP.Type oSP.ConvertToInlineShape Next End Sub
但是在实际的应用过程中发现,用上述代码转换后还是有很多Shape对象没有转成InlineShape对象,这个是word vba的bug。
为了解决这个问题,需要每次将要转换的Shape对象的名称都存入数组中,然后再逐个进行转换,代码如下:
Sub QQ1722187970() Dim oSP As Shape Dim oISP As InlineShape Dim oDoc As Document Set oDoc = Word.ActiveDocument Dim arr() Dim k k = 0 With oDoc Debug.Print .Shapes.Count Debug.Print .InlineShapes.Count For Each oSP In .Shapes ' oSP.Select ' oSP.ConvertToInlineShape ReDim Preserve arr(k) arr(k) = oSP.Name k = k + 1 Next For i = 0 To UBound(arr) sName = arr(i) Set oSP = .Shapes(sName) ' oSP.Select oSP.ConvertToInlineShape Next i End With End Sub
而对于InlineShape对象转成Shape对象可以直接使用如下的vba代码实现:
Sub QQ1722187970() Dim oSP As Shape Dim oISP As InlineShape Dim oDoc As Document Set oDoc = Word.ActiveDocument For Each oISP In oDoc.InlineShapes oISP.ConvertToShape Next End Sub
基于上述的分析,有时候我们需要的是批量将所有图形在“嵌入式”和其它文字环绕方式中转换,而不是将对象在InlineShape和Shape之间转换,这时候可以使用Shape对象的WrapFormat属性修改。
这时候可以使用如下的vba代码:
Sub QQ1722187970() Dim oSP As Shape Dim oISP As InlineShape Dim oDoc As Document Set oDoc = Word.ActiveDocument Dim arr() Dim k k = 0 With oDoc Debug.Print .Shapes.Count Debug.Print .InlineShapes.Count '以下代码将所有图形的环绕方式都转为嵌入式 For Each oSP In .Shapes ReDim Preserve arr(k) arr(k) = oSP.Name k = k + 1 Next For i = 0 To UBound(arr) sName = arr(i) Set oSP = .Shapes(sName) oSP.ConvertToInlineShape Next i '以下代码将所有嵌入式的图形都转换为其它形式 For Each oSP In .Shapes ReDim Preserve arr(k) arr(k) = oSP.Name k = k + 1 Next For i = 0 To UBound(arr) sName = arr(i) Set oSP = .Shapes(sName) With oSP If .WrapFormat.Type = wdWrapInline Then '环绕方式转为四周型 .WrapFormat.Type = wdWrapSquare End If End With Next i For Each oISP In .InlineShapes oISP.ConvertToShape Next End With End Sub
有时候我们希望只对选中的区域执行图片环绕方式的转换,可以使用如下的vba代码:
Sub QQ1722187970() Dim oSP As Shape Dim oISP As InlineShape Dim oDoc As Document Set oDoc = Word.ActiveDocument Dim oRng As Range If Word.Selection.Start = Word.Selection.End Then Dim arr() Dim k k = 0 With oDoc Debug.Print .Shapes.Count Debug.Print .InlineShapes.Count '以下代码将所有图形的环绕方式都转为嵌入式 For Each oSP In .Shapes ReDim Preserve arr(k) arr(k) = oSP.Name k = k + 1 Next For i = 0 To UBound(arr) sName = arr(i) Set oSP = .Shapes(sName) oSP.ConvertToInlineShape Next i End With Else iStart = Word.Selection.Start iEnd = Word.Selection.End With oDoc Debug.Print .Shapes.Count Debug.Print .InlineShapes.Count '以下代码将所有图形的环绕方式都转为嵌入式 For Each oSP In .Shapes ReDim Preserve arr(k) arr(k) = oSP.Name k = k + 1 Next For i = 0 To UBound(arr) sName = arr(i) Set oSP = .Shapes(sName) If oSP.Anchor.Start >= iStart And oSP.Anchor.End <= iEnd Then oSP.ConvertToInlineShape End If Next i End With End If End Sub
03版doc类型的文件,无法运行
大师级成果,牛
发现不能运行。
运行到
oSP.converttoinlineshapes提示:参数无效。