networking驱动器上的Excel文件

我工作的公司在networking驱动器上有一个非常大的主数据工作簿。 还有几十个较小的“汇总”工作簿链接到托pipe在同一个驱动器上的主文件。 这是我公司将Excel作为数据库系统的尝试。 这是一个噩梦来pipe理。

无论如何,问题在于主文件每天都会更改多次,并且每隔几周就会备份/重命名。 这意味着我需要手动浏览数十个文件并将链接更新到新文件。 例如,我将不得不每隔几周在几十个文件和几百个标签中更改“Q3-2010.xls”,以“Q4-2011.xls”。 我想能够做到这一点。

我有一些想法,但遇到了问题。 对于如何简化这一点,你们有没有任何build议? 我以前的想法/问题是:

  1. 复制主文件并将其重命名为“无论Current.xls”。 每次文件更改时都要这样做。 这种方法的问题是每个人每天都会多次更换文件,而且有人会忘记。

  2. 对networking驱动器上的主文件build立快捷方式(符号链接)(即将networking驱动器上的快捷方式放在与主服务器相同的目录中)。 这有两个主要的问题。 首先,出于某种原因,我似乎无法在networking驱动器上创build快捷方式。 我不知道这是一个安全问题,还是不能完成。 其次,在Excel中添加快捷方式链接时,会parsing快捷方式指向的文件,而不是快捷方式本身。 这并不比我们现在拥有的更好。

  3. 重命名主文件为“无论Current.xls”这似乎是最简单的,应该完美的工作。 不幸的是,公司政策要求在文件名中包含date或季度标识符。

所以,现在你看到我的问题,有没有人有任何想法如何最好地实现这一目标? 谢谢!

编辑:拼写

编辑2:再一次,我遇到了一个障碍。 我已经创build了链接的抽象文件,但我实际上不能使用这些作为其他文件的引用。 我环顾四周,看起来像我必须使用间接和CONCATENATEfunction。 不幸的是,INDIRECT只适用于开放的工作簿,我认为抽象文件将被closures。 我可以使用几个Excel扩展来允许INDIRECT在一个封闭的工作簿上工作,但是由于这必须为每个人工作,所以这不是一个选项。 我现在唯一的select是创build抽象文件,然后在每个引用它的文件中build立链接,然后使用INDIRECT作为对链接引用的引用(这变得越来越复杂)。 有没有人有其他的想法?

编辑3:其实,我上面的想法不起作用。 链接评估必须仍然是开放的(在我的情况下,这是主数据表),我们不能认为它是。 我开始想,也许我应该使用一些VBA来运行一个查询或什么,但我不知道该怎么做? 任何帮助?

我会使用VBA在必要时更新链接,至less在说服他们重构stream程之前。 在每个子工作簿中,放置一个名为Source的CustomDocumentProperty,并将其值设置为源文件的完整path。 我们将使用这个属性的存在来确定我们是否正在处理一个子工作簿。 在一个新的加载项中,用这个代码插入一个类模块

Option Explicit Private WithEvents mobjApp As Application Public Property Get App() As Application: Set App = mobjApp: End Property Public Property Set App(ByVal objApp As Application): Set mobjApp = objApp: End Property Private Sub mobjApp_WorkbookOpen(ByVal wb As Workbook) Dim sOldSource As String, sNewSource As String Dim sh As Worksheet If IsChild(wb) Then 'only work with child workbooks, event fires for every workbook sOldSource = GetSource(wb) 'read the customdocprop If Len(Dir(sOldSource)) = 0 Then 'if the file doesn't exist, we need to update the links 'get the new source file sNewSource = Application.GetOpenFilename("*.xlsx, *.xlsx", , "Select New Source", , False) 'change the link source Application.DisplayAlerts = False wb.ChangeLink sOldSource, sNewSource, xlLinkTypeExcelLinks Application.DisplayAlerts = True End If End If End Sub 

在一个标准模块(我叫我的MUtilities)把这个代码

 Option Explicit Private Const msDOCPROP As String = "Source" Function IsChild(wb As Workbook) As Boolean Dim sSource As String On Error Resume Next sSource = wb.CustomDocumentProperties(msDOCPROP) On Error GoTo 0 IsChild = Len(sSource) > 0 End Function Function GetSource(wb As Workbook) As String On Error Resume Next GetSource = wb.CustomDocumentProperties(msDOCPROP) End Function 

在另一个标准模块(MOpenClose)把这个代码

 Option Explicit Public gclsAppEvents As CAppEvents Sub Auto_Open() Set gclsAppEvents = New CAppEvents Set gclsAppEvents.App = Application End Sub 

加载项加载时,它将创build一个新的CAppEvents,将侦听工作簿打开事件。 每次打开工作簿时,都会检查是否相关。 如果是,它会看到源文件是否仍然存在。 如果没有,则会提示select新的源文件并更新链接。

你可能需要调整逻辑,你一定会想要使error handling更健壮。

一旦你得到这个工作,开始编写将这些信息移植到Access(或其他)数据库的代码。

您可以在主工作表中embedded一个事件,这个事件会自动保存备份(您提到过,您会害怕别人会忘记),这样就不可能保存备份,也不能以您需要的同名备份这是加上rem文件编辑人员的工作。

使用workbook_beforesave事件进行探索 – 每次用户尝试保存工作簿时都会启动。 禁用提示并悄悄地将备份保存在你需要的名字下! 不要忘记在代码中closures事件,否则备份保存也会触发事件。