如何将两个平铺模态窗体移动到一起?

时间:2014-04-22 04:13:08

标签: excel-vba vba excel

我有两个模态用户表单,frmA和frmB。我想平铺表格,当我移动顶部表格时,我希望另一个表格跟随它,保持在平铺位置,好像它们被绑在一起。

FrmA有一个打开frmB的按钮。 当frmB打开时,它处于活动状态,用户与之交互,而frmA可见,但用户无法移动或访问。这都是预期的。

'This is part of the frmA command button to open frmB
'Load, Initialize and Show form B. Send coordinates of form A
        Set formB = New frmB
        Load formB
        Dim iA_Left As Integer
        Dim iA_Top As Integer
        iA_Left = Me.Left
        iA_Top = Me.Top
        ' Initialize formB and pass current position of formA byRef (used by activate event)
        If Not formB.bInitialize(vbFalse, , , iA_Top, iA_Left) Then Err.Raise glHANDLED_ERROR
        If iA_Top <> -1 Then
            miA_Top = iA_Top
        End If
        If iA_Left <> -1 Then
            miA_Left = iA_Left
        End If
        formB.Show

我已经想出如何使用userform Activate事件来平滑frmB over frmA(稍微向下和向右)。然后当frmB关闭时,我将frmA的原始左侧和顶部传回,以便在重新初始化后,它将显示在其原始位置。

' This is from frmB Activate event
' The variables miA_Left and miA_Top are set in Initialize event via optional variables
'   passed from the code above.
Private Sub UserForm_Activate()
    On Error Resume Next
        If miA_Left <> -1 Then
            Me.Left = miA_Left + 15
        End If
        If miA_Top <> -1 Then
            Me.Top = miA_Top + 15
        Else
            Me.Top = Round((Application.Top + Application.Height) / 2 - Me.Height / 2, 0)
        End If
End Sub


' This is from frmB Layout Event
Private Sub UserForm_Layout()
    Debug.Print "Layout Left " & Me.Left
    If miA_Left <> -1 And miA_Top <> -1 Then ' In this case, it's true and proceeds to next line
        frmA.Left = Me.Left - 10
        frmA.Top = Me.Top - 10
    End If
End Sub

当我调试Layout事件时,在第一次分配之前我将光标放在frmA.Top上并且它说“对象变量未设置”但是它继续将数字分配给frmA.Left而没有错误。但是,它不会改变frmA的位置。表单类的名称实际上是frmA,但是当我创建一个变量来生成表单时,我使用了

Dim formA as frmA
Set formA = New frmA 

但是,formA不在frmB的范围内,所以我认为我不能引用该变量。

我需要做的是当用户拖动frmB时,我希望frmA跟随它,保持平铺。当frmB处于活动状态时,我无法弄清楚如何改变.Top和.Left of frmA。我在frmB的Activate和Layout事件中尝试了各种语句,但我不确定如何直接从frmB访问frmA。

谢谢!

1 个答案:

答案 0 :(得分:1)

您可以使用表单B的Layout事件来更改表单A的位置。

类似的东西(假设形式A称为frmA

Private Sub UserForm_Layout()
    frmA.Top = Me.Top - 15
    frmA.Left = Me.Left - 15

End Sub

更新'正常'使用表单

正如您在评论中暗示的那样,当您想要显示多个实例时,使用表单实例非常有用。 “正常”方法只是引用基本表单类名本身 例如,如果我们有两个表单:frmAfrmBfrmA包含一个命令按钮而frmB不包含任何控件,我们可以按如下方式演示平铺代码(下面的代码)是所提到的模块的全部内容)

' Code in a standard Module, to show frmA
Option Explicit

Sub Demo()
    frmA.Show vbModal
End Sub

' Code in frmA
Option Explicit

Private Sub CommandButton1_Click()
    frmB.Show vbModal
End Sub

' Code in frmB
Option Explicit

Private Sub UserForm_Activate()
    frmB.Top = Me.Top + 15
    frmB.Left = Me.Left + 15
End Sub

Private Sub UserForm_Layout()
    frmA.Top = Me.Top - 15
    frmA.Left = Me.Left - 15
End Sub