通过网络同步Word BuildingBlocks但具有脱机支持

时间:2017-01-31 11:44:38

标签: vba templates ms-office word-vba

我在VBA中为Word 2013构建了一个自定义BuildingBlock管理系统,使用户可以更方便地对BuildingBlocks进行分类,过滤和使用。

这些块存储在.dotm模板文件中,该文件附加到.docm文件中,其中包含管理系统代码。后者的内容在全球范围内不时更新,每个用户本地副本也可以包含单独的内容。所有用户都应该能够创建自动可供所有其他人使用的新块。此外,应该可以随时(在线,离线)使用本地块,仅用于创建/删除需要网络连接的块。

这是试图解释连接的图形:

Local and network files

我的方法是在本地工作文件的每次打开时,在本地启动任何更改之前,将存储文件从网络复制到本地。更改后,网络文件会更新。这样,其他用户的更改最有可能不会被覆盖(仅当它们同时发生时),并且所有用户都拥有最新的块集合。

问题: 我无法覆盖正在使用的文件 - 因为工作文件引用了.dotm块存储文件,它会在后台打开。暂时取消模板也不起作用:我尝试使用

ActiveDocument.AttachedTemplate = ""

但这是关键不稳定的,不会在我测试的系统上处理(不同的配置)。我不明白为什么,但我不能依赖这样的解决方案。

所以这是我的问题: 你知道这样做的方法吗?有没有最佳做法?

我很欣赏任何提示。

1 个答案:

答案 0 :(得分:0)

对于对此主题感兴趣的任何人:我必须为此创建一个解决方法。

存储构建块的模板需要关闭才能被覆盖,所以我写了一个小的批处理脚本,在工作文件关闭后进行更新。要返回上一个操作或最终确定它,批处理文件会创建一个带有交换参数的临时文本文件,而交换参数又可以在打开的工作文件中读取。这是批处理文件:

@echo off
:: Batch file for updating the local libraries [referenced as library and cat files in the following]
:: Parameters: 
::  %1 - caller file path
::  %2 - update scenario
::  %3 - local tool dir path
::  %4 - library file name
::  %5 - cat file name
::  %6 - network library dir path
::  %7 - tooldata folder name

SET n=0
SET f=0

IF "%~1"=="" (
  echo No arguments passed.
  Goto NoArguments
)

:: Build local and remote paths to the libraries
SET LocalLib=%~3%~4
SET LocalCat=%~3%~5
SET NetworkLib=%~6%~4
SET NetworkCat=%~6%~5

:: Wait for a maximum of 16 sec until the local library gets released.
:: If its still in use afterwards, abort the copy actions.

:Loop
SET /A n=n+1
IF %n% EQU 10 (
  Goto FileNotClosed
) ELSE (
  2>nul (
    >>%LocalLib% echo off
  ) && (SET f=1)
  IF %f% EQU 0 (
    Ping 1.1.1.1 -n 2 -w 1 | find /V "Ping" > nul
    Goto Loop
  ) ELSE (
     Goto StartCopy
  )
 )

:StartCopy
:: Calling document is closed so it should be save to copy the network libraries to the local destination
xcopy %NetworkLib% %LocalLib% /y /q
xcopy %NetworkCat% %LocalCat% /y /q

:FileNotClosed
:: Finally write results of the actions to a xargs.txt file
@echo scenario=%~2>"%~3%~7\xargs.txt"
IF %f% EQU 0 ((@echo success=0)>>"%~3%~7\xargs.txt") ELSE ((@echo success=1)>>"%~3%~7\xargs.txt")

:: Reopen the caller file
%1

:NoArguments

此解决方案出现的问题是,关闭文件时,工作文件中创建的任何数据都将丢失。这就是为什么我还需要将任何用户表单/构建块数据存储在其他临时文件中的原因。

例如,创建新构建块现在可以按如下方式工作:用户在工作文件对话框中输入所有必要信息。完成后,数据将保存在临时文件中,updater.bat将启动并关闭工作文件。更新程序复制最新文件并重新启动工作文件,该文件从besaid .txt文件读取更新结果,完成创建,将本地文件重新上载到网络并清理混乱。