4

这仅影响 Frames,我只在 Excel 11 中遇到过它,但由于它显然是一个错误,它可能已在我没有尝试过的更高版本中修复。如果你经常使用 Frames,这最终会咬你一口。

问题

从 Frame 和该 Frame 中包含的任何其他控件开始,假设是 Label。抓住标签的右边缘(交叉箭头)并将其拖过框架的左边框,直到您看到它的虚线轮廓出现在框架之外。然后,在不释放鼠标的情况下,将其拖回边框,直到轮廓消失,然后在该点释放鼠标。

你会发现你的标签消失了。它被困在看不见的地方,无法带回来。只是放大框架不会显示它。这与 Frame 的顶部边框的工作方式完全相同,抓住标签的底部边框将其向上和向后拖动。

它与底部和右侧框架边框类似,除了在这里您可以通过放大框架来恢复标签。但顶部和左侧边框并非如此。

可以将缺少的标签添加到(它显示在“属性”下拉菜单中),但这不会选择它,也不能删除它,因为它不能被选择。单击“属性”下拉列表中的标签名称不会执行任何操作。

如果您知道哪个 Frame 吞下了 Label(就像我们在本示例中所做的那样),并且如果您知道它位于该 Frame 的哪个边框之下(就像我们在本示例中所做的那样),那么就有一种方法可以恢复丢失的 Label。但很多时候情况并非如此。除非你真的看到标签消失了,否则它很容易被忽视,尤其是当框架相互重叠时。

恢复标签的一种方法(从已知框架上的已知边框下)是使用 Stephen Bullen 的 VBE 工具,(即使不考虑这个问题,如果你没有安装这个美妙的插件,你应该)。单击框架(您知道隐藏某些内容)并从编辑菜单中选择全部(Ctrl+A对此不起作用)。然后按住Alt-right+ arrow(因为这里知道丢失的标签在 LH 边框下方)并观看标签从 Frame 边框下方尴尬地爬出。这比仅选择全部并将所有控件向右拖动要好,因为它允许您通过反转过程将所有其他控件替换到其原始位置(Alt-Left+ Arrow) 直到事情再次看起来正确。如果您需要将其他控件像素完美地恢复到其原始位置,只需计算右箭头的点击次数,处理恢复的标签,再次全选,然后进行相同次数的左箭头点击。

问题

1)如果我不知道它在哪个框架下,我如何找到并恢复和/或删除以这种方式被框架捕获的控件?

4

3 回答 3

3

您可以对表单运行一个简单的宏来发现(并删除、移动,随心所欲)隐藏的控件

Private Sub UserForm_Click()
    Dim ctrl As Control

    For Each ctrl In Me.Controls
        If ctrl.Left + ctrl.Width < 0 Or ctrl.Top + ctrl.Height < 0 Then
            Debug.Print ctrl.Name & " " & ctrl.Parent.Name
        End If
    Next
End Sub
于 2011-06-05T04:33:59.830 回答
0

@Chris,感谢您的回复,但我没有提到的是,在我的运行表单上,在任何给定时间,可能有 50-100 个控件已(暂时)移出它们的包含框架,而您的方法将找到所有这些。如果我总是知道丢失控件的名称,这仍然可以,而且大多数时候我会知道这一点,但并非总是如此。

但是,您的方法无疑使我走上了正确的道路。我开始搜索在其包含框架之外并与之齐平的控件,但事实证明它们并没有与它齐平,而是它们距框架最多 4 个像素(取决于确切位置控制被放弃)。而且只是为了增加反常性,在Frame的顶部和左侧边框下消失的控件(我认为)总是在Frame之外,但是在右侧和底部边框下消失的控件可以在内部0-4像素或在框架之外。真是丑。

所以,这似乎工作正常。

Dim ctrl As Control
For Each ctrl In Me.Controls
  With ctrl
    If typeName(.parent) = "Frame" then
       If .Left + .Width > -4 And .Left + .Width < 0 Then Debug.Print .Name & " " & .Parent.Name & " top border"
       If .Top + .Height > -4 And .Top + .Height < 0 Then Debug.Print .Name & " " & .Parent.Name & " left border"
       If .Left > .Parent.Width - 4 And .Left < .Parent.Width + 4 Then Debug.Print .Name & " " & .Parent.Name & " right border"  
       If .Top > .Parent.Height - 4 And .Top < .Parent.Height + 4 Then Debug.Print .Name & " " & .Parent.Name & " bottom border"
    End if
  End With
Next
于 2011-06-05T18:08:42.877 回答
0

解决这个问题的最简单方法: 1. 单击您认为失去控制的框架 2. 使用 Ctrl+A 选择所有控件 3. 将所有控件一起向下拖动(如果它在顶部边框上丢失)

于 2018-10-26T12:36:16.260 回答