停止Excel打开另一个Outlook窗口

时间:2018-03-17 09:24:47

标签: excel vba excel-vba outlook outlook-vba

我有Excel vba宏来打开特定的Outlook收件箱子文件夹,但Outlook子文件夹在新的Outlook窗口中打开。

这导致如果我不手动关闭新窗口,那么在多次运行宏之后,我打开了多个Outlook窗口。

如何修改代码,以便Outlook只是导航到现有的单个窗口中的所需子文件夹,取悦?

目前,新的Outlook窗口会在Excel电子表格的基础上打开。运行宏时,我希望当前的Outlook实例转到所需的子文件夹,并在Excel电子表格的顶部进行应用。

我没有写下面的代码。我已将下面的代码合并到一个更大的宏中,但其余部分则无关紧要。

from tkinter import *
from tkinter import messagebox

class Gameover(object):
    def start(self):
        self.root = Tk()
        self.root.title('Gameover')

        self.lbl = Label(self.root, text = 'Enter your name')
        self.lbl.grid(row = 0)

        self.usertext = StringVar()
        self.myentry = Entry(self.root, textvariable = self.usertext)
        self.myentry.grid(row = 1, column = 0)

        self.lbl = Label(self.root, text = 'Your name's length must be shorter than 9 letters')
        self.lbl.grid(row = 2)

        self.mybutton = Button(self.root, text = 'OK', command = self.check_length, width = 10, height = 2)
        self.mybutton.grid(row = 1, column = 1)

        self.counter = 0

        self.root.mainloop()

    def check_length(self):
        if len(self.usertext.get()) < 10:
            self.printMessage()
        else:
            self.errorbox()

    def errorbox(self):
        messagebox.showinfo("Erorr", 'Your name's length must be shorter than 9 letters')

    def printMessage(self):
        global the_score, FILE_DATA

        data = [self.usertext.get(), str(the_score)]

        FILE_DATA.insert(len(FILE_DATA) - 1, data)
        FILE_DATA[len(FILE_DATA) - 2][1] = int(FILE_DATA[len(FILE_DATA) - 2][1])

        for i in range(0, len(FILE_DATA) - 1):
            for j in range(0, len(FILE_DATA) - 2 - i):
                if FILE_DATA[j][1] < FILE_DATA[j + 1][1]:
                    poped_data = FILE_DATA[j]
                    del FILE_DATA[j]
                    FILE_DATA.insert(j + 1, poped_data)

        file = open('score.txt', 'w', encoding = 'utf-8')
        for i in range(len(FILE_DATA) - 1):
            file.write('{} {}\n'.format(FILE_DATA[i][0], FILE_DATA[i][1]))
        file.close()
        sys.exit()

3 个答案:

答案 0 :(得分:1)

从我对another question的答案:(实际上是few

  

使用Excel等应用程序时,这一点非常重要   确保应用程序对象正确.Quit / .Close&#39; d   完成了它们,(以及Set所有对象Nothing),否则   存在无意中运行多个实例的风险,   这可能导致内存泄漏,从而导致崩溃和潜在问题   数据丢失。

     

要检查是否存在Outlook的现有实例,请使用此实例   功能:

Function IsOutlookOpen()
'returns TRUE if Outlook is running

    Dim olApp As Outlook.Application

    On Error Resume Next
    Set olApp = GetObject(, "Outlook.Application")
    On Error GoTo 0

    If olApp Is Nothing Then
        IsOutlookOpen= False
    Else
        IsOutlookOpen= True
    End If

End Function

有关从源中打开Office应用程序的新实例<现有的详细信息: Ron de Bruin

答案 1 :(得分:0)

如果您只想导航到现有单个窗口中的子文件夹,请使用Application.ActiveExplorer Method (Outlook)

CurrentFolder Property一起使用

以下示例同时在 SubFolder 下激活 Inbox 名称“Temp”窗口应用程序

Option Explicit
Public Sub Example()
    Dim olApp As Outlook.Application
    Dim olNS As Outlook.Namespace
    Dim Inbox As Outlook.MAPIFolder
    Dim SubFolder As Outlook.MAPIFolder

    '// Ref to Outlook Inbox
    Set olApp = New Outlook.Application
    Set olNS = olApp.GetNamespace("MAPI")
    Set Inbox = olNS.GetDefaultFolder(olFolderInbox)
    Set SubFolder = Inbox.Folders("Temp")

    If Not SubFolder Is Nothing Then
        Set olApp.ActiveExplorer.CurrentFolder = SubFolder
    Else
        MsgBox "SubFolder Not Found", vbInformation
    End If
End Sub
  

MSDN: Early and Late Binding

答案 2 :(得分:0)

您的代码始终会调用MAPIFolder.Display,因此您每次都会获得一个新的资源管理器窗口。 改为执行以下操作

if MyOutLookApp.ActiveExplorer Is Nothing Then
  This.Display
Else
  set MyOutLookApp.ActiveExplorer.CurrentFolder = This
End If