Как я могу узнать, запускается ли макрос с электронной почты или с рабочего стола с помощью VBA? - PullRequest
3 голосов
/ 06 марта 2019

Я разрабатывал макросы в течение ряда лет. Мы, пользователи, запускаем эти макросы с локального диска. Однако из-за оборота, новых сотрудников и т. Д. Эта информация не всегда передается новым пользователям.

У нас есть центральное место, где пользователи скачивают копии этих макросов. Если они следуют процедурам, он сохраняет макрос на локальный диск. Однако иногда пользователи получают макросы от коллег по электронной почте. Затем они открываются из электронной почты или сохраняют их на рабочем столе.

Если они запускают наши макросы из электронной почты или с рабочего стола, могут возникнуть проблемы; который часто требует, чтобы кто-то связался с нами для поддержки. Я хотел бы попытаться сократить количество обращений в службу поддержки.

Мне интересно, есть ли способ узнать, был ли макрос открыт по электронной почте или с рабочего стола пользователя. В идеале я подумываю добавить код в модуль «При открытии» и отобразить сообщение, в котором пользователю будет предложено сохранить макрос на локальный диск перед его открытием / запуском.

Однако я не уверен, как определить эти 2 местоположения. Я уже использовал свойство Path, но эти макросы могут быть на любом количестве дисков в сотнях полевых офисов. Я подумал, что было бы лучше, если бы я мог определить адрес электронной почты или местоположение на рабочем столе, а затем отобразить сообщение.

Большинство наших пользователей работают в Office 2010 или 2016. Спасибо за помощь ..........

Ответы [ 2 ]

4 голосов
/ 06 марта 2019

Если вы откроете рабочую книгу по почте и отладите ThisWorkbook.Path, вы получите что-то вроде:

? thisworkbook.Path C:\Users\UserName\AppData\Local\Microsoft\Windows\INetCache\Content.Outlook\9PWSZZ9J

То же самое пойдет на рабочий стол, так что вы можете использоватьтриггер Workbook_Open() для проверки пути к книге, если он похож на Outlook или Рабочий стол , отправив сообщение с предупреждением, чтобы сохранить его на локальном диске.

Изменено из-заКомментарии к бритью:

Есть финальный подход.Давайте просто скажем, что их групповая политика позволила им сохранять файлы на локальном Dirve C: (предположим, они все получили этот диск)

Ваш подход может быть,

Option Explicit
Private Sub Workbook_Open()

    Dim DesiredFilePath As String, CurrentFilePath As String, wb As Workbook

    Set wb = ThisWorkbook

    DesiredFilePath = "C:\" & wb.Name
    CurrentFilePath = wb.Path & "\" & wb.Name

    If DesiredFilePath <> CurrentFilePath Then
        wb.SaveAs DesiredFilePath
        On Error Resume Next
        Kill CurrentFilePath
        On Error GoTo 0
        MsgBox "The file wasn't saved where it should be to work properly. It's been saved in: " & CurrentFilePath
    End If


End Sub

таким образом, что вы не делаетепредупреждая пользователя, вы сохраняете файл там, где вам нужно, и удаляете его оттуда, где он предупреждал пользователя, как его найти.

1 голос
/ 06 марта 2019

Вот расширенная версия того, что предложил Дамиан.Я разделю это на 2 части.


ЧАСТЬ ПЕРВАЯ: ОТ ПЕРСПЕКТИВЫ

Я демостерирую с одной версией MS Office.Не стесняйтесь добавлять больше в Select Case

Когда вы открываете вложения из сообщения электронной почты перед сохранением на жесткий диск, Outlook помещает копии в папку SecureTemp.Эта папка является скрытой папкой в ​​папке Временные файлы Интернета .

Sub Sample()
    Dim ol_Version As String
    Dim ol_RegKey As String
    Dim ol_SecureTempRegKey As String
    Dim ol_SecureTempFolder As String

    '~~> This is the registry key which stores Outlook's version
    ol_RegKey = "HKEY_CLASSES_ROOT\Outlook.Application\CurVer\"

    ol_Version = CreateObject("WScript.Shell").RegRead(ol_RegKey)

    '~~> Check the outlook version
    Select Case ol_Version
        Case "Outlook.Application.15"

            ol_SecureTempRegKey = "HKEY_CURRENT_USER\Software\Microsoft\Office\15.0\Outlook\Security\OutlookSecureTempFolder"
        '
        '~~> Add more cases here
        '
    End Select

    If ol_SecureTempRegKey <> "" Then
        ol_SecureTempFolder = CreateObject("WScript.Shell").RegRead(ol_SecureTempRegKey)

        Debug.Print "Outlook's temp folder is " & ol_SecureTempFolder
    End If
End Sub

Получив путь SecureTemp, вы можете проверить, был ли файл открыт сOutlook.


ЧАСТЬ ВТОРАЯ: ИЗ СТОРОНЫ СТОП

Чтобы получить путь к папке на рабочем столе пользователя, вы можете использовать это.Получив путь Desktop, вы можете проверить, был ли файл открыт оттуда.

Sub Sample()
    Dim desktopPath As String

    desktopPath = CreateObject("WScript.Shell").SpecialFolders("Desktop")

    Debug.Print "User's desktop folder is " & desktopPath
End Sub
...