Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何为所有最终用户执行Excel VBA自动化_Vba_Excel_Automation - Fatal编程技术网

如何为所有最终用户执行Excel VBA自动化

如何为所有最终用户执行Excel VBA自动化,vba,excel,automation,Vba,Excel,Automation,我编写了以下代码,以便在关闭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

我编写了以下代码,以便在关闭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
此外,代码位于VBAPProject(文件名)中MS Excel对象-ThisWorkbook下

这段代码非常适合我或创建它的工作站;但是,它不会对在工作站上打开它的任何人执行。有人知道如何让代码在任何计算机(不仅仅是我的计算机)打开和关闭电子表格时执行吗

谢谢,


DFM

Excel的安全设置可能不允许其他人的计算机运行可能被解释为危险恶意软件的脚本。也许您很久以前更改了安全设置,以至于忘记了它。查看是否可以修改其他用户的安全设置,以查看这是否会使宏在工作簿上执行关闭。

Excel的安全设置可能不允许其他人的计算机运行可能被解释为危险恶意软件的脚本。也许您很久以前更改了安全设置,以至于忘记了它。查看是否可以修改其他用户的安全设置,以查看这是否会使宏在工作簿上执行关闭。

Date()函数需要管理员访问才能运行。。因此,如果您的用户是非管理员,那么它将失败。而是使用now()。大多数情况下,这是一件我们通常会忘记的事情,因为我们(开发工具的人员)在PC上拥有管理员权限,而Date()函数需要管理员权限才能运行。。因此,如果您的用户是非管理员,那么它将失败。而是使用now()。大多数情况下,当我们(开发该工具的人员)在PC上拥有管理员权限时,我们通常会忘记这一点。“有人知道如何在任何计算机(不仅仅是我的计算机)打开和关闭电子表格时执行代码吗?”

我不认为这可以100%确定地完成,除非您可以确保每个可能的用户都有宏安全设置,以便您的宏可以执行

假设您可以通过该测试,您可能应该检查所有用户是否都在您似乎正在使用的C:\上的相同硬编码路径中拥有工作表。如果他们从其他位置打开工作簿会发生什么

此外:

是从一个地方获得一个值

Range("A1").Select
ActiveCell.FormulaR1C1 = ThisWorkbook.Name
正在把它放进另一个

我想我应该尝试下面的方法(从您的代码中假设您实际上只想更改文件名,如果它从当前时间的分钟起没有更改):

Private子工作簿\u关闭前(取消为布尔值)
Dim dateTime作为字符串
将旧路径设置为字符串
将newPath设置为字符串
dateTime=Format(现在是“MM-DD-YYYY_HH.MM”)'将while内容格式化为一个字符串-一次
使用此工作簿
oldPath=.FullName'它现在叫什么,它从哪里来?
newPath=.Path&“\”和“Name\u上次打开-”&dateTime&“.xls”'现在应该调用什么?
如果oldPath newPath那么“只有在最后一分钟没有保存的情况下才做一些事情——这是你真正想要的吗?”?
.SaveAs文件名:=newPath
杀死老路
如果结束
以
端接头
“除了我的电脑,还有人知道在任何电脑上打开和关闭电子表格时如何执行代码吗?”

我不认为这可以100%确定地完成,除非您可以确保每个可能的用户都有宏安全设置,以便您的宏可以执行

假设您可以通过该测试,您可能应该检查所有用户是否都在您似乎正在使用的C:\上的相同硬编码路径中拥有工作表。如果他们从其他位置打开工作簿会发生什么

此外:

是从一个地方获得一个值

Range("A1").Select
ActiveCell.FormulaR1C1 = ThisWorkbook.Name
正在把它放进另一个

我想我应该尝试下面的方法(从您的代码中假设您实际上只想更改文件名,如果它从当前时间的分钟起没有更改):

Private子工作簿\u关闭前(取消为布尔值)
Dim dateTime作为字符串
将旧路径设置为字符串
将newPath设置为字符串
dateTime=Format(现在是“MM-DD-YYYY_HH.MM”)'将while内容格式化为一个字符串-一次
使用此工作簿
oldPath=.FullName'它现在叫什么,它从哪里来?
newPath=.Path&“\”和“Name\u上次打开-”&dateTime&“.xls”'现在应该调用什么?
如果oldPath newPath那么“只有在最后一分钟没有保存的情况下才做一些事情——这是你真正想要的吗?”?
.SaveAs文件名:=newPath
杀死老路
如果结束
以
端接头

基本上,您无法确保所有用户a)都将宏安全设置为低或中,b)如果设置为中,则在打开文件时启用它们

创建自己的证书似乎是一个显而易见的答案,但在实践中,我发现生成的消息和警告对于某些最终用户来说更令人困惑/恐惧,导致与宏安全性几乎相同的情况。第三方证书避免了这一点,但对于公司环境中的Excel工作簿来说,它是$$$,而且几乎肯定是过火了


在需要用户启用VBA的情况下,我所做的是在保存时将所有工作表设置为
xlveryhidden
,但自定义锁定的工作表除外,该工作表只有一条说明,说明必须启用宏,并提供了有关如何执行此操作的简要指南。此工作表是隐藏的,其他工作表通过工作簿的
workbook\u open
过程恢复,如果禁用VBA,当然不会触发此操作。

从根本上说,您无法确保所有用户都将a)宏安全设置为低或中,以及b)如果设置为中,则在打开文件时启用它们

创建自己的证书似乎是显而易见的答案,但在pra中
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