Страницы: 1
RSS
Копирование данных из одной книгии в другую
 
Уважаемые форумчане, Гуру VBA & Excel, доброго времени суток!
Прошу Вас помочь советом (если возможно конечно же), доработать имеющийся код:
Код
Sub copy()
    Dim sShName As String, sAddress As String, vData
    'отключаем обновление экрана
    Application.ScreenUpdating = False
    Workbooks.Open Filename:="Выбрать нужный файл", ReadOnly:=True 'Как заменить эту строку,на то, чтобы выбирать нужный .xlsx файл для обработки?
    sAddress = "A1:A350" 'Как заменить статический диапазон выбранных ячеек в столбце А, на динамический диапазон (до последней ячейки со значением в столбце А)?
    'получаем значения
    vData = Sheets("Отчет").Range(sAddress).Value
    ActiveWorkbook.Close False
    'Записываем данные на активный лист книги, с которой запустили макрос
    If IsArray(vData) Then
        [A4].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A4] = vData
    End If
    'Включаем обновление экрана
    Application.ScreenUpdating = True
End Sub

Код был ранее найден на просторах всемирной паутины и использовался, возможно автор данного кода будет читать моё сообщение на форуме (хочу выразить благодарность за этот код!)
Помогите пожалуйста доработать данный код, вопросы указал в комментариях 5й и 6й строки кода.
Нужен ли файл пример? На мой взгляд нет, но если будет необходим, обязательно сделаю.
Заранее спасибо за ваше внимание и советы.
Изменено: vikttur - 31.08.2021 23:37:09
Всем Добра, миру мир! Иностранцам Писа!
 
Приблизительно так
Код
Sub CopyDataFromFile()
    Dim vData, sShName As String, sAddress As String, LastRow As Long, Wb As Workbook, Rng As Range, arrFiles As Variant
    
    'диалог выбора файла
    arrFiles = ShowFileDialog()
    'отключаем обновление экрана
    Application.ScreenUpdating = False
    'открываем файл
    Set Wb = Workbooks.Open(Filename:=arrFiles(1), UpdateLinks:=False, ReadOnly:=True)
    sShName = "Отчет" 'имя листа из которого берём информацию
    With Wb.Worksheets(sShName)
        LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'последняя заполненная строка в столбце А
        Set Rng = .Range("A1:A" & LastRow)  'от А1 до А... последняя заполненная строка
        vData = Rng.Value 'получаем значения
    End With
    Wb.Close False
    'Записываем данные на активный лист книги, с которой запустили макрос
    If IsArray(vData) Then
        [A4].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData
    Else
        [A4] = vData
    End If
    'Включаем обновление экрана
    Application.ScreenUpdating = True
    MsgBox "Данные из файла скопированы!", vbInformation, ""
End Sub

Function ShowFileDialog() As Variant
    Dim n As Long
    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False 'True
        .Title = "Выбрать файлы отчетов" 'заголовок окна диалога
        .Filters.Clear 'очищаем установленные ранее типы файлов
        .Filters.Add "Excel files", "*.xls*;*.xla*", 1 'устанавливаем возможность выбора только файлов Excel
        '.Filters.Add "Text files", "*.txt", 2 'добавляем возможность выбора текстовых файлов
        .FilterIndex = 1 'устанавливаем тип файлов по умолчанию
        .InitialFileName = ThisWorkbook.Path 'назначаем папку отображения и имя файла по умолчанию
        .InitialView = msoFileDialogViewDetails 'вид диалогового окна(доступно 9 вариантов)
        If .Show = 0 Then Exit Function 'показывает диалог
        Dim arr As Variant
        ReDim arr(1 To .SelectedItems.Count)
        For n = 1 To .SelectedItems.Count
            arr(n) = .SelectedItems(n) 'считываем полный путь к файлу
            'Workbooks.Open .SelectedItems(n) 'открытие книги
        Next
        ShowFileDialog = arr
    End With
End Function
Изменено: New - 31.08.2021 22:56:12
 
New, спасибо за шикарный код! Подскажите, как вставлять только значения? Без форматирования.
Спасибо!
Всем Добра, миру мир! Иностранцам Писа!
 
в этом коде (я его немного обновил, посмотрите, вы последнюю версию скопировали из этой страницы?), вставка данных происходит без форматирования, т.к. данные передаются через массив (vData) вот в этой строке

Код
[A4].Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData

у вас не может передаться форматирование через эту строку.
Если бы вы в коде делали Copy, а в активной книге Paste - тогда копировались бы ячейки с форматированием
Изменено: New - 31.08.2021 23:09:12
 
New, понял, спасибо!
Буду тестировать и дописывать  :)  там ещё множество столбцов, которые нужно копировать, а переносить в другие) Придётся код увеличить на количество этих столбцов. А так, всё огонь!
Всем Добра, миру мир! Иностранцам Писа!
 
