Страницы: 1
RSS
Копирование (импорт) данных из одной книги в другую, Скопировать данные из одной книги в другую (листы, ячейки, одинаковые в обеих книгах)
 
Доброго времени суток. Возник вопрос. Имеются 2 книги эксель. Обе книги одинаковые по способу заполнения. Книга 1 более ранний версии. Книга 2 боле поздней версии. Листы и ячейки которые необходимо скопировать (импортировать) в обеих книгах одинаковые. Наименования листов в книгах одинаковые. Расположение ячеек на листах одинаковые.
Вопрос такой: При открытой книги 2, необходимо вызвать диалоговое окно, для выбора книги (в данном случае книга 1), и после выбора, перенести данные с 4-6-ти определенных листов по тем же самым "координатам".
Использовал вот такой код.....но почему то пишет "нет такого листа". (в макросах не силен....только разбираюсь)...помогите пожалуйста...
код:
Код
Function GetFileName(Optional ByVal Title As String)
    If Not IsMissing(InitialPath) Then
        On Error Resume Next: ChDrive Left(InitialPath, 1)
        ChDir InitialPath    ' выбираем стартовую папку
    End If
    res = Application.GetOpenFilename(MyFilter, , Title, "Открыть")  ' вывод диалогового окна
    GetFileName = IIf(VarType(res) = vbBoolean, "", res)    ' пустая строка при отказе от выбора
End Function
Sub AttachFile_test()    ' пример использования
    Application.ScreenUpdating = False
    Filename$ = GetFileName
    If Filename$ = "" Then Exit Sub
'    MsgBox "Выбран файл: " & Filename$
    On Error Resume Next
        Set sh = ThisWorkbook.Sheets(Application.Caller)
        If Err <> 0 Then MsgBox "Нет такого листа": Exit Sub
    On Error GoTo 0
    Set openWb = Workbooks.Open(Filename$)
    sh.UsedRange.Clear
    openWb.ActiveSheet.UsedRange.Copy sh.[a1]
    openWb.Close False
    Application.ScreenUpdating = True
End Sub
 
rumpelshtitchen, Вы проверяли что выдаёт:
Код
Application.Caller

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
как и писал ранее...в макросах не силен...не совсем понимаю, что за вопрос Вы задали .....
 
rumpelshtitchen, попробуйте этот макрос. Поместите его в тот файл ИЗ которого нужно копировать данные в другой файл. В коде укажите названия нужных листов. Сейчас в коде указаны названия Лист1, Лист2, Лист3

Код
Sub CopySheets()
    Dim vFullPath As Variant, vFile As Variant, wbTemp As Workbook, wbThis As Workbook
    Dim arrSheetsNames As Variant, vSheetName As Variant
    
    'укажите названия листов, как в этом примере
    arrSheetsNames = Array("Лист1", "Лист2", "Лист3")
    
    'проверка на наличие указанных листов в текущем файле
    Set wbThis = ThisWorkbook
    For Each vSheetName In arrSheetsNames
        If SheetExists(vSheetName) = False Then
            MsgBox "В файле " & wbThis.Name & " отсутствует лист: " & vSheetName, vbExclamation, "Внимание"
            Exit Sub
        End If
    Next vSheetName
    
    'диалог выбора второго файла, куда будем копировать данные
    vFullPath = Application.GetOpenFilename("Файлы Excel,*.xls*", 1, "Выберите файл", , False)
    If Not IsArray(vFullPath) Then
        If vFullPath = False Then Exit Sub
    End If
    
    Application.ScreenUpdating = False
    
    'открываем указанный файл
    Set wbTemp = Workbooks.Open(vFullPath, UpdateLinks:=False, ReadOnly:=False)
    
    'цикл по указанным листам
    For Each vSheetName In arrSheetsNames
        'проверяем есть ли такой лист в открытом файле
        If SheetExists(vSheetName) = False Then
            MsgBox "В файле " & wbTemp.Name & " отсутствует лист: " & vSheetName, vbExclamation, "Внимание"
            Exit Sub
        End If
        'очищаем старые данные на листе
        wbTemp.Worksheets(vSheetName).Cells.Clear
        'копируем данные из одного файла в другой
        wbThis.Worksheets(vSheetName).UsedRange.Copy Destination:=wbTemp.Worksheets(vSheetName).Range("A1")
    Next vSheetName

    'закрываем файл
    wbTemp.Close SaveChanges:=True
    
    Application.ScreenUpdating = True
    
    MsgBox "Данные скопированы!", vbInformation, "Конец"
End Sub

Private Function SheetExists(ByVal sName As String) As Boolean
    On Error Resume Next
    With Worksheets(CStr(sName)): End With
    SheetExists = (Err = 0)
    Err.Clear
End Function
Изменено: New - 11.09.2022 02:40:28
 
rumpelshtitchen, макрос не Ваш?
Учитесь пользоваться отладкой кода.

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
New, Спасибо большое. Вопрос, в принципе решен, за исключением маленьких особенностей. Листы заполняются некоректно. происходит смещение, пришлось удалять столбцы, и все заработало.
Макрос выполняет свою функцию.
И все же для своего собственного развития. Как написать код для книги2, что бы из нее запускать макрос и выбирать книгу1. Поясню почему спрашиваю. Книга 2 - более свежая и продвинутая версия книги1. Представленным макросом выше задача выполняется, но, приходиться открывать каждую книгу1 (а их может быть и 5 и 100 к примеру), прописывать код и переводить. Не проще ли открывать в более продвинутой версии, выбирать необходимый файл и проводить аналогичную процедуру, или же имеются какие то особенности, которые мешают выполнению данго условия? Как уже сказал, вопрос для самопонимания, но если его можно реализовать, подскажите пожалуйста как?
 
JayBhagavan, Спасибо за подсказку, читаю, разбираюсь.
 
Макрос нужно поместить в файл со свежими данными. Макрос можно скорректировать, чтобы можно было выбирать в диалоговом окне не 1 файл, а сразу несколько и макрос по очереди их откроет и скопирует листы в каждый из них. Макрос должен быть только в одном файле с последними данными. Куда макрос копирует данные - в этих файлах не нужны макросы
Страницы: 1
Наверх