捕获整个公司的电子表格使用情况

我们有很多自定义的电子表格解决scheme正在使用,我们希望一些跟踪他们的程序化方法。 很明显,因为它们是电子表格,所以人们可以将它们保存在本地,重命名它们等等,所以我们需要一个解决scheme来解决这个问题。

一些想法是:

  1. 在电子表格打开时,处理OnOpen事件并将消息写入数据库以进行跟踪

这个问题是我们在哪里存储数据库的细节。 如果数据库closures,我们不希望电子表格崩溃等

有没有人拿出一个好的电子表格库存pipe理解决scheme来处理上述所有问题。

我不明白你想要解决的问题:你不需要电子表格使用日志作为最终结果,有些事情正在引起痛苦,而这正是你设法解决的问题。

如果您需要严格logging所有电子表格的使用情况,那么我认为这不会起作用。 如果您需要大多数可靠的日志logging,那么只需使用数据库,而不用担心数据库closures的(罕见)情况。 On Error Resume Next应该足以确保电子表格在这种情况下继续。

也就是说,我更倾向于采用基于Web的解决scheme:这样您就不必参与确保每个人都有必要的数据库驱动程序,工作连接string和其他可怕的东西。

一些更尴尬的问题让我觉得你可能需要另一种方法:

你将如何部署更改到您的日志logging解决scheme?

你的用户是否能够控制他们的macros安全级别? 还是编写和编辑macros的能力? 他们是否可以(无辜地或以其他方式)禁用日志?

用户可以离线操作吗? 那会发生什么?

让Excel电子表格向Web服务器发出请求。

将msinet.ocx添加到您的工具箱中,并使用Inet控件创build一个窗体。 右键单击工具箱区域中的某个位置来添加ocx。

然后,您可以将Inet控件的位置设置在可以处理电子表格打开的位置。

尽pipe您可能需要在短期内进行日志logging,但长期的解决scheme应该是控制您的电子表格。 您应该收集电子表格的“权威”副本,并将它们移动到文件共享中,在那里它们将全部受到保护 – 用户将能够更改其中的数据,但无法更改公式。

如果您需要一个更受控制的协作解决scheme,那么您应该考虑使用SharePoint,可能是MOSS版本,它具有Excel Services。

您可能还需要了解电子表格的使用方式。 也许他们被用来代替编写程序的人,在某些情况下,可能是时候这样做了。

最后,你不想跟踪电子表格的使用情况 – 你不在乎是否有人创build了一个电子表格来跟踪他们孩子的足球队成绩。 这是您感兴趣的特定电子表格。日志logging可能会帮助您跟踪下来开始,但这只是它可以帮助您。

我喜欢迄今为止所提出的build议以及你所写的内容。 我个人喜欢保持简单,所以这是我的愚蠢的build议。 这听起来像你有很多模板,你可能会pipe理和Excel的事情变得凌乱快,很难知道公式没有被篡改。 考虑到这一点,我会忘记任何数据库变更pipe理解决scheme,而不是:

  • 创build一个共享驱动器文件夹,该文件夹设置为只读且公司中的每个人都可以访问
  • 你可以创build一个子文件夹结构,这个结构对团队,部门,地点,任何作品都有意义
  • 将excel模板的最新副本存储在文件夹中
  • 我还build议locking在其中有重要计算的模板 – >尽量保持开放,以便可以根据自己的需要定制他们需要的地方

您也可以考虑设置一个版本控制库来pipe理对这个文件夹结构的改变。 用一个像tortoiseSVN这样简单的界面来查看版本控制,这样你就可以跟踪什么样的变化以及什么时候变化了。 标准的共享驱动备份是一个生命的救星,但我仍然补充版本控制系统(只是让事情更容易一些)。 这里有一些帮助你入门的链接,你可以在本地尝试颠覆,看看你的想法:

在Windows上设置Subversion的说明

乌龟客户端与Subversion进行交互

另外请注意,如果您select为电子表格实现某种数据库连接以执行数据库服务器上的日志logging,您可以使用“on error resume next”。 以下是你可以做的事情:

  • 继续下一次尝试打开到DB的连接
  • 您可以select使用if语句来处理错误,例如:

     if err.number = 3024 then msgbox "Database file not found, check network connection and retry" exit end if 

这里有一个链接来查找额外的错误代码以相似的方式进行陷印:

错误陷阱在VBA中

我做了一些非常相似的事情来检查当前版本的Excel应用程序。 您可以轻松地使用相同的代码向服务器发出Web请求,以logging“点击”。 这是我的代码:

ThisWorkbook

 Option Explicit Private Sub Workbook_Open() Updater.CheckVersion End Sub 

在其他地方(在一个名为Updater的模块中)

 Option Explicit Const VersionURL = "http://yourServer/CurrentVersion.txt" Const ChangesURL = "http://yourServer/Changelog.txt" Const LatestVersionURL = "http://yourServer/YourTool.xlsm" #If VBA7 Then Private Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long #Else Private Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _ (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long #End If Public Sub CheckVersion() On Error GoTo fail Application.StatusBar = "Checking for newer version..." Dim ThisVersion As String, LatestVersion As String, VersionChanges As String ThisVersion = Range("CurrentVersion").Text If ThisVersion = vbNullString Then GoTo fail LatestVersion = FetchFile(VersionURL, , True) VersionChanges = FetchFile(ChangesURL, , True) If LatestVersion = vbNullString Then Application.StatusBar = "Version Check Failed!" Exit Sub Else If LatestVersion = ThisVersion Then Application.StatusBar = "Version Check: You are running the latest version!" Else Application.StatusBar = "Version Check: This tool is out of date!" If (MsgBox("You are not running the latest version of this tool. Your version is " & _ ThisVersion & ", and the latest version is " & LatestVersion & vbNewLine & _ vbNewLine & "Changes: " & VersionChanges & vbNewLine & _ vbNewLine & "Click OK to visit the latest version download link.", vbOKCancel, _ "Tool Out of Date Notification") = vbOK) Then ShellExecute 0, vbNullString, LatestVersionURL, vbNullString, vbNullString, vbNormalFocus End If End If End If Exit Sub fail: On Error Resume Next Application.StatusBar = "Version Check Failed (" & Err.Description & ")" End Sub 

正如你所看到的,error handling是为了确保如果URL不可用,应用程序不会崩溃,它只是在状态栏中写入一条消息给用户。

请注意,如果您不想设置这样做的Web服务,您可以尝试将电子表格写入数据库 – 您仍然可以重复使用大量的代码,但不是那么多。

你的想法很好。 数据库可用性通常高于用户笔记本电脑的可用性。 在VBA中有一种原始的错误(exception)处理,所以他们不一定会看到错误的错误信息。

是的,你有一个损失。 当用户不在networking上时保存的离线保存表的任何用法都将从数据库中丢失。 但我不认为这是一个100%的万无一失的解决scheme。

尝试search“金融时报”的文章,例如“Excel – 过于特别的工具,可能会出现错误”。 即使是标题说明了一切。

写入数据库,如果写入失败,捕获错误,并发送电子邮件给某人,可以手动增加数据库备份时的计数。

您可以使用任何一种文件完整性监视解决scheme来执行基于文件的方法。 Samhain是一个免费的开源示例。 这样可以让您的员工在不受干扰的情况下访问他们的电子表格,但会在新电子表格被发现或者时间戳或散列值发生变化时进行报告。 它还会检测到开发者在重新连接到networking后离线(例如,在他们的笔记本电脑上)所做的更改。