取消按钮进行选择而不是取消

时间:2017-08-23 12:34:02

标签: vba button outlook-vba userform

我在名为Select_Email_Template的Outlook用户窗体后面使用以下代码。

Private Sub UserForm_Initialize()
  With ComboBox1
    .AddItem "Account Amendment Non SC"
    .AddItem "Account Amendment SC Application Received"
    .AddItem "Account Amendment SC"
    .AddItem "Account Creation Non SC"
    .AddItem "Account Creation SC Application Received"
    .AddItem "Account Creation SC"
    .AddItem "Export Function"
    .AddItem "Password Reset"
  End With
End Sub

Private Sub btnOK_Click()
    lstNum = ComboBox1.ListIndex
    Unload Me
End Sub

Private Sub btnCancel_Click()
    Unload Select_Email_Template
End Sub

ComboBox允许用户选择电子邮件模板。选择一个并单击确定后,将在Outlook中打开模板。

这是打开模板的代码:

Public lstNum As Long

Public Sub Email_Templates()

    Dim outMail As Outlook.MailItem

    Select_Email_Template.Show

    Select Case lstNum

    ' Following the listbox entries


    Case 0
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment Non SC.oft")

    Case 1
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment SC Application Received.oft")

    Case 2
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment SC.oft")

    Case 3
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Creation Non SC.oft")

    Case 4
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Creation SC Application Received.oft")

    Case 5
        Set outMail = CreateItemFromTemplate("TemplatePath\Account Creation SC.oft")

    Case 6
        Set outMail = CreateItemFromTemplate("TemplatePath\Export Function.oft")

    Case 7
        Set outMail = CreateItemFromTemplate("TemplatePath\Export Function.oft")

    End Select

    ' Use for a specific purpose not randomly
    ' On Error Resume Next

    With outMail
        .Display
    End With

    ' On Error GoTo 0

cleanup:
        Set outMail = Nothing

  End Sub

当用户点击取消时,表单会关闭,但列表中的第一个模板会在Outlook中打开。

如何在没有同时打开第一个模板的情况下关闭表单?

3 个答案:

答案 0 :(得分:3)

虽然 可以通过使用全局变量来解决问题,但更简洁的解决方案是使用UserForm.Tag属性将结果传递回主过程。

请注意,卸载UserForm也会删除标记值,因此您需要在单击处理程序中隐藏 UserForm,使用主过程中的标记值,然后 卸载UserForm。

Select_Email_Template UserForm代码:

Private Sub UserForm_Initialize()

  Dim varTemplateName As Variant

  With ComboBox1
    For Each varTemplateName In Templates(NameOnly:=True) ' Templates() also works
      .AddItem varTemplateName
    Next
  End With

End Sub

Private Sub btnOK_Click()
  Me.Tag = Me.ComboBox1.ListIndex
  Me.Hide
End Sub

Private Sub btnCancel_Click()
  Me.Tag = -1
  Me.Hide
End Sub

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)
  If CloseMode = VBA.VbQueryClose.vbFormControlMenu Then
    Cancel = True
    btnCancel_Click
  End If
End Sub

非班级模块代码:

Public Sub Email_Templates()
  With Select_Email_Template
    .Show
    If .Tag <> -1 Then
      CreateItemFromTemplate(Templates(.Tag, FullPath:=True)).Display ' Templates(.Tag) also works
    End If
  End With
  Unload Select_Email_Template
End Sub

Public Function Templates _
                ( _
                  Optional ByVal plngIndex As Long = -1 _
                , Optional ByVal NameOnly As Boolean = False _
                , Optional ByVal FullPath As Boolean = False _
                ) _
       As Variant

  Const strcTemplatesDir As String = "<TemplatesPath>\"
  Const strcTemplateExtension As String = ".oft"

  Static avarTemplateNames As Variant

  If IsEmpty(avarTemplateNames) Then
    avarTemplateNames = Array _
    ( _
      "Account Amendment Non SC" _
    , "Account Amendment SC Application Received" _
    , "Account Amendment SC" _
    , "Account Creation Non SC" _
    , "Account Creation SC Application Received" _
    , "Account Creation SC" _
    , "Export Function" _
    , "Export Function" _
    )
  End If
  If plngIndex <> -1 Then
    If NameOnly = True And FullPath = False Then
      Templates = avarTemplateNames(plngIndex)
    Else
      Templates = strcTemplatesDir & avarTemplateNames(plngIndex) & strcTemplateExtension
    End If
  Else
    Templates = avarTemplateNames
  End If

End Function

<强>解释

这里的主要想法是当用户点击取消并且当用户点击有效索引(在您的示例中为0到7)时,通过Select_Email_Template.Tag属性返回-1点击确定

代码还重定向 ALT + F4 ,单击关闭框(及其键盘快捷键等效 ALT + SPC ; C )以及关闭UserForm的任何其他方法,取消按钮的点击处理程序。

我也冒昧地重构你的代码,所以所有的模板数据只在一个地方宣布一次,即在Templates()函数中宣布。

我在这个函数中使用了一个静态变量,因此数组只被初始化一次。你可以用Dim声明它并跳过空检查它仍然可以正常工作。

  

注意:如果您对我的变量命名约定感到好奇,那么它基于RVBA

答案 1 :(得分:2)

@IRHM我已经有以下工作正常工作了。我已经使用MsgBoxes进行测试,并测试了每个选项。试试吧。一旦看起来它正在为你工作,注释掉或删除不必要的东西,更改变量名称,你应该好好去。

Sub Email_Templates()
Dim ComboBox1
Dim intCount As Integer
Dim intSelectedIndex As Integer
Dim myNum As Integer

'Dim outMail As Outlook.MailItem

Userform1.Show

myNum = Userform1.ComboBox1.ListIndex

If myNum = 0 Then
  Goto Abort
Else

MsgBox ("Back to the main module")

 Select Case myNum

 Case 1
    'Using MsgBox to test and make sure it's working
    MsgBox "You selected Account Amendment Non SC - Option 1"
    'Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment Non SC.oft")

Case 2
    MsgBox "You selected Account Amendment SC Application Received - Option 2"
    'Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment SC Application Received.oft")

Case 3
    MsgBox "You Selected Account Amendment SC - Option 3"
    'Set outMail = CreateItemFromTemplate("TemplatePath\Account Amendment SC.oft")
End Select
Abort:
 End If
 Unload UserForm1
End Sub

将以下行放在UserForm代码模块中:

Sub btnCancel_Click()
  MsgBox ("Cancel button selected")
  Unload Me
End Sub

Sub btnOK_Click()
  MsgBox ("OK Selected")
  Me.Hide
End Sub

Sub UserForm_Initialize()
'Put all your AddItems here
  With ComboBox1
    .Clear
    .AddItem "This should exit", 0
    .AddItem "Selection 1", 1
    .AddItem "Selection 2", 2
    .AddItem "Selection 3", 3
  End With
End Sub    

答案 2 :(得分:2)

全局变量lstnum最初为0.因为您使用lstnum作为Select触发器使其为-1,以符合标准。

Outlook Form To Select Email Template

Case -1
'  -1 is what you want to use if nothing is selected

按照您使用的方法从userform返回选项。

Private Sub btnCancel_Click()
    lstNum = -1
    Unload Select_Email_Template
End Sub