2017-06-04 60 views
1

我的目标是获取所有当前正在运行的脚本的列表,以检查其他用户是否不在运行同一个VBA宏同一时间(如果是的话,然后停止代码等,类似于下面的问题想要的OP)。这将是一个共享工作簿(我知道它不是为这种类型的工作设计的,但我需要尝试它)。防止> 1人一次运行VBA宏(共享wkb)

https://stackoverflow.com/a/36116091/5947935

我一直在努力使在VBA上面的回答工作的代码,但现在看来,这是一个VBS的事情,我想避免这种情况。

我不是一个专家,至少可以说,所以我很难理解如何让它在Excel VBA中工作。我甚至不知道它是否可能。

我也发现这个:VBA Getting program names and task ID of running processes它工作正常,但它只列出正在运行的进程。

但是我不知道如何合并这两个......或者即使WMI是正确的路要走。

我会很感激任何形式的帮助。

+0

我可能会误解,但对我来说,他们似乎都检查在一台工作站上运行的脚本。如果两个不同的用户打开共享工作簿,那么vba将运行在他们的机器上。如果这是Access,会很简单,但是...我假设你正在运行在客户端 - 服务器环境中?如果是这样,也许你可以执行下列操作之一:(a)在服务器上创建一个隐藏文件,当脚本启动时,独占地打开它(即锁定);有代码检查文件是否锁定,如果是,请等待。或者(b)尝试通过创建带有工作站列表(可能是用户名)的文件进行管理 - 可能太麻烦了。 –

回答

0

我用来创建只是与工作簿,然后用户名的名称的空文本文件和.LCK

延伸 我的代码做了自动开

第一件事就是看一个“锁定文件”对于锁定文件,然后向用户报告哪个用户打开了它,然后取消打开。

如果没有找到锁定文件,那么它创建一个,然后照常进行。如果它找到了一个,但它是相同的用户名(即该用户让它崩溃),它将继续打开。

代码做的最后一件事是删除文件。

+0

嘿Dan,抱歉现在才回来,但我没有机会触及这个话题。 我非常喜欢这个想法,我希望它能起作用。我会让你知道结果。 非常感谢! – cloudberry

0

这里没有代码和理论尚未测试,但阻止不同用户在共享工作簿上执行宏的想法需要一些思考。

我会创建一个隐藏的工作表,并在第一次启动宏时使用其中一个单元格来存储Environ("USERNAME") - 指示谁正在运行,然后在完成时先清理它,先进先出。

  1. 比方说,一个名为范围MUSER(宏用户)是隐藏的工作表
  2. 范围A1当宏运行时,它首先会检查MUSER是空的,如果是的话那么改变它的价值Environ("USERNAME")和在下一步之前保存文件(这里我不确定该值是否在其他会话上更新)。
  3. 如果MUser不为空,可以在几秒内中止或重试。
  4. 当宏完成时,MUser将为ClearContents,并保存文件以释放宏的工作簿。

想法在这里,但请测试。发布您自己的代码,以便我们排除故障。您也可以使用Workbook事件“”这种方式执行宏。甚至可以使用这个隐藏的工作表制作调试日志记录。此外还需要实施一些故障安全功能(例如宏启动时的时间戳记和几分钟后重写锁定)。