如何恢复被困在Frame边缘以外的控件?

这只影响框架,我只在Excel 11中遇到它,但由于它显然是一个错误,它可能已经修复了以后的版本,我还没有尝试过。 如果你使用Frames很多,这最终会咬你。

问题

从框架和其他任何包含在该框架中的控件开始,让我们来说一个标签。 通过右边缘(横向箭头)抓住标签并将其拖过框架的左边框,直到您看到其虚线轮廓出现在框架外部。 然后,不释放鼠标,将其拖回边界,直到轮廓刚刚消失,然后释放鼠标。

你会发现你的标签已经消失。 它被困在某个不可见的地方,不能被带回来。 只是放大框架不显示它。 这与框架顶部边框的工作方式完全相同,从底部边框抓取标签,将其向上和向后拖动。

它的工作原理与底部和右侧的框架边界类似,除了在这里您可以通过放大框架来恢复标签。 但是顶部和左边界不是这样。

缺less的标签可以选项卡(它显示在属性下拉列表中),但是这不会被选中,并且不能被删除,因为它不能被选中。 在“属性”下拉列表中单击标签名称也不会执行任何操作。

如果你知道哪个Frame已经吞下了标签(就像我们在这个例子中所做的那样),并且如果你知道那个Frame的哪个边框(就像我们在这个例子中做的那样),那么就有办法恢复丢失的Label。 但是很多时候情况并非如此。 除非你真的看到标签消失,否则当时很容易被忽视,特别是当帧相互重叠时。

一种方法来恢复标签(从一个已知的框架下的已知边界)是使用斯蒂芬布伦的VBE工具,(甚至没有考虑到这个问题,如果你没有安装这个美好的Addin,你应该)。 点击框架(你知道隐藏的东西)和编辑菜单中的全选( Ctrl + A不适用于此)。 然后按住Alt + right + 箭头 (因为这里知道丢失的标签在LH边界之下),并且看着标签从框架边界下面偷偷溜走。 这比仅select全部并将所有控件拖到右侧更好,因为它可以让您将所有其他控件replace为原始位置,方法是颠倒过程( Alt-Left + Arrow ),直到事情再次正确。 如果您需要将其他控件的像素完美恢复到其原始位置,只需计算右箭头的点击次数,处理恢复的标签,再次select全部,并使相同数量的左箭头单击。

这个问题

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

您可以对表单运行一个简单的macros来发现(以及删除,移动,任何你喜欢的)隐藏的控件

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 

@Chris,谢谢你的回应,但我没有提到的是,在我的跑步forms上,在任何给定的时间,可能有50到100个控件被移动(暂时)在它们的包含框之外,你的方法会find所有这些。 如果我一直知道失踪控制的名字,这仍然可以,大部分时间我都会知道,但并不总是这样。

不过,你的方法绝对让我走上正轨。 我开始寻找包含在框架之外的控件,然后alignment它,然而事实certificate,它们并没有alignment它,而是距离框架最远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