Копировать данные из другой книги через VBA - PullRequest
15 голосов
/ 13 сентября 2011

Ребята, вот что я хочу сделать, и у меня есть небольшие проблемы с этим.У меня есть 1 Рабочая тетрадь, где я хочу собирать данные из разных файлов, делая что-то вроде этого.

Do While THAT_DIFFERENT_FILE_SOMEWHERE_ON_MY_HDD.Cells(Rand, 1).Value <> "" And Rand < 65536
        then 'I will search if the last row in my main worksheet is in this file... 
End Loop           

Если это так, я выйду из цикла While, если нет, я все скопирую.На самом деле это не сработает, как я хочу, но у меня не будет проблем с поиском правильного алгоритма.

Моя проблема в том, что я не знаю, как получить доступ к различным книгам.

Ответы [ 5 ]

14 голосов
/ 13 сентября 2011

Лучший (и самый простой) способ скопировать данные из рабочей книги в другую - это использовать объектную модель Excel.

Option Explicit
Sub test()
    Dim wb As Workbook, wb2 As Workbook
    Dim ws As Worksheet
    Dim vFile As Variant

    'Set source workbook
    Set wb = ActiveWorkbook
    'Open the target workbook
    vFile = Application.GetOpenFilename("Excel-files,*.xls", _
        1, "Select One File To Open", , False)
    'if the user didn't select a file, exit sub
    If TypeName(vFile) = "Boolean" Then Exit Sub
    Workbooks.Open vFile
    'Set targetworkbook
    Set wb2 = ActiveWorkbook

    'For instance, copy data from a range in the first workbook to another range in the other workbook
    wb2.Worksheets("Sheet2").Range("C3:D4").Value = wb.Worksheets("Sheet1").Range("A1:B2").Value
End Sub
7 голосов
/ 13 сентября 2011

Вам может понравиться функция GetInfoFromClosedFile ()


Редактировать: поскольку приведенная выше ссылка больше не работает, я добавляю альтернативную ссылку 1 и альтернативная ссылка 2 + код:

Private Function GetInfoFromClosedFile(ByVal wbPath As String, _
    wbName As String, wsName As String, cellRef As String) As Variant
Dim arg As String
    GetInfoFromClosedFile = ""
    If Right(wbPath, 1) <> "" Then wbPath = wbPath & ""
    If Dir(wbPath & "" & wbName) = "" Then Exit Function
    arg = "'" & wbPath & "[" & wbName & "]" & _
        wsName & "'!" & Range(cellRef).Address(True, True, xlR1C1)
    On Error Resume Next
    GetInfoFromClosedFile = ExecuteExcel4Macro(arg)
End Function
5 голосов
/ 14 сентября 2011

Существует очень мало причин, чтобы не открывать несколько книг в Excel. Ключевые строки кода:

Application.EnableEvents = False
Application.ScreenUpdating = False

... тогда вы не увидите ничего, пока выполняется код, и не будет запущен код, связанный с открытием второй книги. Тогда есть ...

Application.DisplayAlerts = False
Application.Calculation = xlManual

... чтобы предотвратить получение всплывающих сообщений, связанных с содержимым второго файла, и избежать медленных повторных вычислений. Убедитесь, что вы вернули значение True / xlAutomatic в конце вашего программирования

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

Вот некоторые экспертные рекомендации по использованию нескольких файлов Excel , которые дают обзор различных методов, доступных для обращения к данным

Дополнительным вопросом будет вопрос о том, как перебирать несколько файлов, содержащихся в одной папке. Вы можете использовать средство выбора папок Windows, используя:

With Application.FileDialog(msoFileDialogFolderPicker)
.Show
     If .Selected.Items.Count = 1 the InputFolder = .SelectedItems(1)
End With

FName = VBA.Dir(InputFolder)

Do While FName <> ""
'''Do function here
FName = VBA.Dir()
Loop

Надеюсь, что некоторые из вышеперечисленных будут полезны

4 голосов
/ 13 сентября 2011

Вы ищете синтаксис для их открытия:

Dim wkbk As Workbook

Set wkbk = Workbooks.Open("C:\MyDirectory\mysheet.xlsx")

Затем вы можете использовать wkbk.Sheets(1).Range("3:3") (или все, что вам нужно)

0 голосов
/ 19 февраля 2019

У меня был тот же вопрос, но применение предоставленных решений изменило файл для записи. Как только я выбрал новый файл Excel, я также записывал в этот файл, а не в исходный файл. Мое решение для этой проблемы ниже:

Sub GetData()

    Dim excelapp As Application
    Dim source As Workbook
    Dim srcSH1 As Worksheet
    Dim sh As Worksheet
    Dim path As String
    Dim nmr As Long
    Dim i As Long

    nmr = 20

    Set excelapp = New Application

    With Application.FileDialog(msoFileDialogOpen)
        .AllowMultiSelect = False
        .Filters.Add "Excel Files", "*.xlsx; *.xlsm; *.xls; *.xlsb", 1
        .Show
        path = .SelectedItems.Item(1)
    End With

    Set source = excelapp.Workbooks.Open(path)
    Set srcSH1 = source.Worksheets("Sheet1")
    Set sh = Sheets("Sheet1")

    For i = 1 To nmr
        sh.Cells(i, "A").Value = srcSH1.Cells(i, "A").Value
    Next i

End Sub

При excelapp будет вызвано новое приложение. Блок with устанавливает путь для внешнего файла. Наконец, я установил внешнюю рабочую книгу с source и srcSH1 в качестве рабочего листа на внешнем листе.

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