【问题标题】:VBA Userforms Show the Same Userform again and againVBA 用户窗体一次又一次地显示相同的用户窗体
【发布时间】:2016-05-23 08:50:02
【问题描述】:

目前我正在编写一个 excel 宏。该宏显示一个用户窗体。 在用户窗体中,用户可以选择一些东西。在用户选择了一些东西后,我调用 Userform.Hide 来隐藏用户表单并从表单中读取选择。阅读选择后,我调用 Unload Userform。现在代码与选择进行交互。我想循环执行此操作,但是当代码第二次尝试显示用户窗体时。我收到表单已显示的异常。我无法理解,因为我调用了 Unload Userform。当我在调试模式下进行时,一切正常。

用户表单代码

Private Sub Image1_Click()
      SelectCard 1
End Sub

Private Sub Image2_Click()
      SelectCard 2
End Sub


Private Sub SelectCard(number As Integer)
    SelectedNumber = number
    Me.Hide
End Sub


Public Sub CardSelector_Activate(Cards As Cards)
  Dim c As card
  For Each Key In Cards.CardDictionary.Keys
      Set c = Cards.CardDictionary.Items(Key - 1)

      If c.value = 1 And c.played Then
         Image1.Enabled = False
      End If

      If c.value = 2 And c.played Then
         Image2.Enabled = False
      End If
  Next Key
  number = SelectedNumber
  CardSelector.Show
End Sub

ClassModule 中的代码我在循环中调用它

   Sub Costum(Spalte As Integer, Zeile As Integer, SpalteBeginn As Integer,   Cards As Cards, CardsOpponent As Cards)
        CardSelector.CardSelector_Activate Cards
        Dim c As card
        Dim number As Integer
        number = CardSelector.SelectedNumber
        Set c = Cards.CardDictionary.Items(CardSelector.SelectedNumber - 1)
        SetCardAsPlaced c, Zeile, Spalte, SpalteBeginn
        Unload CardSelector
    End Sub

有人可以帮我吗?

【问题讨论】:

  • 我们需要查看您的代码,以便我们知道发生了什么。
  • 我已将其添加到问题中
  • 你写了"I call Unload Userform",意思是说你要卸载的userform其实就是以"Userform"命名的?
  • 既然你说它在debug模式下可以完美运行,是不是代码跑得太快了?尝试在循环中再次调用用户表单之前插入SleepWait,仅用于测试目的。

标签: excel vba userform


【解决方案1】:

我不确定我是否完全理解您的问题,但这就是我使用 VBA 调用表单的方式。这是假设您有一个 CancelOK 按钮:

形式:

Option Explicit

Private m_ResultCode As VbMsgBoxResult

Private Sub btnCancel_Click()
    Call CloseWithResult(vbCancel)
End Sub

Private Sub btnOK_Click()
    ' Store form control values to member variables here. Then ...

    Call CloseWithResult(vbOK)
End Sub

Private Sub CloseWithResult(Value As VbMsgBoxResult)
    m_ResultCode = Value
    Me.Hide
End Sub

Public Function ShowMe(Optional bNewLayerOptions As Boolean = True) As VbMsgBoxResult
    ' Set Default to Cancel
    m_ResultCode = vbCancel
    ' Execution will pause here until the form is Closed or Unloaded
    Call Me.Show(vbModal)
    ' Return Result
    ShowMe = m_ResultCode
End Function

然后,调用它(请注意,frmLayers 是我自己的 VBA 表单对象 - 你可以使用你的):

Dim dlgLayers As New frmLayers

If (dlgLayers.ShowMe(False) = vbOK) Then
  ' Proceeed
End If

这对您的问题有帮助吗?如果我误解了我很抱歉,如果需要我会删除我的答案。

xxxxx_Activate 等是框架调用的事件处理程序。因此,例如,有一个用于激活的事件和一个用于初始化的事件。如果您正确设置代码,您通常不必自己直接调用这些。见https://support.microsoft.com/en-us/kb/138819

【讨论】:

  • frmLayers 是一个班级吗?你说的代码是 "In the form" 实际上在frmLayers 类代码窗格中吗?如果答案都是“是”,那么 Me.Hide 将不起作用,因为类中没有 Hide() 方法,Me.Show 也不会起作用,因为也没有 Show() 方法。你的代码是用 VB 代替 VBA 吗?
  • @user3598756 frmLayers 只是我自己的表单类。原始海报将其更改为他的表单的一个实例。对我来说,上面的代码适用于我编写的所有表单。 VBA。有一个Show方法,被ShowMe调用。
  • @user3598756 有一个Hide 方法。它被CloseWithResult调用。
猜你喜欢
  • 2017-06-15
  • 2019-03-13
  • 2019-07-23
  • 1970-01-01
  • 2012-03-07
  • 2017-05-08
  • 2014-02-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多