如何恢复被捕获超出Frame边缘的控件?

时间:2011-06-05 01:39:04

标签: excel vba excel-vba userform

这只影响Frames,我只在Excel 11中遇到过它,但由于它显然是一个bug,它可能已在以后的版本中修复过,我还没试过。如果你经常使用Frames,这最终会让你感到厌烦。

问题

从一个Frame和该Frame中包含的任何其他控件开始,让我们说一个Label。通过右边缘(交叉箭头)抓取标签并将其拖动到框架的左边框,直到您看到其虚线轮廓出现在框架外部。然后,在不释放鼠标的情况下,将其拖回边框,直到轮廓消失并在此时释放鼠标。

你会发现你的标签已经消失了。它被困在看不见的地方,不能被带回来。只是放大框架并没有显示出来。这与Frame的顶部边框完全相同,通过底部边框抓住Label以向上和向后拖动它。

它与底部和右侧框架边框的工作方式类似,但此处您可以通过放大框架来恢复标签。但是顶部和左边的边界不是这样。

缺少的标签可以标签化(它显示在“属性”下拉列表中),但这不会选择它,并且无法删除它,因为无法选择它。单击“属性”下拉列表中的“标签名称”不会执行任何操作。

如果你知道哪个框架吞下了标签(正如我们在此示例中所做的那样),而 if 你知道它所在框架的哪个边框,(因为我们在这个样本中),然后有一种方法来恢复丢失的标签。但很多时候情况并非如此。除非你真的看到Label消失了,否则当时很容易被忽视,特别是当Frames相互重叠时。

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

问题

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

然而,你的方法肯定让我走上正轨。我开始搜索它们包含框架之外的控件并冲洗它,但事实证明它们没有冲洗它,而是它们距离框架最远4个像素(取决于确切的位置)控制权被取消)。而且为了增加不正常性,在框架的顶部和左边框下消失的控件(我认为)总是在框架之外,但是在右边框和底部边框下消失的控件可以在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

答案 2 :(得分:0)

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