2011-06-05 70 views
2

這隻會影響框架,我只在Excel 11中遇到它,但是由於它顯然是一個錯誤,它可能已經在我未嘗試的更高版本中修復。如果你使用Frames很多,這會最終咬你。如何恢復被困在框架邊緣之外的控件?

的問題

開始與框架和包含在框架的任何其他控制,比方說,一個標籤。通過右邊緣(橫向箭頭)抓住標籤,並將其拖過框架的左邊框,直到您看到框架外部出現其虛線輪廓。然後,不釋放鼠標,將其拖回邊界,直到輪廓剛剛消失,然後釋放鼠標。

你會發現你的標籤已經消失。它被困在不可見的地方,不能被帶回。只是放大框架不顯示它。這與框架的頂部邊框完全相同,抓住標籤的下邊框將其向上和向後拖動。

它與底部和右側邊框的工作方式類似,除了這裏您可以通過放大框架來恢復標籤。但是頂部和左邊界不是這樣。

缺少的標籤可以選項卡(它顯示在屬性下拉列表中),但是這不會選中它,並且它不能被刪除,因爲它不能被選中。在「屬性」下拉列表中單擊標籤名稱不會執行任何操作。

如果你知道哪些幀吞下了標籤(如我們在此示例中做的),和如果你知道這是哪個該幀的下邊框,(我們在此示例中那樣),則有一種方法來恢復丟失的標籤。但很多時候情況並非如此。除非你真的看到標籤消失,否則當時很容易被忽視,特別是當幀相互重疊時。

恢復標籤的一種方法是從Stephen Bullen的VBE工具中下載(甚至不考慮這個問題,如果你沒有安裝這個美妙的Addin,你應該)。點擊框架(你知道隱藏的東西)和編輯菜單中的全選(Ctrl + A不適用於此)。然後按住Alt-right + 箭頭(因爲這裏已知缺少的Label位於LH邊界之下),並且看着標籤從框架邊界下方勉強爬出。這比僅僅選擇全部並將所有控件拖到右側更好,因爲它可以讓您通過顛倒過程(Alt-Left + 箭頭)將所有其他控件替換爲其原始位置,直到事物看起來正確再次。如果您需要將其他控件的像素完美恢復到原始位置,只需計算右箭頭單擊次數,處理恢復的標籤,再次選擇全部,並進行相同數量的左箭頭單擊。

問題

1)如何找到並恢復和/或刪除在這種方式捕獲由一個框架,如果我不知道這是根據該框架不控制?

+0

我可以證實這個問題。 – 2011-06-05 01:56:03

回答

0

@克里斯,感謝您的答覆,但有些事我並沒有提是在我的跑步形式上,在任何給定的時間,可能有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 
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 
相關問題