Файлы Excel на сетевом диске - PullRequest
1 голос
/ 10 августа 2011

Компания, в которой я работаю, имеет одну очень большую книгу основных данных на сетевом диске. Существуют также десятки небольших «сводных» книг, которые ссылаются на главный файл, размещенный на том же диске. Это попытка моей компании использовать Excel в качестве системы баз данных. Управлять кошмаром.

В любом случае, проблема в том, что мастер-файл меняется несколько раз в день и резервируется / переименовывается каждые пару недель. Это означает, что мне нужно вручную просмотреть десятки файлов и обновить ссылки на новый файл. Например, мне придется менять «what Q3-2010.xls» на «what Q4-2011.xls» в десятках файлов и сотнях вкладок каждые несколько недель. Я хотел бы иметь возможность покончить с этим.

У меня было несколько идей, но я столкнулся с проблемами. У любого из вас есть какие-либо советы о том, как это упростить. Мои предыдущие идеи / проблемы:

  1. Скопируйте мастер-файл и переименуйте его в «Whither Current.xls». Делайте это каждый раз, когда файл изменяется. Проблема этого подхода состоит в том, что несколько человек каждый меняют файл несколько раз в день, и кто-то обязательно забудет.

  2. Создайте ярлык (символическую ссылку) для мастер-файла на сетевом диске (то есть поместите ярлык на сетевом диске в тот же каталог, что и мастер). Есть две основные проблемы с этим. Во-первых, почему-то я не могу создать ярлыки на сетевом диске. Я не знаю, если это проблема безопасности или просто не может быть сделано. Во-вторых, когда вы добавляете ссылку на ярлык в Excel, он разрешает файл, на который указывает ярлык, а не сам ярлык. Это не лучше, чем у нас сейчас.

  3. Переименуйте основной файл в «Whither Current.xls». Это кажется самым простым и должно работать идеально. К сожалению, политика компании требует указывать дату или квартал в имени файла.

Итак, теперь, когда вы видите мою проблему, есть ли у кого-нибудь идеи о том, как лучше всего этого достичь? Спасибо!

РЕДАКТИРОВАТЬ: орфография

РЕДАКТИРОВАТЬ2: Еще раз, я столкнулся с загадкой. Я создал файл абстракции со ссылками, но на самом деле я не могу использовать их в качестве ссылок из других файлов. Я посмотрел вокруг, и похоже, что для этого мне нужно использовать функции INDIRECT и CONCATENATE. К сожалению, INDIRECT работает только с открытыми книгами, и я предполагал, что файл абстракции будет закрыт. Есть несколько «расширений» Excel, которые я могу использовать, чтобы позволить INDIRECT работать с закрытой книгой, но так как это должно работать для всех, это не вариант. Мой единственный вариант сейчас - создать файл абстракции, затем создать ссылки на файл в каждом из файлов, которые на него ссылаются, а затем использовать INDIRECT как ссылку на ссылку на ссылки (это становится сложным). У кого-нибудь есть другие идеи?

EDIT3: На самом деле, моя идея выше не работает. Оцениваемая ссылка должна оставаться открытой (в моем случае это основная таблица данных), и мы не можем предположить, что это так. Я начинаю думать, что, возможно, мне следует использовать какой-нибудь VBA для выполнения запроса или чего-то еще, но я не знаю, как это сделать? Любая помощь?

Ответы [ 2 ]

0 голосов
/ 12 августа 2011

Я бы использовал VBA для обновления ссылок при необходимости, по крайней мере, до тех пор, пока вы не сможете убедить их реорганизовать процесс.В каждой дочерней книге поместите CustomDocumentProperty с именем Source и задайте для его значения полный путь к исходному файлу.Мы будем использовать существование этого свойства, чтобы определить, имеем ли мы дело с детской книгой.В новой надстройке вставьте модуль класса с этим кодом

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

Когда загруженная надстройка будет создана, она создаст новые CAppEvents, которые будут прослушивать события открытия книги.Каждый раз, когда открывается рабочая книга, она проверяет, актуальна ли она.Если это так, он увидит, существует ли исходный файл.Если нет, он предложит выбрать новый исходный файл и обновить ссылки.

Возможно, вам придется настроить логику, и вам определенно понадобится сделать обработку ошибок более надежной.

Как только вы это заработаете, начните писать код, который переносит эту информацию в базу данных Access (или другую).

0 голосов
/ 11 августа 2011

Вы можете встроить мастер-лист с событием, которое автоматически также сохранит резервную копию (которую вы упомянули, вы бы боялись, что люди ее забудут), таким образом, невозможно, чтобы она не сохранялась и не создавала резервные копии под одним и тем жеимя, которое вам нужно, чтобы быть плюс, удаляет работу для людей, редактирующих файл.

Исследуйте, используя событие workbook_beforesave - это будет срабатывать каждый раз, когда пользователь пытается сохранить рабочую книгу.Отключите подсказки и тайно сохраните резервную копию под тем именем, которое вам нужно!Не забудьте отключить события во время написания кода, иначе ваше резервное копирование также вызовет событие.

...