我们有很多正在使用的定制电子表格解决方案,我们需要一些程序化的方式来跟踪它们。显然,由于它们是电子表格,人们可以将它们保存在本地,重命名它们等等,所以我们需要一个可以解决这个问题的解决方案。
一些想法是:
- 在电子表格打开时,处理 OnOpen 事件并将消息写入数据库以进行跟踪
与此相关的问题是我们在哪里存储数据库详细信息。如果数据库关闭,我们不希望电子表格崩溃等
有没有人想出一个很好的电子表格库存管理解决方案来处理上述所有问题。
我们有很多正在使用的定制电子表格解决方案,我们需要一些程序化的方式来跟踪它们。显然,由于它们是电子表格,人们可以将它们保存在本地,重命名它们等等,所以我们需要一个可以解决这个问题的解决方案。
一些想法是:
与此相关的问题是我们在哪里存储数据库详细信息。如果数据库关闭,我们不希望电子表格崩溃等
有没有人想出一个很好的电子表格库存管理解决方案来处理上述所有问题。
我不明白您要在这里解决的问题:您不需要将电子表格使用记录作为最终结果,某些事情正在引起痛苦,这就是您试图解决的问题。
如果您需要非常可靠地记录所有电子表格的使用情况,那么我认为这不会奏效。如果您需要最可靠的日志记录,那么只需使用数据库,而不必担心数据库关闭的(罕见)情况。On Error Resume Next
应该足以确保电子表格在该事件中继续存在。
也就是说,我更倾向于使用基于 Web 的解决方案:这样您就不必参与确保每个人都有必要的数据库驱动程序、工作连接字符串和其他可怕的事情。
一些更尴尬的问题让我认为您可能需要另一种方法:
您将如何将更改部署到您的日志记录解决方案?
您的用户是否可以控制他们的宏观安全级别?或者编写和编辑宏的能力?因此,他们可以(无辜地或以其他方式)禁用日志记录吗?
用户可以离线操作吗?那会发生什么?
让 Excel 电子表格向 Web 服务器发出请求。
将 msinet.ocx 添加到您的工具箱并使用 Inet 控件创建一个表单。通过右键单击工具箱区域中的某处来添加 ocx。
然后,您可以将 Inet 控件的位置设置在您可以处理打开电子表格的位置。
尽管您可能需要在短期内登录,但长期的解决方案应该是控制您的电子表格。您应该收集电子表格的“最终”副本,并将它们移动到文件共享中,它们都将受到保护 - 用户将能够更改其中的数据,但无法更改公式。
如果您需要更可控的协作解决方案,那么您应该考虑使用 SharePoint,可能是具有 Excel Services 的 MOSS 版本。
您可能还需要探索电子表格的使用方式。也许他们被用来代替编写程序的人,在某些情况下,可能是时候这样做了。
最后,您不想跟踪电子表格的使用情况——您不在乎是否有人创建了电子表格来跟踪他们孩子的足球队得分。这是您感兴趣的特定电子表格。日志记录可能会帮助您从一开始就追踪它,但这就是它可以帮助您的全部。
我喜欢到目前为止提出的建议以及您所写的内容。我个人喜欢保持简单,所以这是我的谦虚建议。听起来您可能正在管理很多模板,而使用 Excel 时,事情会变得一团糟,而且很难知道公式没有被篡改。考虑到这一点,我会忘记任何数据库更改管理解决方案,而是:
您还可以考虑设置一个版本控制存储库来管理对此文件夹结构的更改。使用像 tortoiseSVN 这样的简单界面查看版本控制,这样您就可以跟踪所做的更改以及更改的时间。标准的共享驱动器备份可以挽救生命,但我仍然会补充版本控制系统(只是让事情变得更容易一些)。这里有几个链接可以帮助您入门,您可以在本地尝试 subversion 并查看您的想法:
另请注意,如果您选择为电子表格实现某种数据库连接以在数据库服务器上执行日志记录,如前所述,您可以使用“on error resume next”。以下是您可以执行的操作:
您可以选择使用 if 语句来处理错误,例如:
if err.number = 3024 then
msgbox "Database file not found, check network connection and retry"
exit
end if
这是一个链接,用于查找以类似方式捕获的其他错误代码:
我做了一些与此非常相似的事情来检查 Excel 应用程序的当前版本。您可以轻松地使用相同的代码向将记录“命中”的服务器发出 Web 请求。这是我的代码:
在本工作簿中:
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 服务,您可以尝试将电子表格写入数据库 - 您仍然可以重复使用很多此代码,但不能重复使用。
你的想法很好。数据库可用性通常高于用户笔记本电脑的可用性。而且 VBA 中有一种原始错误(异常)处理,因此他们不一定会看到可怕的错误消息。
是的,你有损失。当用户不在您的网络上时,离线保存的工作表的任何使用都将从数据库中丢失。但我不认为有一个 100% 万无一失的解决方案。
尝试搜索金融时报的文章,例如“Excel - 一种过于临时且容易出错的工具”。甚至标题都说明了一切。
写入数据库,如果写入失败,捕获错误并发送电子邮件给可以在数据库备份时手动增加计数的人。
您可以使用多种文件完整性监控解决方案中的任何一种来执行基于文件的方法。Samhain 是一个免费的开源示例。这将允许您的员工不受干扰地访问他们的电子表格,但会在发现新电子表格或其时间戳或哈希值更改时报告。一旦他们重新连接到网络,它还将检测开发人员在离线时(例如在他们的笔记本电脑上)所做的更改。