Страницы: 1
RSS
Скопировать данные(лист) из выбранной книги
 
Здравствуйте, кто-то может помочь с макросом. На форуме нашёл такой макрос, он копирует из открытой книги вы выбранную книгу нужный лист. А можно сделать так, чтобы было всё наоборот. Например из открытой книги запускаю макрос, выбираю с какой книги скопировать нужный мне лист. Данный макрос для меня очень полезный. Вот код:
Скрытый текст
Изменено: Sanja - 14.11.2025 08:15:03
 
См.файл
Согласие есть продукт при полном непротивлении сторон
 
Sanja, спасибо что помогаете. Можете подправить два момента? Чтобы в самом коде было прописано, какой лист копировать например "Фрукты", те. без всплывающей формы. И чтобы, копирование происходило из Листа "Фрукты" выбранной книги в Лист "Фрукты" запущенной книги. Всё так же как в этом примере, только наоборот. Вот код:
Скрытый текст
Изменено: Sanja - 14.11.2025 10:33:30
 
Код
Option Explicit

Private Const sInitialFileName = "E:\Сервер\Сервер 1\Сервер 2\Сервер 3\Сервер 4\РАБОЧИЕ\Журнал выездов\"
Private Const sheetNames = "Фрукты;Овощи"
  
Sub Копировать_по_журналам()
    Dim wbSource As Workbook, wbTarget As Workbook, c As Range, arrWB(), w As Variant, sheetName As Variant
    arrWB = ShowFileDialog()
    
    Set wbTarget = ActiveWorkbook
    With Application
       .EnableEvents = False
       .Calculation = xlCalculationManual
       .ScreenUpdating = False
       .Visible = False
            
        For Each w In arrWB
            Set wbSource = Workbooks.Open(w)  ' Этот метод копирует данные в книги находящиеся по пути с главной
            For Each sheetName In Split(sheetNames, ";")
                wbSource.Worksheets(sheetName).Cells.Copy wbTarget.Worksheets(sheetName).Cells 'копируем все данные с активного листа
                For Each c In wbTarget.Worksheets(sheetName).Cells.SpecialCells(xlCellTypeFormulas, 23)
                    c.FormulaLocal = Replace(c.FormulaLocal, "[" & ThisWorkbook.Name & "]", "")
                Next c
            Next
            wbSource.Close False
        Next w
            
        .EnableEvents = True
        .Calculation = xlCalculationAutomatic
        .ScreenUpdating = True
        .Visible = True
    End With
    MsgBox "Готово"
End Sub
  
Private Function ShowFileDialog() As Variant
    'ShowFileDialog = Application.FileDialog(msoFileDialogFolderPicker)
      
    Dim fso As Object
    Set fso = CreateObject("Scripting.FileSystemObject")
      
    Dim oFD As FileDialog
    Dim lf As Long
    'назначаем переменной ссылку на экземпляр диалога
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD 'используем короткое обращение к объекту
    'так же можно без oFD
    'With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = True
        .Title = "Выбрать файлы" 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .Filters.Add "Excel files", "*.xls*", 1 'устанавливаем возможность выбора только файлов Excel
        '.Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 1 'устанавливаем тип файлов по умолчанию - Text files(Текстовые файлы)
        .InitialFileName = sInitialFileName
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Function 'показывает диалог
        Dim arr As Variant, sName As String
        'цикл по коллекции выбранных в диалоге файлов
        For lf = 1 To .SelectedItems.Count
            sName = fso.GetFileName(.SelectedItems(lf))
            If Left(sName, 2) <> "~$" Then
                If sName <> ThisWorkbook.Name Then
                    If IsEmpty(arr) Then
                        ReDim arr(1 To 1)
                    Else
                        ReDim Preserve arr(1 To UBound(arr) + 1)
                    End If
                    arr(UBound(arr)) = .SelectedItems(lf)  'считываем полный путь к файлу
                End If
            End If
        Next
        ShowFileDialog = arr
    End With
End Function
 
МатросНаЗебре, то что нужно Спасибо ВАМ Большое!!! единственное когда, если вдруг нет формул то ругается на эту строку
Код
For Each c In wbTarget.Worksheets(sheetName).Cells.SpecialCells(xlCellTypeFormulas, 23)
Пишет: "Не найдено на одной ячейки, удовлетворяющей указанным условиям."
 
Скрытый текст
 
Цитата
Feniks32 написал: скопировать нужный мне лист
Так Вам не ЛИСТ нужно копировать, а ДАННЫЕ с листа? Это разные вещи
Цитата
Feniks32 написал: копирование происходило из Листа "Фрукты" выбранной книги в Лист "Фрукты" запущенной книги
Данные нужно добавлять? Заменять?
Согласие есть продукт при полном непротивлении сторон
 