Друзья, ещё раз хочу выразить свою безмерную благодарность New, за своевременную и огромную помощь в написании кода.
Код получился просто волшебным (для меня по крайней мере). Не могу им не поделиться, что-бы люди могли пользоваться.
Настолько просто и доступно, мне ещё не приходилось читать и работоть с кодом. В моём случае, копирование и вставка (из одной книги в другую) происходит в 62 столбцах, это занимает всего 35 секунд, объём данных, в каждом столбце по (129 000 с лишним) строк.
Код
Sub CopyDataFromFile()
   Dim vData, sShName As String, sAddress As String, LastRow As Long, Wb As Workbook, Rng As Range, arrFiles As Variant
   Dim ActSht As Worksheet, SourceSht As Worksheet
   
   'запоминаем активный лист из файла с макросом
   Set ActSht = ActiveSheet
   'диалог выбора файла
   arrFiles = ShowFileDialog()
   'отключаем обновление экрана
   Application.ScreenUpdating = False
   'открываем файл
   Set Wb = Workbooks.Open(Filename:=arrFiles(1), UpdateLinks:=False, ReadOnly:=True)
   sShName = "Отчет" 'имя листа из которого берём информацию
   Set SourceSht = Wb.Worksheets(sShName)
   
   With SourceSht
       LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'последняя заполненная строка в столбце А
   End With
   
   'столбец А - копируем/вставляем
   vData = SourceSht.Range("A1:A" & LastRow).Value 'от А1 до А... последняя заполненная строка
   ActSht.Range("A4").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные
       
   'столбец C - копируем/вставляем
   vData = SourceSht.Range("C1:C" & LastRow).Value 'от C1 до C... последняя заполненная строка
   ActSht.Range("C4").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные
       
   'столбец D - копируем/вставляем
   vData = SourceSht.Range("D1:D" & LastRow).Value 'от D1 до D... последняя заполненная строка
   ActSht.Range("D4").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные

   'и далее
   
   'закрываем файл
   Wb.Close False
   'Включаем обновление экрана
   Application.ScreenUpdating = True
   MsgBox "Данные из файла скопированы!", vbInformation, ""
End Sub
Всем Добра, миру мир! Иностранцам Писа!
 
dredd_ Frant, Дмитрий если честно, то мои оба кода (код из сообщения №2 и из вашего (№6) - абсолютно одинаковые. В этих двух кодах вообще нет никаких отличий) Просто в первом коде происходит копирование одного столбца и файл закрывался, а в моём коде из вашего сообщения №6 копируются несколько подряд столбцов и только потом файл закрывается. А так рад, что помог вам. Надеюсь программирование макросов увлечёт вас и вы дальше будете программировать
Изменено: New - 03.09.2021 00:46:30
 
Друзья, всем привет!
Решил воспользоваться выше написанным кодом, но... При выполнении кода вылетает ошибка (скрин во вложении), подскажите пожалуйста, в чём может быть проблема? Насколько я понял, проблема именно в выводе диалогового окна выбора файла, но это моя догадка.
MS Office 2016 Proffeccional Plus.
Код прилагаю:
Код
Sub CopyDataFromFile()
   Dim vData, sShName As String, sAddress As String, LastRow As Long, Wb As Workbook, Rng As Range, arrFiles As Variant
   Dim ActSht As Worksheet, SourceSht As Worksheet
   
   'запоминаем активный лист из файла с макросом
   Set ActSht = ActiveSheet
   'диалог выбора файла
   arrFiles = ShowFileDialog()
   'отключаем обновление экрана
   Application.ScreenUpdating = False
   'открываем файл
   Set Wb = Workbooks.Open(Filename:=arrFiles(1), UpdateLinks:=False, ReadOnly:=True)
   sShName = "TDSheet" 'имя листа из которого берём информацию
   Set SourceSht = Wb.Worksheets(sShName)
   
   With SourceSht
       LastRow = .Cells(.Rows.Count, "D").End(xlUp).Row 'последняя заполненная строка в столбце А
   End With
   
   'столбец А - копируем/вставляем
   vData = SourceSht.Range("D7:D" & LastRow).Value 'от D7 до D... последняя заполненная строка
   ActSht.Range("D2").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные
       
   vData = SourceSht.Range("E7:E" & LastRow).Value 'от E7 до E... последняя заполненная строка
   ActSht.Range("E2").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные
       
   vData = SourceSht.Range("H7:H" & LastRow).Value 'от H7 до H... последняя заполненная строка
   ActSht.Range("F2").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные

   vData = SourceSht.Range("I7:I" & LastRow).Value 'от I7 до I... последняя заполненная строка
   ActSht.Range("G2").Resize(UBound(vData, 1), UBound(vData, 2)).Value = vData 'Записываем данные
  'закрываем файл
   Wb.Close False
   'Включаем обновление экрана
   Application.ScreenUpdating = True
   MsgBox "Данные из файла скопированы!", vbInformation, ""
End Sub
Заранее спасибо за ответы.
Изменено: dredd_ Frant - 21.09.2023 08:29:13
Всем Добра, миру мир! Иностранцам Писа!
 
Из сообщения номер 2 скопируйте себе эту функцию в свой код.
Ошибка говорит - нет такой функции в вашем коде
Изменено: New - 21.09.2023 21:58:19
 
Цитата
написал:
Из соображения номер 2 скопируйте себе эту функцию в свой код. Ошибка говорит - нет такой функции в вашем коде
Всё гениальное просто. Спасибо! Извиняюсь за невнимательность, просто забыл 2ю часть кода. :oops:  
Всем Добра, миру мир! Иностранцам Писа!
Страницы: 1
Наверх