自动更新VBA启动宏?

问题描述 投票:0回答:2

我正在构建一些 Word 2003 宏,必须将其放入

%APPDATA%\Microsoft\Word\Startup
文件夹中。

我无法更改此文件夹的位置(更改为网络共享)。我怎样才能自动更新这个宏?

我尝试创建一个引导程序宏,其中一个 AutoExec 子程序将较新的版本从文件共享复制到此文件夹。但当 Word 锁定文件时,我收到拒绝异常。

有什么想法吗?

仅供参考,我写了这段代码。该代码适用于

templates

 目录中的更新模板,但不适用于 
startup
 目录中:

' Bootstrapper module Option Explicit Sub AutoExec() Update End Sub Sub Update() MirrorDirectory MyPath.MyAppTemplatesPath, MyPath.WordTemplatesPath MirrorDirectory MyPath.MyAppStartupTemplatesPath, MyPath.WordTemplatesStartupPath End Sub ' IOUtilities Module Option Explicit Dim fso As New Scripting.FileSystemObject Public Sub MirrorDirectory(sourceDir As String, targetDir As String) Dim result As FoundFiles Dim s As Variant sourceDir = RemoveTrailingBackslash(sourceDir) targetDir = RemoveTrailingBackslash(targetDir) With Application.FileSearch .NewSearch .FileType = MsoFileType.msoFileTypeAllFiles .LookIn = sourceDir .SearchSubFolders = True .Execute Set result = .FoundFiles End With For Each s In result Dim relativePath As String relativePath = Mid(s, Len(sourceDir) + 1) Dim targetPath As String targetPath = targetDir + relativePath CopyIfNewer CStr(s), targetPath Next s End Sub Public Function RemoveTrailingBackslash(s As String) If Right(s, 1) = "\" Then RemoveTrailingBackslash = Left(s, Len(s) - 1) Else RemoveTrailingBackslash = s End If End Function Public Sub CopyIfNewer(source As String, target As String) Dim shouldCopy As Boolean shouldCopy = False If Not fso.FileExists(target) Then shouldCopy = True ElseIf FileDateTime(source) > FileDateTime(target) Then shouldCopy = True End If If (shouldCopy) Then If Not fso.FolderExists(fso.GetParentFolderName(target)) Then fso.CreateFolder (fso.GetParentFolderName(target)) fso.CopyFile source, target, True Debug.Print "File copied : " + source + " to " + target Else Debug.Print "File not copied : " + source + " to " + target End If End Sub ' MyPath module Property Get WordTemplatesStartupPath() WordTemplatesStartupPath = "Path To Application Data\Microsoft\Word\STARTUP" End Property Property Get WordTemplatesPath() WordTemplatesPath = "Path To Application Data\Microsoft\Templates\Myapp\" End Property Property Get MyAppTemplatesPath() MyAppTemplatesPath = "p:\MyShare\templates" End Property Property Get XRefStartupTemplatesPath() MyAppStartupTemplatesPath = "p:\MyShare\startup" End Property

[编辑]我探索了另一种方式

我正在考虑的另一种方法是试点组织者:

Sub Macro1() ' ' Macro1 Macro ' Macro recorded 10/7/2011 by beauge ' Application.OrganizerCopy source:="P:\MyShare\Startup\myapp_bootstrapper.dot", _ Destination:= _ "PathToApplication Data\Microsoft\Word\STARTUP\myapp_bootstrapper.dot" _ , Name:="MyModule", Object:=wdOrganizerObjectProjectItems End Sub

这是有效的,但有局限性:

    我要么必须对模块进行硬编码才能组织
  • 或者我必须更改选项“信任 VBA 项目”以自动发现这样的项目(这是不可接受的,因为它需要降低站的安全性):
项目枚举的代码是这样的:

Public Sub EnumProjectItem() Dim sourceProject As Document Dim targetProject As Document Set sourceProject = Application.Documents.Open("P:\MyShare\Startup\myapp_bootstrapper.dot", , , , , , , , , wdOpenFormatTemplate) Set targetProject = Application.Documents.Open("PathToApplication Data\Microsoft\Word\STARTUP\myapp_bootstrapper.dot", , , , , , , , , wdOpenFormatTemplate) Dim vbc As VBcomponent For Each vbc In sourceProject.VBProject.VBComponents 'crash here Application.ActiveDocument.Range.InsertAfter (vbc.Name + " / " + vbc.Type) Application.ActiveDocument.Paragraphs.Add Next vbc End Sub

[编辑2]又一次失败的尝试:

我在我的网络共享中放置了一个包含所有逻辑的 .dot。

在我的

STARTUP

 文件夹中,我放置了一个简单的 .Dot 文件,该文件引用前一个文件,并带有一个“
Call MyApp.MySub
”。

这实际上是有效的,但由于目标模板不在受信任的位置,每次启动单词时都会弹出安全警告(即使与当前应用程序宏无关)

vba auto-update
2个回答
0
投票
至少,我使用这些步骤部分成功了:

    创建安装包。我使用 NSIS 脚本
    • 该软件包检测 Winword.exe 的任何实例,并要求用户在关闭 Word 时重试
    • 从注册表中提取单词的选项路径
    • 将文件部署到Word的启动文件夹中
    • 在本地用户添加/删除程序中添加卸载程序
  1. 我将包放在远程共享中。我还添加了一个包含最新版本的包的 .ini 文件(格式为“1.0”)
  2. 在宏本身中,我有一个版本号(例如“0.9”)。
  3. 在启动时(AutoExec 宏),我将本地版本与远程版本进行比较
  4. 如果发现更新版本,我使用 shell exec 来启动安装程序。
  5. 安装程序将等待 Word 关闭
有点棘手,但它适用于 Word 2K3 和 Word 2K10。


0
投票
我对此的简单解决方案是将更新的文件放入 Windows 启动文件夹中,同时将其复制到 Word\Startup 文件夹中然后自毁的批处理文件。下次用户重新启动 PC 时,该文件会更新,并且由于它在启动时运行,因此 Word 不太可能及时打开以进行干扰。您也可以只调用批处理文件/安装程序,然后要求用户在复制文件之前关闭所有打开的 Word 实例。

© www.soinside.com 2019 - 2024. All rights reserved.