如果选择在表中并且选择很大,则Word VBA Font.Hidden属性变得不可读

时间:2017-10-12 23:27:46

标签: vba fonts properties word-vba hidden

这很容易复制....请按照我的步骤使用MS Word。

在Word文件中,创建一个相当大的表(大约五列二十行)。使用一些垃圾文本填充所有单元格。 或者,在您已有的文件中选择“大小合适”的表格。

  1. 选择(或“突出显示”)表格的几行,例如三行。
  2. 转到Word功能区的“字体”部分。注意隐藏 选择的属性显示为“未选中”,表示 可见。这是你期望看到的(现在)。
  3. 或者,也可以转到VB编辑器的立即窗口 输入“?Selection.Range.Font.Hidden”。 Word将响应“0”,意思是 .Hidden属性为false。这是另一种验证方法 你在第2步中看到了。
  4. 现在选择附加表格的几行。转到步骤2并重复。
  5. 当您的选择达到大约12行时(结果可能会有所不同),隐藏复选框会显示一个实心块以指示“混合隐藏”,并且“?Selection.Range.Font.Hidden”显示9999999表示'未定义'状态。

    当选择在表格中且选择相对多的行时,.Hidden属性变得不可靠/不可读的原因是什么?在非表中选择时不会发生这种情况。这搞乱了我的一个非常好的程序。

2 个答案:

答案 0 :(得分:0)

对于它的价值,这不是特定于表格;在具有51个空白(但在其他方面相同)段落的文档中发生完全相同的事情。如果您选择50个段落,则可以获得以下实际结果:

?selection.Range.Paragraphs.Count  ' just to confirm the selection
?selection.Font.name
?selection.Range.Font.Hidden

但是一旦你选择第51段,事情就会失去定义,可以这么说。

我想,逐行循环遍历你的表(正如@jsotola所建议的那样)将是一个很好的解决方法。

要回答关于为什么会发生这种情况的问题,那么MS之外最好的人(我认为)就是推测。如果我推测我会建议在处理或存储这么多段落的详细信息时存在某种内部限制或限制。这是一个错误,我想是这样(但这只是恕我直言)。

替换有缺陷的内置功能的功能

将返回True,False或wdUndefined(9999999)的函数示例,具体取决于字体是隐藏的,可见的还是隐藏的和混合的。可见(即未定义),分别为。

请注意,wdUndefined完全有可能是一个有效的结果,因为否则可见的段落可能有一个字体隐藏的单个字符,因此该段落的字体既不是完全可见的,也不是隐藏的 - 所以它是'undefined' - 因此wdUndefined非常有效。

示例用法和输出:

?selection.Paragraphs.Count
 2016 

?fontIsHidden '(automatically operates on the active selection)
 False

功能:

' Put this code into a STANDARD module
Function fontIsHidden() As Variant ' Variant to return True, False, wdUndefined
    Dim paraSelected As Paragraph
    Dim NotFirstPara As Boolean
    Dim result As String

    For Each paraSelected In Selection.Range.Paragraphs
        ' This could be done with Table.Rows instead of Paragraps
        ' (but would error if there was no table)
        If NotFirstPara Then
            If paraSelected.Previous.Range.Font.Hidden <> paraSelected.Range.Font.Hidden Then
                result = wdUndefined ' this para is different to the previous paras
                Exit For
            End If
        Else
            ' Setup for the first paragraph
            Select Case paraSelected.Range.Font.Hidden
                Case False ' 0
                    result = False

                Case True ' -1
                    result = True

                Case wdUndefined
                    result = "Undefined" ' some text in the para is visible and some is hidden

            End Select

            NotFirstPara = True
        End If

    Next paraSelected

    fontIsHidden = result

End Function

答案 1 :(得分:0)

感谢所有对MS Word中的这个错误感到困惑的人。我的解决方法如下。我假设选择的隐藏性(或选择的其他属性,如.Font或.Underline)是&#34; uniform&#34; ...我可以尝试读取前10个字符的属性而不是整个选择,并仍然得到正确的答案。如果您不知道您的整个选择与您选择的前10个字符具有相同的属性,则此解决方案无法帮助您。

Function DigDeeperInto(fullSelection As Selection) As String
' This returns the truth of the hidden-ness of the *front end* of a Selection.
' This is used because Word sometimes mis-reads the hidden-ness of a whole Selection.
   Dim shortRange As Range ' will hold the just the front end of the full Selection
   Dim theTruth As String
   Set shortRange = fullSelection.Range
   shortRange.SetRange Start:=shortRange.Start + 1, End:=shortRange.Start + 10
   If shortRange.Font.Hidden = wdUndefined Then theTruth = "UnDef" ' this Function failed
   If shortRange.Font.Hidden = 0 Then theTruth = "Visible"
   If shortRange.Font.Hidden = -1 Then theTruth = "Hidden"
   DigDeeperInto = theTruth
End Function

选择一个Selection后,如果没有正确报告Selection.Font.Hidden,我会调用DigDeeperInto(Selection)函数。它只查看前10个字符并返回一个字符串&#34; Visible&#34;,&#34; Hidden&#34;或&#34; UnDef&#34;。如果它仍然返回&#34; UnDef&#34; (幸运的是,这不会发生在我身上),这表明DigDeeperInto()未能解决问题。