4

これはフレームのみに影響し、Excel 11 でのみ発生しましたが、明らかにバグであるため、試していない新しいバージョンで修正されている可能性があります。フレームを頻繁に使用すると、最終的に噛み付きます。

問題

フレームと、そのフレームに含まれるその他のコントロール (ラベルとしましょう) から始めます。ラベルの右端 (交差矢印) をつかみ、破線のアウトラインがフレームの外側に表示されるまで、フレームの左端を横切ってドラッグします。次に、マウスを放さずに、アウトラインが消えるまで境界に向かってドラッグし、その時点でマウスを放します。

ラベルが消えていることがわかります。見えないところに閉じ込められており、元に戻すことはできません。フレームを拡大するだけでは表示されません。これは Frame の上部境界線とまったく同じように機能し、Label の下部境界線をつかんで上下にドラッグします。

ここでは、フレームを拡大することでラベルを復元できることを除いて、フレームの下部と右側の境界線と同様に機能します。しかし、上と左の境界ではそうではありません。

欠落しているラベルはタブで移動できますが ([プロパティ] ドロップダウンに表示されます)、これでは選択されず、選択できないため削除できません。[プロパティ] ドロップダウンでラベル名をクリックしても何も起こりません。

どの Frame が Label を飲み込んでいるか (このサンプルで行っているように) がわかっている場合、およびそのFrame の下にある境界線が (このサンプルで行っているように) わかっている場合は、欠落している Label を復元する方法がありますしかし、多くの場合、そうではありません。ラベルが消えるのを実際に見ない限り、特にフレームが互いに重なっている場合は、その時点で簡単に気付かないことがあります。

(既知のフレームの既知の境界線の下から) ラベルを復元する 1 つの方法は、Stephen Bullen の VBE ツールを使用することです (この問題に関係なく、この素晴らしいアドインがインストールされていない場合は、そうする必要があります)。フレーム (何かを隠していることがわかっている) を 1 回クリックし、[編集] メニューから [すべてを選択] ( Ctrl+Aは機能しません)。次にAlt-right+を押したままにしてarrow(ここでは、欠落しているラベルが左側の境界線の下にあることがわかっているため)、ラベルがフレームの境界線の下からひそかに這い上がるのを確認します。これは、プロセスを逆にするだけで他のすべてのコントロールを元の位置に置き換えることができるため、単にすべてを選択してすべてのコントロールを右にドラッグするよりも優れています ( 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 ピクセル離れていることがわかりました (正確にどこにあるかによって異なります)。コントロールはドロップされました)。そして、ひねくれを加えるために、フレームの上下の境界線の下に消えたコントロールは(私が思うに)常にフレームの外側にありますが、右と下の境界線の下に消えたコントロールは内側の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 に答える