Обновление целевой книги - извлечение данных из исходной книги - PullRequest
0 голосов
/ 11 марта 2010

Мой вопрос таков: Я дал рабочую книгу нескольким людям. Они имеют эту книгу в папке по своему выбору. Имя рабочей книги одинаково для всех людей, но расположение папок может быть разным. Давайте предположим, что общее имя файла - MyData-1.xls. Теперь я обновил рабочую книгу и хочу дать ее этим людям. Однако, когда они получают новый (назовем его MyData-2.xls), я хочу, чтобы определенные части их данных извлекались из их файла (MyData-1) и автоматически помещались в предоставленный новый (MyData-2). Столбцы и ячейки, которые нужно скопировать / импортировать, идентичны для обеих рабочих книг. Предположим, я хочу импортировать данные ячейки (только значения) из MyData-1.xls, листа 1, ячеек с B8 по C25 ... в ... то же место в книге MyData-2.xls. Как я могу указать в коде (возможно, прикрепленном к кнопке импорта данных, управляемой макросом), что я хочу, чтобы эти данные были внесены в эту новую книгу. Я попробовал это в моем собственном местоположении, открывая две рабочие книги и используя специальный метод копирования / вставки со ссылками. Это работает очень хорошо, но, кажется, создает жесткую связь между двумя физическими книгами. Я изменил название рабочей книги источника, и она все еще работала. Это заставляет меня поверить, что между буксиром существует «жесткая связь», и это не позволит мне передать целевую книгу (MyData-2.xls) другим и заставить ее найти свою исходную книгу.

Ответы [ 2 ]

2 голосов
/ 12 марта 2010

Чтобы прояснить мое понимание, у каждого пользователя есть электронная таблица MyData-1.xls, но в разных местах. Вы хотели бы отправить каждому человеку новую электронную таблицу MyData-2, которая автоматически получит данные из диапазона B8: C25 в MyData-1.xls?

Существуют различные способы сделать это, и ниже я предоставил один способ сделать это. Короче говоря, пользователь откроет MyData-2, нажмет кнопку, и код выполнит поиск MyData-1 в своем каталоге, откроет книгу, соберет данные, вставит их в MyData-2, а затем закроет MyData-1.

Sub UpdateWorkbook()

'Identify workbook you would like to pull data from (same for all users)
    Dim TargetWorkbook As String
    TargetWorkbook = "MyData-1"

'Get the full path of that workbook by searching in a specified directory
    Dim TargetPathName As String
    TargetPathName = GetFilePath(TargetWorkbook)

'Retrieve data in range B8:C25, copy and paste, then close workbook

    Dim TargetRng As Range
    Application.ScreenUpdating = False
    Workbooks.Open Filename:=TargetPathName
    Set TargetRng = Sheets("Sheet1").Range("B8:C25")
    TargetRng.Copy Destination:=ThisWorkbook.Worksheets(1).Range("B8:C25")
    ActiveWorkbook.Close
    Application.ScreenUpdating = True

End Sub

Function GetFilePath(TargetWkbook As String) As String

    Dim FullFilePath As String

    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
    Application.EnableEvents = False

    On Error Resume Next
        With Application.FileSearch
            .NewSearch
            .LookIn = "C:\"
            .FileType = msoFileTypeExcelWorkbooks
            .SearchSubFolders = True
            .Filename = TargetWkbook
                If .Execute > 0 Then
                    FullFilePath = .FoundFiles(1)
                End If
        End With

    GetFilePath = FullFilePath

    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
    Application.EnableEvents = True

End Function

Для пояснения:

  1. В подпункте сначала необходимо указать название рабочей книги MyData-1
  2. Функция GetFilePath получит полный путь к рабочему блоку. Обратите внимание, что я настроил его на диск «C: \», и ​​вы можете изменить это
  3. Получив полный путь к файлу, мы можем легко открыть книгу и скопировать необходимый диапазон.

Обратите внимание, что обновление экрана отключено, чтобы создать «иллюзию» того, что рабочая книга не была открыта при копировании данных. Кроме того, я добавил кнопку на лист MyData-2 для запуска кода, т. Е. Пользователь открывает книгу, нажимает кнопку и данные импортируются.

Наконец, этот код может быть значительно расширен, и вы можете настроить его. Например, проверка ошибок, если файл не найден, поиск в нескольких каталогах (например, C: \, D:) ...

Надеюсь, это поможет вам начать на правильном пути

1 голос
/ 11 марта 2010

Вы должны использовать copy / paste-special только для значений:

Private Sub ImportData_Click()

  On Error GoTo OpenTheSheet

    Workbooks("MyData-1.xls").Activate
    GoTo SheetOpen

  OpenTheSheet:
    Workbooks.Open "MyData-1.xls"
    Workbooks("MyData-1.xls").Activate

  SheetOpen:
    On Error GoTo 0
    Workbooks("MyData-1.xls").Worksheets("sheetwhatever").firstRange.Copy
    Workbooks("MyData-2.xls").Worksheets("anothersheet").yourRange.PasteSpecial(xlPasteValues)

End Sub

Это может быть немного исправлено, но всегда сложно работать с файлами в VBA, я бы, вероятно, поместил начальный код в функцию. Убедитесь, что они поместили новый файл в тот же каталог, что и старый файл.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...