MS Word中隐藏文本框的未知状态

时间:2014-09-23 21:05:56

标签: vba ms-word word-vba

我正在创建一组宏来清理和重新格式化特定的MS Word文档。当我遇到一个隐藏的文本框时,我开始循环浏览Word文档标题中的文本框,但是我在文档中找不到任何其他方法。

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

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

我创建了一个缩小版本的文档,只有神秘文本框和另一个常规文本框并上传了here on Dropbox,它在标题中有2个文本框,并且启用了宏以下功能代码:

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顺序分隔任何具有相同属性的2个文本框,其逻辑是最近添加的文本框(具有较高Z顺序的文本框)是文本框客户想要使用。

到目前为止,这已经成功了,但这不是万无一失的,但是我必须继续下去。一旦宏运行,所有文档都会被证明,因此应该捕获任何错误。

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

3 个答案:

答案 0 :(得分:2)

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

因此,要检查它,请尝试以下方法:

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

我不确定你将如何处理这些信息,但是神秘框的值为4(或第一页标题),而不是1(奇数页标题)。有关可能值的说明,请参阅此页面:http://www.rosetech.in/word_vba_category_document_informatoin.html

请注意,您检查了锚点,而不是框本身(无论文本框架中的文件位置如何,都在文本框架中。)

答案 1 :(得分:1)

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

如果要解码,请在此处查看。 http://officeopenxml.com/drwShape.php

答案 2 :(得分:0)

我终于(不小心)找到了丢失的文本框。它存在于第一页标题中。通过更改布局选项卡上的页面设置并选中“不同的第一页”

可以看到它

即使此文档没有第一页标题,文本和文本框仍然可以存在,并且在设置更改时不会被删除。