Уважаемые форумчане, Гуру 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й строки кода. Нужен ли файл пример? На мой взгляд нет, но если будет необходим, обязательно сделаю. Заранее спасибо за ваше внимание и советы.
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
в этом коде (я его немного обновил, посмотрите, вы последнюю версию скопировали из этой страницы?), вставка данных происходит без форматирования, т.к. данные передаются через массив (vData) вот в этой строке
у вас не может передаться форматирование через эту строку. Если бы вы в коде делали Copy, а в активной книге Paste - тогда копировались бы ячейки с форматированием
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 копируются несколько подряд столбцов и только потом файл закрывается. А так рад, что помог вам. Надеюсь программирование макросов увлечёт вас и вы дальше будете программировать
Друзья, всем привет! Решил воспользоваться выше написанным кодом, но... При выполнении кода вылетает ошибка (скрин во вложении), подскажите пожалуйста, в чём может быть проблема? Насколько я понял, проблема именно в выводе диалогового окна выбора файла, но это моя догадка. 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