МатросНаЗебре, спасибо!!!
 
Sanja, извиняюсь что не правильно описал, задачу
Цитата
написал:
Данные нужно добавлять? Заменять?
Полностью данные с листа заменить. Формулы должны сохраниться без ссылки на другую книгу, если даже в диспетчере имён была создана формула
 
Цитата
написал:
даже в диспетчере имён была создана формула
Замена формул на листе не решает задачу изменения в диспетчере имён. Лучше менять связи:
Код
wbTarget.ChangeLink Name:=shSource.Name, NewName:=wbTarget.Name, Type:=xlExcelLinks

Скрытый текст
 
Цитата
написал:
wbTarget.ChangeLink Name:=shSource.Name, NewName:=wbTarget.Name, Type:=xlExcelLinks
Если правильно понял, то  не помогло ссылки остались. Запустите книгу "Копировать лист из выбранной книги3" и выберите книгу "Откуда" в ней есть формулы созданные через "Диспетчер имён" в ячейках Листа "Фрукты" "F12" и "F15", эти формулы переносят связь с книгой "Откуда".
 
Цитата
написал:
Замена формул на листе не решает задачу изменения в диспетчере имён. Лучше менять связи:
Наверно лучше НЕ переносить формулы из "Диспетчера имён", а оставить значения. Потому что даже если ссылки удалить, то при повторном переносе данных будет выдавать сообщение что, это имя уже существует.
 
Подскажите как в этом макросе копировать весь лист, а не диапазон?
Код
Sub ВставляетЗначениеВыбор()
    Dim oFD As FileDialog
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD
        .AllowMultiSelect = False
        .Title = "Выбрать файл"
        .Filters.Clear
        .Filters.Add "All files", "*.*"
        .InitialFileName = ActiveWorkbook.Path
        .InitialView = msoFileDialogViewDetails
        If oFD.Show = 0 Then Exit Sub
    End With
    Path = oFD.SelectedItems(1)
    Workbooks.Open (Path)
    sAddress = "A1:G100" 'или одна ячейка - "A1"
    vData = ActiveWorkbook.Worksheets("Фрукты").Range(sAddress).Value 'получаем значение
    ActiveWorkbook.Close False
    If IsArray(vData) Then
        [A1].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные на активный лист книги, с которой запустили макрос
    Else
        [A1] = vData
    End If
    Application.ScreenUpdating = True 'Включаем обновление экрана
End Sub


Изменено: Feniks32 - 15.11.2025 10:10:26
 
Цитата
Feniks32 написал:
весь лист
sAddress = ActiveSheet.UsedRange.Address
Цитата
Feniks32 написал:
скопировать На нужный мне лист "Фрукты", а не на активный
Здесь проблема. Вы почему-то уже берете данные с листа Фрукты и их же туда вставляете. Зачем? Не пойму. В общем такой код должен вполне сработать:
Код
Sub ВставляетЗначениеВыбор()
    Dim oFD As FileDialog
    Dim wb As Workbook, ws As Worksheet
    Dim path$
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD
        .AllowMultiSelect = False
        .Title = "Выбрать файл"
        .Filters.Clear
        .Filters.Add "All files", "*.*"
        .InitialFileName = ActiveWorkbook.path
        .InitialView = msoFileDialogViewDetails
        If oFD.Show = 0 Then Exit Sub
    End With
    path = oFD.SelectedItems(1)
    Set ws = ActiveWorkbook.Worksheets("Фрукты") 'лист, куда переносить данные
    Set wb = Workbooks.Open(path)
    'sAddress = "A1:G100" 'или одна ячейка - "A1"
    'vData = ActiveWorkbook.Worksheets("Фрукты").Range(sAddress).Value 'получаем значение
    wb.ActiveSheet.UsedRange.Copy
    ws.Range("A1").PasteSpecial xlPasteValues  'вставляем значения
    ws.Range("A1").PasteSpecial xlPasteFormats 'вставляем форматы
    Application.CutCopyMode = False
    wb.Close False
    Application.ScreenUpdating = True 'Включаем обновление экрана
End Sub
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
Здесь проблема. Вы почему-то уже берете данные с листа Фрукты и их же туда вставляете. Зачем?
Просто в обеих книгах лист называется "Фрукты"))
 
Дмитрий(The_Prist) Щербаков, а можно сделать, чтобы при копировании он совершал вставку на лист "Фрукты", но без перехода на него?
 
