2014-09-23 56 views
1

我正在创建一组宏来清理和重新格式化特定的MS Word文档。当我遇到一个隐藏的文本框时,我通过循环访问Word文档标题中的文本框,但无法通过任何其他方式在文档中找到该框。MS Word中隐藏文本框的未知状态

问题中的文本框在文档中不可见,除了文档中的位置差异,内容和顺序之外,我无法从VBA中的其他文本框中区分出它。我可以阅读和写入其属性,甚至“选择”它,但我无法在文档中看到它,并且无法通过VBA与其他文本框区分开来。

我想要做的是能够通过VBA除了位置,内容和订单属性之外,确定这个神秘文本框和其他可见文本框之间的区别。我希望能够找到“隐藏”文本框并将其删除,问题是我无法确定哪一个是“隐藏”文本框。

我创建的文档的缩小版,只有神秘的文本框和另外一个普通的文本框,并上载here on Dropbox,它在头两个文本框,并用下面的代码启用宏:

Option Explicit 

Sub findTextBox() 

    Dim objShapeCount As Integer 
    Dim objShapes As Shapes 
    Dim state As MsoTriState 
    Dim i As Integer 

    Set objShapes = ActiveDocument.Sections(1).Headers(wdHeaderFooterFirstPage).Shapes 
    objShapeCount = objShapes.Count 
    Debug.Print "Number of shapes: " + CStr(objShapeCount) 

     For i = objShapeCount To 1 Step -1 
     If objShapes(i).Type = msoTextBox Then 
      'Texbox found 
      objShapes(i).Select 
      MsgBox objShapes(i).TextFrame.TextRange 
      'Debug everything 
      Debug.Print "Type: " + CStr(objShapes(i).Type) 
      Debug.Print "Name: " + CStr(objShapes(i).Name) 
      Debug.Print "Height: " + CStr(objShapes(i).Height) 
      Debug.Print "Width: " + CStr(objShapes(i).Width) 
      Debug.Print "Left: " + CStr(objShapes(i).Left) 
      Debug.Print "Top: " + CStr(objShapes(i).Top) 
      Debug.Print "Id: " + CStr(objShapes(i).ID) 
      objShapes(i).Visible = 1 'C'mon! Show me! 
      Debug.Print "Invisible: " + CStr(state = objShapes(i).Visible) 'Crap 
      Debug.Print "Z Order: " + CStr(objShapes(i).ZOrderPosition) 
      Debug.Print "Background: " + CStr(objShapes(i).BackgroundStyle) 
     End If 

    Next i 

End Sub 

任何人都可以找到一种方法来告诉他们虽然VBA?提前致谢。

更新:

花几天,试图找出这个烂摊子后,我得出的结论是,这个神秘的文本框或者是一个陈旧腐朽的文本框或一些不正确地从其他进口软件。

基于这个前提,我使用Z顺序来分隔任何两个具有相同属性的文本框,在最近添加的文本框(具有较高Z顺序的文本框)为文本客户想要使用的框。

到目前为止,这已经解决了,这不是傻瓜式的,但这是我必须继续。一旦宏运行,所有文档都会被校对,因此应该捕获任何错误。

我仍然愿意接受其他建议,但我暂时还是会这样做。

回答

0

我终于(意外地)找到了缺少的文本框。它存在于第一页的页眉中。通过更改布局选项卡上的页面设置并检查“不同的第一页”可以看到

尽管此文档没有第一页标题,但文本和文本框仍然可以存在,并且在设置时不会被删除变化。

1

我没有Word 2007,所以无法在Word中查看它。但2007年的文件是zip文件。因此,将文件重命名为zip并将其作为文件夹打开。在Header2.xml和header3.xml中有一个称为MysteryTextBox的形状,它是二进制数据。只需进行备份并删除xml即可。

如果你想解码它,请看这里。 http://officeopenxml.com/drwShape.php

+0

谢谢,不过我正在试图通过VBA自动化这个过程并将它分发给其他人使用。当我收到文档时,该文本框可以被调用,我需要一种方法来区分VBA中隐藏的可见框。它给了我这个想法,以便为2个XML文件重新划分属性差异,所以我会尝试。 – Iridium52 2014-09-23 21:46:18

+0

建立文档的RTF格式。我有一些RTF知识和工具(但Word的RTF大多是乱码)。作为RTF,它可以加载到richtext文本框中,并通过文本对象模型(TOM)通过窗口或通过Rich Text Box的对象模型进行访问。 – Noodles 2014-09-23 22:20:23

+0

[这是一个RTF版本](https://www.dropbox.com/s/2z8temdycdyoatp/Mystery_Text_Box.rtf?dl=0)通过Dropbox的文件。谢谢。 – Iridium52 2014-09-23 23:38:46

2

这是一个奇怪的。它看起来像你的神秘文本框属于第一个页面标题(除了潜力之外,它并不存在于你的文档中)。

因此,要检查它,你可以试试:

ActiveDocument.Sections(1).Headers(wdHeaderFooterFirstPage).Shapes(2).Anchor.Information(wdHeaderFooterType) 

我不知道你会的信息做什么,但神秘的盒子具有值4(或第一页标题)而不是1(奇数页面标题)。请参阅此页以获取可能值的说明:http://www.rosetech.in/word_vba_category_document_informatoin.html

请注意,您需要检查定位点,而不是框本身(无论它位于标题中,它位于Textframe故事中)。

+0

是的,这是一个奇怪的。原始文件在第一个页面标题中包含两个文本框,当我缩小文档时,我没有更新代码。 – Iridium52 2014-09-26 15:28:27

+0

因此,您为两个框获得.anchor.information(wdHeaderFooterType)的相同值? – Christina 2014-09-26 18:48:16

+0

道歉,在原始文件中,两个文本框都位于第一页的页眉中,其值为4.我创建示例时必须更改文本框的位置。感谢您的输入。 – Iridium52 2014-09-30 13:26:55