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

时间:2009-05-18 18:45:09

标签: excel vba excel-vba inventory-management

我们有许多正在使用的自定义电子表格解决方案,我们需要一些以编程方式跟踪它们。显然,因为它们是电子表格,人们可以在本地保存它们,重命名它们等等,所以我们需要一个可以解决这个问题的解决方案。

有些想法是:

  1. 在电子表格打开时,处理OnOpen事件并将消息写入数据库以进行跟踪
  2. 这方面的问题是我们存储数据库详细信息的位置。如果数据库关闭,我们不希望电子表格崩溃等等

    有人提出了一个很好的电子表格库存管理解决方案来解决上述所有问题。

8 个答案:

答案 0 :(得分:3)

我不明白你在这里要解决的问题:你不需要将电子表格使用记录作为最终结果,这会导致痛苦,这就是你设法试图解决的问题。

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

也就是说,我更倾向于选择基于Web的解决方案:这样您就不必参与确保每个人都拥有必要的数据库驱动程序,工作连接字符串和其他可怕的解决方案。

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

您打算如何将更改部署到日志记录解决方案?

您的用户是否可以控制其宏安全级别?或者编写和编辑宏的能力?他们可能(无辜地或以其他方式)禁用日志记录吗?

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

答案 1 :(得分:1)

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

将msinet.ocx添加到工具箱并使用Inet控件创建表单。通过右键单击工具箱区域中的某个位置来添加ocx。

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

答案 2 :(得分:1)

虽然您可能需要短期登录,但长期解决方案应该是控制您的电子表格。您应该收集电子表格的“权威”副本,并将它们移动到文件共享中,它们都将受到保护 - 用户将能够更改其中的数据,但无法更改公式。

如果您需要更受控制的协作解决方案,那么您应该考虑使用SharePoint,可能是其上有Excel Services的MOSS版本。

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

最后,您不希望跟踪电子表格的使用情况 - 如果有人创建了一个电子表格来跟踪孩子的足球队得分,您就不在乎了。这是您感兴趣的特定电子表格。日志记录可以帮助您跟踪开始,但这就是它可以帮助您。

答案 3 :(得分:1)

我喜欢到目前为止提出的建议和你写的内容。我个人喜欢保持简单,所以这是我的拙见。听起来你有很多你可能正在管理的模板,而且excel的东西很快变得混乱,而且很难知道公式没有被篡改。考虑到这一点,我会忘记任何数据库更改管理解决方案,而不是:

  • 创建一个共享驱动器文件夹,该文件夹设置为只读并且可供公司中的每个人访问
  • 您可以创建一个按团队,部门,位置和任何工作理解的子文件夹结构
  • 将excel模板的最新副本存储在文件夹
  • 我还建议锁定其中包含关键计算的模板 - >尽量保持开放状态,以便根据需要自定义,但由您自行决定

您还可以考虑设置一个版本控制存储库来管理对此文件夹结构的更改。使用像tortoiseSVN这样的简单界面查看版本控制,以便您可以跟踪所做的更改以及何时更改。标准的共享驱动器备份可以节省生命,但我仍然需要补充版本控制系统(只是让事情变得更容易)。这里有几个链接可以帮助您入门,您可以尝试在本地进行颠覆,看看您的想法:

Instructions to setup Subversion on Windows

Tortoise Client to interact with Subversion

另请注意,如果您选择为电子表格实现某种数据库连接以执行数据库服务器上的日志记录,则可以使用“on next resume next”。这是你可以做的:

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

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

这是一个链接,用于以类似方式查找其他错误代码:

Error Trapping in VBA

答案 4 :(得分:1)

我做了类似的事情来检查当前版本的Excel应用程序。您可以轻松地使用相同的代码向将记录“命中”的服务器发出Web请求。这是我的代码:

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

正如您所看到的,错误处理已经到位,以确保如果URL不可用,应用程序不会崩溃,它只是在状态栏中向用户写入消息。

请注意,如果您不想设置执行此操作的Web服务,您可以尝试将电子表格写入数据库 - 您仍然可以重复使用大量此代码,但不能重复使用它

答案 5 :(得分:1)

你的想法很好。数据库可用性通常高于用户笔记本电脑的可用性。并且在VBA中存在一种原始错误(异常)处理,因此它们不一定会看到错误的错误消息。

是的,你有损失。当用户不在您的网络上时,离线保存的工作表的任何使用都将从数据库中丢失。但我不认为这是一个100%万无一失的解决方案。

尝试搜索“金融时报”的文章,例如“Excel - 一种过于临时且容易出错的工具”。甚至标题都说明了一切。

答案 6 :(得分:0)

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

答案 7 :(得分:0)

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