从Module关闭UserForm

时间:2014-11-12 13:16:57

标签: vba excel-vba excel

我正在尝试从模块中关闭用户表单,但它无效。

这是我试过的

Sub UpdateSheetButton()
    Dim subStr1 As String
    Dim subSrrt2() As String
    Dim tmp As Integer
    Dim pos As Integer

    Dim Form As WaitMessage
    Set Form = New WaitMessage

    With Form
        .Message_wait = Module2.Label_PleaseWait  
        .Show
    End With

    For Each Cell In ActiveSheet.UsedRange.Cells
        subStr1 = RemoveTextBetween(Cell.formula, "'C:\", "\AddIns\XL-EZ Addin.xla'!")
        tmp = Len(subStr1) < 1
        If tmp >= 0 Then
            Cell.formula = subStr1
            status = True
        End If
    Next

    Unload Form

    MsgBox Module2.Label_ProcessComplete

End Sub

表单名称为WaitMessage

我也试过了WaitMessage.Hide,但它也没有用。

4 个答案:

答案 0 :(得分:1)

考虑无模式窗体,在userform中创建一个子例程:

Sub UnloadThisForm ()
    unload me
End Sub

并从userform外部调用sub;

call Userform1.UnloadThisForm

答案 1 :(得分:0)

用户形态本身就是一个对象,您不需要声明或设置为变量。此外,当您使用.Show方法时,默认情况下它会将Modal属性设置为True,这将暂停代码执行,直到用户以某种方式进行交互(即关闭表单)。

您可以通过在.Show方法之后使用布尔声明来指定是否要以模态显示用户窗体。

请改为尝试:

Sub UpdateSheetButton()
Dim subStr1 As String
Dim subSrrt2() As String
Dim tmp As Integer
Dim pos As Integer

With WaitMessage
    .Message_wait = Module2.Label_PleaseWait
    .Show False
End With

For Each Cell In ActiveSheet.UsedRange.Cells
    subStr1 = RemoveTextBetween(Cell.Formula, "'C:\", "\AddIns\XL-EZ Addin.xla'!")
    tmp = Len(subStr1) < 1
    If tmp >= 0 Then
        Cell.Formula = subStr1
        Status = True
    End If
Next

Unload WaitMessage

MsgBox Module2.Label_ProcessComplete

End Sub

答案 2 :(得分:0)

另一种可能性是将您的代码置于 ClassModule 并使用事件来回调WaitMessage用户表单。这里简短的例子。 HTH

  

标准模块创建表单和更新程序对象,并显示开始处理的表单:

Public Sub Main()
    Dim myUpdater As Updater
    Dim myRange As Range
    Dim myWaitMessage As WaitMessage

    Set myRange = ActiveSheet.UsedRange.Cells
    Set myUpdater = New Updater
    Set myUpdater.SourceRange = myRange

    ' create and initialize the form
    Set myWaitMessage = New WaitMessage

    With myWaitMessage
        .Caption = "Wait message"
        Set .UpdaterObject = myUpdater
        ' ... etc.
        .Show
    End With

    MsgBox "Module2.Label_ProcessComplete"
End Sub
  

类模块包含受监视的方法,并且具有在进度更新或完成时引发的事件。如果某些信息发送到表单,这里是已处理单元格的数量,但它可以是其他任何信息:

Public Event Updated(updatedCellsCount As Long)
Public Event Finished()
Public CancelProcess As Boolean
Public SourceRange As Range

Public Sub UpdateSheetButton()
    Dim subStr1 As String
    Dim subSrrt2() As String
    Dim tmp As Integer
    Dim pos As Integer
    Dim changesCount As Long
    Dim myCell As Range
    Dim Status

    ' process task and call back to form via event and update it
    For Each myCell In SourceRange.Cells

        ' check CancelProcess variable which is set by the form cancel-process button
        If CancelProcess Then _
            Exit For

        subStr1 = "" ' RemoveTextBetween(Cell.Formula, "'C:\", "\AddIns\XL-EZ Addin.xla'!")
        tmp = Len(subStr1) < 1
        If tmp >= 0 Then
            myCell.Formula = subStr1
            Status = True
        End If

        changesCount = changesCount + 1
        RaiseEvent Updated(changesCount)

        DoEvents
    Next

    RaiseEvent Finished
End Sub
  

用户表单具有使用&#39; WithEvent&#39;声明的更新程序类的实例关键字并处理它的事件。此处表单会更新“更新”标签。事件并在&#39;完成&#39;卸载自己事件:

Public WithEvents UpdaterObject As Updater

Private Sub UpdaterObject_Finished()
    Unload Me
End Sub

Private Sub UpdaterObject_Updated(updatedCellsCount As Long)
    progressLabel.Caption = updatedCellsCount
End Sub

Private Sub UserForm_Activate()
    UpdaterObject.UpdateSheetButton
End Sub

Private Sub cancelButton_Click()
    UpdaterObject.CancelProcess = True
End Sub

enter image description here

答案 3 :(得分:0)

我猜你可以自己完成screenupdating和enableevents,所以这里是:

(下次为你要做的事情添加更多描述,而不只是发布代码......)

Option Explicit 'might help to avoid future miss declaring of variables...

Sub UpdateSheetButton()
Dim subStr1 As String
'Dim subSrrt2() As String 'not used in shown code !
'Dim tmp As Integer
Dim pos As Long
Dim Cell as Range 'you forgot to declare this

Dim Form As object
Set Form = New WaitMessage

load Form
With Form
    .Message_wait = Module2.Label_PleaseWait  
    .Show false 'if you ommit false, the code won't continue from this point unless the Form is closed !
End With

For Each Cell In ActiveSheet.UsedRange.Cells
    subStr1 = RemoveTextBetween(Cell.formula, "'C:\", "\AddIns\XL-EZ Addin.xla'!")
    'tmp = Len(subStr1) < 1 'might replace with a boolean (true/false, instead 0/-1)
    'If tmp >= 0 Then 'you don't use tmp later, so i guess its just using variables without need
     if substr1<>"" then 'why use a cannon to put a nail in a wall?, go to the point
        Cell.formula = subStr1
        pos = pos+1 'you declared pos but didn't use it !?
        Form.SomeTextbox.caption = pos 'or other counter
        'can also use the .width property of a button or picture... to make a progression bar.
        status = True 'Status is not declared , and not used elsewhere , so what ?!
    End If
Next

Unload Form
set Form = Nothing

MsgBox Module2.Label_ProcessComplete

End Sub