2017-08-23 31 views
4

我在名为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。

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

回答

2

虽然它可以通过使用全局变量来解决这个问题,一个非常巧妙的解决办法是使用UserForm.Tag属性将结果传递回主过程。

注意,卸载窗体还删除标记值,所以你需要隐藏在单击处理用户窗体,在主过程中使用的标记值,然后卸载用户窗体。

Select_Email_Template用户窗体代码:

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 

说明:

这里的主要思想是返回,通过Select_Email_Template.Tag性质, -1当用户点击取消和一个当用户点击OK时,有效索引(在您的示例中为0到7)。

该代码还重定向ALT + F4,点击关闭框(和它的键盘快捷键等效ALT + SPC; Ç),并关闭窗体到的任何其它方法取消按钮的点击处理程序。

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

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


注意:如果您想了解我的变量命名约定,它是基于RVBA

+0

嗨@robinCTS,非常感谢你把它们放在一起并进行解释。它完美的作品。 非常感谢和亲切的问候 – IRHM

1

@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 

把下面的行用户窗体代码模块中:

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  
+0

嗨@Mitch谢谢你把它放在一起。 我已经把所有的代码放在Userform模块中,但不幸的是问题仍然存在。 非常感谢和问候 – IRHM

+0

@IRHM我可以想到的唯一的其他事情是,在用户窗体按钮(取消按钮)的属性中,将“取消”字段设置为“真” – Mitch

+0

Hi @Mitch,谢谢你的光临回到我身边。不幸的是,当我这样做时,确定按钮不再起作用。 亲切的问候 – IRHM

2

全局变量lstnum最初是0。由于您使用lstnum作为选择触发使其-1,以符合规范。

Outlook Form To Select Email Template

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

根据您正在使用从窗体返回的选择方法。

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