我工作的公司在网络驱动器上有一个非常大的主数据工作簿。还有许多较小的“摘要”工作簿链接到托管在同一驱动器上的主文件。这是我公司尝试使用Excel作为数据库系统。管理是一场噩梦。
无论如何,问题是主文件每天更改几次并每隔几周备份/重命名一次。这意味着我需要手动浏览几十个文件并更新指向新文件的链接。例如,我必须每隔几周将“无论Q3-2010.xls”更改为“无论Q4-2011.xls”中的数十个文件和数百个标签。我希望能够废除它。
我有一些想法,但遇到了问题。你们有没有任何关于如何简化这一点的建议。我以前的想法/问题是:
复制主文件并将其重命名为“Whatever Current.xls”。每次文件更改时都执行此操作。这种方法的问题在于,每个人每天都会多次更改文件,有些人肯定会忘记。
为网络驱动器上的主文件创建一个快捷方式(符号链接)(即将网络驱动器上的快捷方式放在与主驱动器相同的目录中)。这有两个主要问题。首先,由于某种原因,我似乎无法在网络驱动器上创建快捷方式。我不知道这是安全问题还是无法完成。其次,当您向Excel中的快捷方式添加链接时,它会解析快捷方式指向的文件而不是快捷方式本身。这并不比我们现在拥有的更好。
所以现在你看到了我的问题,有没有人对如何最好地实现这个有任何想法? 谢谢!
编辑:拼写
编辑2:再次,我遇到了障碍。我用链接创建了抽象文件,但实际上我不能将它们用作其他文件的引用。我环顾四周,看起来我必须使用INDIRECT和CONCATENATE函数。遗憾的是,INDIRECT仅适用于打开的工作簿,我认为抽象文件将被关闭。我可以使用几个Excel“扩展”来允许INDIRECT在已关闭的工作簿上工作,但由于这必须适用于所有人,所以这不是一个选项。我现在唯一的选择是制作抽象文件,然后在引用它的每个文件中创建文件的链接,然后使用INDIRECT作为对链接的引用的引用(这变得复杂)。有没有人有其他想法?EDIT3:实际上,我上面的想法不起作用。评估的链接必须仍然是开放的(在我的情况下,它是主数据表),我们不能认为它是。我开始认为也许我应该使用一些VBA运行查询或其他东西,但我不知道该怎么做?有什么帮助吗?
答案 0 :(得分:0)
你可以使用一个事件来嵌入主工作表,这个事件也会自动保存备份(你提到你会害怕别人会忘记),这样就不可能保存它而不能在同一个备份下备份你需要它的名字加上人们编辑文件的工作。
使用workbook_beforesave事件进行探索 - 每次用户尝试保存工作簿时都会启动。禁用提示并以您需要的名称隐藏保存备份!不要忘记在代码中关闭事件,否则备份保存也会触发事件。
答案 1 :(得分:0)
我会在必要时使用VBA更新链接,至少在你说服他们重构这个过程之前。在每个子工作簿中,放置一个名为Source的CustomDocumentProperty,并将其值设置为源文件的完整路径。我们将使用此属性的存在来确定我们是否正在处理子工作簿。在新的加载项中,插入带有此代码的类模块
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
加载加载项后,它将创建一个新的CAppEvent,用于监听工作簿打开事件。每次打开工作簿时,都会检查它是否相关。如果是,它将查看源文件是否仍然存在。如果没有,它将提示选择新的源文件并更新链接。
您可能需要调整逻辑,并且您肯定希望使错误处理更加健壮。
一旦你开始工作,就开始编写将这些信息移植到Access(或其他)数据库中的代码。