Как сделать, чтобы Excel VBA Automation выполнялась для всех конечных пользователей - PullRequest
1 голос
/ 24 июня 2009

Я написал следующий код, чтобы при закрытии электронной таблицы Excel ее имя обновлялось с использованием текущей даты и времени:

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    If ThisWorkbook.Name = "Name_Last Opened-" & Format(Date, "MM-DD-YYYY") & _
      "_" & Format(Time, "HH.MM") & ".xls" Then
    Else
        ThisWorkbook.SaveAs Filename:="\\C:\... Name_Last Opened-" & _
            Format(Date, "MM-DD-YYYY") & "_" & Format(Time, "HH.MM") & ".xls"
        FName = Sheets("Name").Range("D1").Text
        Kill FName
    End If
End Sub

Private Sub Workbook_Open()
    Range("A1").Select
    ActiveCell.FormulaR1C1 = ThisWorkbook.Name
End Sub

Кроме того, код находится в VBAProject (Имя файла), под объектом MS Excel - ThisWorkbook.

Этот код отлично работает для меня или рабочей станции, на которой он был создан; тем не менее, он не выполняется для тех, кто открывает его на своем поклонении. Кто-нибудь знает, как заставить код выполняться всякий раз, когда электронная таблица открывается и закрывается с любого компьютера, не только с моего?

Спасибо,

DFM

Ответы [ 4 ]

4 голосов
/ 24 июня 2009

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

2 голосов
/ 24 июня 2009

«Кто-нибудь знает, как заставить код выполняться всякий раз, когда электронная таблица открывается и закрывается с любого компьютера, не только с моего?»

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

Предполагая, что вы можете обойти это, вы, возможно, должны проверить, что у всех пользователей есть рабочий лист по одному и тому же жестко заданному пути на C: \, который вы, похоже, используете. Что произойдет, если они откроют рабочую книгу из другого места?

Также:

FName = Sheets("Name").Range("D1").Text

получает значение из одного места, а

Range("A1").Select
ActiveCell.FormulaR1C1 = ThisWorkbook.Name

помещает это в другое.

Думаю, я бы попробовал что-то вроде следующего (что предполагает из вашего кода, что вы на самом деле хотите изменить имя файла, только если оно не изменилось с момента изменения текущей минуты):

Private Sub Workbook_BeforeClose(Cancel As Boolean)

Dim dateTime As String
Dim oldPath As String
Dim newPath As String

    dateTime = Format(Now, "MM-DD-YYYY_HH.MM") ' Format the while thing in one string - once

    With ThisWorkbook

        oldPath = .FullName ' what is it called now, and where did it come from?
        newPath = .Path & "\" & "Name_Last Opened-" & dateTime & ".xls" ' what should it be called now?

        If oldPath <> newPath Then ' only do something if not saved in last minute - is that what you really want?
            .SaveAs Filename:=newPath
            Kill oldPath
        End If

    End With

End Sub
1 голос
/ 24 июня 2009

Для работы функции Date () необходим доступ администратора. Поэтому, если ваш пользователь не является администратором, произойдет сбой. Вместо этого используйте now (). В большинстве случаев это то, что мы обычно забываем, поскольку у нас (людей, разрабатывающих инструмент) есть права администратора на наших ПК

0 голосов
/ 25 июня 2009

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

Создание собственного сертификата может показаться очевидным ответом, но на практике я нахожу, что результирующие сообщения и предупреждения еще более сбивают с толку / пугают некоторых конечных пользователей, что приводит к почти такой же ситуации, как и в случае макробезопасности. Сторонние сертификаты избегают этого, но являются $$$ и почти наверняка излишними для рабочей книги Excel в корпоративной среде.

То, что я сделал, когда нужно, чтобы пользователи включили VBA, - это установил для всех листов значение xlveryhidden при сохранении, кроме пользовательского заблокированного листа, в котором есть только примечание о том, что необходимо включить макросы, и краткое руководство о том, сделай это. Этот лист скрыт, а остальные восстановлены с помощью процедуры workbook_open книги, что, конечно, не сработает, если VBA отключен.

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