Цитата
Feniks32 написал:
в обеих книгах лист называется "Фрукты"
тогда так:
Код
Sub ВставляетЗначениеВыбор()
    Dim oFD As FileDialog
    Dim wb As Workbook, ws As Worksheet
    Dim path$
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD
        .AllowMultiSelect = False
        .Title = "Выбрать файл"
        .Filters.Clear
        .Filters.Add "All files", "*.*"
        .InitialFileName = ActiveWorkbook.path
        .InitialView = msoFileDialogViewDetails
        If oFD.Show = 0 Then Exit Sub
    End With
    path = oFD.SelectedItems(1)
    Set ws = ActiveWorkbook.Worksheets("Фрукты") 'лист, куда переносить данные
    Set wb = Workbooks.Open(path)
    'sAddress = "A1:G100" 'или одна ячейка - "A1"
    'vData = ActiveWorkbook.Worksheets("Фрукты").Range(sAddress).Value 'получаем значение
    wb.Worksheets("Фрукты").UsedRange.Copy
    ws.Range("A1").PasteSpecial xlPasteValues  'вставляем значения
    ws.Range("A1").PasteSpecial xlPasteFormats 'вставляем форматы
    Application.CutCopyMode = False
    wb.Close False
    Application.ScreenUpdating = True 'Включаем обновление экрана
End Sub

Цитата
Feniks32 написал:
чтобы при копировании он совершал вставку на лист "Фрукты", но без перехода на него?
а сейчас что, переходит разве?
Вам бы хоть чуть-чуть начать изучать коды. Нигде нет и намека на переход листа, в моем коде обращение к нему идет напрямую без активации.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Может я, что-то не понял или неправильно объяснил. Порядок моих действий такой:
1. Открываю книгу "Копировать лист из выбранной книги4";
2. Нахожусь на "Лист1";
3. Запускаю макрос "ВставляетЗначениеВыбор";
4. Выбираю книгу "Откуда";
5. Он выполняется и переходит на лист "Фрукты"
Можно сделать без перехода на этот лист, то есть с какого листа запустил, на том и остаться? А код меня перебрасывает на лист "Фрукты".
Изменено: Feniks32 - 15.11.2025 11:00:00
 
Понятно. Вероятно, после спец.вставки автоматом происходит переход. Добавьте запоминание листа:
Код
Sub ВставляетЗначениеВыбор()
    Dim oFD As FileDialog
    Dim wb As Workbook, ws As Worksheet, wsAct As Worksheet
    Dim path$
    Set oFD = Application.FileDialog(msoFileDialogFilePicker)
    With oFD
        .AllowMultiSelect = False
        .Title = "Выбрать файл"
        .Filters.Clear
        .Filters.Add "All files", "*.*"
        .InitialFileName = ActiveWorkbook.path
        .InitialView = msoFileDialogViewDetails
        If oFD.Show = 0 Then Exit Sub
    End With
    path = oFD.SelectedItems(1)
    Set wsAct = ActiveSheet
    Set ws = ActiveWorkbook.Worksheets("Фрукты") 'лист, куда переносить данные
    
    Application.ScreenUpdating = False 'Выключаем обновление экрана
    Set wb = Workbooks.Open(path)
    'sAddress = "A1:G100" 'или одна ячейка - "A1"
    'vData = ActiveWorkbook.Worksheets("Фрукты").Range(sAddress).Value 'получаем значение
    wb.Worksheets("Фрукты").UsedRange.Copy
    ws.Range("A1").PasteSpecial xlPasteValues  'вставляем значения
    ws.Range("A1").PasteSpecial xlPasteFormats 'вставляем форматы
    Application.CutCopyMode = False
    wb.Close False
    wsAct.Activate
    Application.ScreenUpdating = True 'Включаем обновление экрана
End Sub

ну и добавил отключение обновления экрана - а то включение у Вас есть, а отключения нет :) Смысл теряется.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, спасибо Вам большое, я так понимаю оригинальный код Ваш))
 
Цитата
Feniks32 написал:
оригинальный код Ваш
есть такое :)
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Дмитрий(The_Prist) Щербаков, ещё одна проблема возникла, у меня таблица, которая имеет объединённые ячейки. Когда выполняется на чистый лист вставка проходит отлично, но если я повторно делаю вставку, то макрос ругается и говорит что "Для этого все объединённые ячейки должны иметь одинаковый размер", как в этом случае быть?
 
После этой строки:
Код
Set ws = ActiveWorkbook.Worksheets("Фрукты") 'лист, куда переносить данные

вставьте такую:
Код
ws.Cells.Clear
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
написал:
ws.Cells.Clear
Да сработало, спасибо!!!
 
DEL
Изменено: МатросНаЗебре - 21.11.2025 12:47:52 (Сорри)
Страницы: 1
Читают тему
Наверх