【问题标题】:Capturing spreadsheet usage throughout a company捕获整个公司的电子表格使用情况
【发布时间】:2009-05-18 18:45:08
【问题描述】:

我们有许多正在使用的定制电子表格解决方案,我们希望以某种程序化方式来跟踪它们。显然,由于它们是电子表格,人们可以将它们保存在本地、重命名它们等,因此我们需要一个能够解决这一问题的解决方案。

一些想法是:

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

问题在于我们在哪里存储数据库详细信息。如果数据库关闭,我们不希望电子表格崩溃等

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

【问题讨论】:

  • 你能配置内置的 Windows 事件日志(通过eventvwr.exe 可见)功能来记录这些东西吗?然后在你喜欢的时候收获它。
  • 似乎是时候将您的“自定义电子表格”解决方案升级为真正的 Web 应用程序了。

标签: vba excel inventory-management


【解决方案1】:

我不明白您在此处尝试解决的问题:您不需要将电子表格使用记录作为最终结果,某些事情正在造成痛苦,而这正是您试图解决的问题。

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

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

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

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

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

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

【讨论】:

  • 更多关于跟踪使用情况以了解库存
【解决方案2】:

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

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

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

【讨论】:

  • 网页宕机了怎么办?
  • 与数据库相同的问题。我想您可以通过编程方式发送一封电子邮件以进行一般跟踪。
【解决方案3】:

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

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

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

最后,您不想跟踪电子表格的使用情况 - 您不在乎是否有人创建了电子表格来跟踪他们孩子的足球队得分。这是您感兴趣的特定电子表格。日志记录可能会帮助您从一开始就对其进行跟踪,但它可以帮助您的仅此而已。

【讨论】:

    【解决方案4】:

    我喜欢目前提出的建议以及您所写的内容。我个人喜欢保持简单,所以这是我的谦虚建议。听起来您可能需要管理很多模板,而使用 excel 时,事情会变得一团糟,而且很难知道公式没有被篡改。考虑到这一点,我会忘记任何数据库更改管理解决方案,而是:

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

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

    Instructions to setup Subversion on Windows

    Tortoise Client to interact with Subversion

    另外请注意,如果您选择为电子表格实现某种数据库连接以在数据库服务器上执行日志记录,如前所述,您可以使用“on error resume next”。您可以执行以下操作:

    • 在恢复下一次尝试打开与数据库的连接后
    • 您可以选择使用 if 语句来处理错误,例如:

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

    这里有一个链接可以查找其他错误代码以以类似方式进行捕获:

    Error Trapping in VBA

    【讨论】:

    • 尝试在Workbook_Open 上连接,如果成功,在工作簿中将其标记为这样。如果没有,只需恢复,但在每次新打开时重新尝试,直到它工作为止。您可能希望在他们 SaveAs 时重置该标志,因为它正在创建一个新的电子表格。可靠和最新的模板将是必要的。
    • workbook_open 事件非常有用,我同意 Zairja。我只是说当你可以关注 KISS 时为什么要添加此功能,通过创建一个共享驱动器来保持简单,其中包含设置为只读的最新模板,这样任何人都无法破坏原件。如果公司有一个内部网络服务器就更好了,这样您就可以添加最新更改和超链接的描述,并改进文件夹导航的导航
    【解决方案5】:

    我做了一些与此非常相似的事情来检查 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 服务,您可以尝试将电子表格写入数据库 - 您仍然可以重复使用很多此代码,但不能重复使用它。

    【讨论】:

      【解决方案6】:

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

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

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

      【讨论】:

        【解决方案7】:

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

        【讨论】:

          【解决方案8】:

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

          【讨论】:

            猜你喜欢
            • 2018-09-14
            • 1970-01-01
            • 2021-08-02
            • 2016-03-25
            • 1970-01-01
            • 2023-03-26
            • 1970-01-01
            • 2015-03-24
            • 1970-01-01
            相关资源
            最近更新 更多