重新显示以前的Userform

时间:2015-03-06 15:14:05

标签: excel-vba userform private-methods vba excel

我有一系列将按顺序运行的用户表单,我需要一个可以重新显示以前用户表单的按钮,我已经尝试了下面的代码,但是它给出了一个错误,告诉我这个用户表单已经显示,我对如何完成这件事毫无头绪,这是代码:

Private Sub RETORNAR_Click()

Unload Me

' ETAPA_01 is the previous userform

ETAPA_01.Show

End Sub

1 个答案:

答案 0 :(得分:1)

很难从您提供的代码段中找出现有代码可能出现的问题。

虽然我怀疑混合物会给出最满意的解决方案,但我已经创造了两种方法来提供您所寻求的效果。

我创建了一个新工作簿,并在其中创建了六个用户表单:frmTest01frmTest06。在每个表单上,我创建了两个名为cmdBackcmdForward的命令按钮。我保存了工作簿并创建了两个副本。

对于版本A,表单之间的切换由表单外部的宏处理。每个用户表单的代码是:

Option Explicit
Private Sub cmdBack_Click()
  Direction = -1
  Unload Me
End Sub
Private Sub cmdForward_Click()
  Direction = 1
  Unload Me
End Sub

也就是说,两个退出例程在设置全局变量Direction之后卸载其表单,以指示用户是想要移回到上一个表单还是前进到下一个表单。所有复杂性都在调用宏中,即:

Option Explicit
  Public Direction As Long
Sub CtrlForms()

  Dim FormCrnt As Long

  FormCrnt = 0

  Do While True

    Select Case FormCrnt
      Case 0
        FormCrnt = FormCrnt + 1
        Load frmTest01
        frmTest01.Show
      Case 1
        If Direction = 1 Then
          FormCrnt = FormCrnt + 1
          Load frmTest02
          frmTest02.Show
        Else
          Exit Sub
        End If
      Case 2
        If Direction = 1 Then
          FormCrnt = FormCrnt + 1
          Load frmTest03
          frmTest03.Show
        Else
          FormCrnt = FormCrnt - 1
          Load frmTest01
          frmTest01.Show
        End If
      Case 3
        If Direction = 1 Then
          FormCrnt = FormCrnt + 1
          Load frmTest04
          frmTest04.Show
        Else
          FormCrnt = FormCrnt - 1
          Load frmTest02
          frmTest02.Show
        End If
      Case 4
        If Direction = 1 Then
          FormCrnt = FormCrnt + 1
          Load frmTest05
          frmTest05.Show
        Else
          FormCrnt = FormCrnt - 1
          Load frmTest03
          frmTest03.Show
        End If
      Case 5
        If Direction = 1 Then
          FormCrnt = FormCrnt + 1
          Load frmTest06
          frmTest06.Show
        Else
          FormCrnt = FormCrnt - 1
          Load frmTest04
          frmTest04.Show
        End If
      Case 6
        If Direction = 1 Then
          Exit Sub
        Else
          FormCrnt = FormCrnt - 1
          Load frmTest05
          frmTest05.Show
        End If
    End Select

  Loop

End Sub

来自frmTest01的方向-1和来自frmTest06的方向+1,导致退出宏。在所有其他情况下,将加载并显示相应的用户表单。

对于方法B,复杂性在用户表单中。这里的调用宏是:

Option Explicit
Sub CtrlForms()

  Load frmTest01
  Load frmTest02
  Load frmTest03
  Load frmTest04
  Load frmTest05
  Load frmTest06

  frmTest01.Show

  Unload frmTest01
  Unload frmTest02
  Unload frmTest03
  Unload frmTest04
  Unload frmTest05
  Unload frmTest06

End Sub

也就是说,这个宏只负责加载和卸载表单并显示第一个。

每种表格的代码:

frmUser01

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
End Sub
Private Sub cmdForward_Click()
  Me.Hide
  frmTest02.Show
End Sub

frmUser02

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
  frmTest01.Show
End Sub
Private Sub cmdForward_Click()
  Me.Hide
  frmTest03.Show
End Sub

frmUser03

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
  frmTest02.Show
End Sub
Private Sub cmdForward_Click()
  Me.Hide
  frmTest04.Show
End Sub

frmUser04

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
  frmTest03.Show
End Sub
Private Sub cmdForward_Click()
  Me.Hide
  frmTest05.Show
End Sub

frmUser05

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
  frmTest04.Show
End Sub
Private Sub cmdForward_Click()
  Me.Hide
  frmTest06.Show
End Sub

frmUser06

Option Explicit
Private Sub cmdBack_Click()
  Me.Hide
  frmTest05.Show
End Sub
Private Sub cmdForward_Click()
   Me.Hide
End Sub

frmTest01返回并从frmTest06向前隐藏其表单并退回到控制宏。所有其他人都隐藏他们的表格并显示下一个表格。

这两种方法都可以实现您所寻求的控制。

我怀疑最好的方法是在开头加载所有表单并在最后卸载所有表单,隐藏旧表单并在处理过程中显示新的而不是卸载和加载。我更喜欢本地化流控制,所以我会使用方法A中的Select语句但没有负载。