Скопируйте данные из другой рабочей книги через VBA

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

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, если это не так, я скопирую все. На самом деле это не будет работать, как я хочу, но у меня не будет проблем с поиском правильного алгоритма.

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

Ответ 1

Вам может понравиться функция 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

Ответ 2

Лучший (и самый простой) способ скопировать данные из книги в другую - использовать объектную модель 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

Ответ 3

Есть очень мало причин не открывать несколько книг в 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

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

Dim wkbk As Workbook

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

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