Добрый вечер форумчане! Нужна Ваша помощь: имеются 2 файла - основной и файл-выгрузка из системы. В основном файле есть лист, в который из файла-выгрузки нужно копировать определенные столбцы. Суть вопроса следующая - файл-выгрузка содержит достаточно много столбцов из которых для обновления данных в основном файле нужно всего лишь 4 столбца. И если, например эту выгрузку сделать сегодня, порядок столбцов может быть один, а если сделать, например ее завтра - порядок столбцов может быть совершенно другим. При этом названия остаются без изменений, меняется только их (столбцов) порядок. Можно для избавления от рутины как-то оптимизировать этот процесс через макрос, т.е. копировать данные из второго файла опираясь только на названия столбцов, а не на их порядок в книге? И желательно, чтобы при копировании из 2го файла, этот файл не открывался? Сейчас копирование информации из файла в файл через vba работает, но работает при условии, что порядок столбцов всегда одинаковый и 2й файл при копировании открывается. Заранее спасибо
Добрый вечер форумчане! Нужна Ваша помощь: имеются 2 файла - основной и файл-выгрузка из системы. В основном файле есть лист, в который из файла-выгрузки нужно копировать определенные столбцы. Суть вопроса следующая - файл-выгрузка содержит достаточно много столбцов из которых для обновления данных в основном файле нужно всего лишь 4 столбца. И если, например эту выгрузку сделать сегодня, порядок столбцов может быть один, а если сделать, например ее завтра - порядок столбцов может быть совершенно другим. При этом названия остаются без изменений, меняется только их (столбцов) порядок. Можно для избавления от рутины как-то оптимизировать этот процесс через макрос, т.е. копировать данные из второго файла опираясь только на названия столбцов, а не на их порядок в книге? И желательно, чтобы при копировании из 2го файла, этот файл не открывался? Сейчас копирование информации из файла в файл через vba работает, но работает при условии, что порядок столбцов всегда одинаковый и 2й файл при копировании открывается. Заранее спасибоMaxxxis
Сообщение отредактировал Maxxxis - Пятница, 21.08.2020, 23:31
очень много вводных в задаче и мало конкретики. Нам сочинять нужно ваши файлы и то что через vba у вас работает?
извиняюсь, файлы прилагаю. сейчас через макрос работает автоматическое копирование нужных массивов из книги в книгу. макрос может и кривой, но все же работает [vba]
Код
Sub выгрузка() Workbooks.Open Filename:="C:\Users\Max\Desktop\123\Данные из системы.xlsx" r1_ = Workbooks("Данные из системы.xlsx").Worksheets("1").Range("C" & Rows.Count).End(xlUp).Row - 1 Workbooks("Данные из системы.xlsx").Worksheets("1").Range("B2:B" & r1_).TextToColumns Workbooks("Данные из системы.xlsx").Worksheets("1").Range("B2:B" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("A2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("C2:C" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("B2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("I2:I" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("C2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("K2:K" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("D2").Select ActiveSheet.Paste Application.CutCopyMode = False Workbooks("Данные из системы.xlsx").Close savechanges:=False Application.CutCopyMode = True End Sub
[/vba] суть вопроса в том, что в файле "выгрузка из системы" порядок столбцов может быть каждый раз разным, но названия столбцов из выгрузки в выгрузку всегда одинаковое. Вопрос в том, можно ли организовать копирование данных из книги в книгу, ориентируясь только на названия нужных столбцов?
очень много вводных в задаче и мало конкретики. Нам сочинять нужно ваши файлы и то что через vba у вас работает?
извиняюсь, файлы прилагаю. сейчас через макрос работает автоматическое копирование нужных массивов из книги в книгу. макрос может и кривой, но все же работает [vba]
Код
Sub выгрузка() Workbooks.Open Filename:="C:\Users\Max\Desktop\123\Данные из системы.xlsx" r1_ = Workbooks("Данные из системы.xlsx").Worksheets("1").Range("C" & Rows.Count).End(xlUp).Row - 1 Workbooks("Данные из системы.xlsx").Worksheets("1").Range("B2:B" & r1_).TextToColumns Workbooks("Данные из системы.xlsx").Worksheets("1").Range("B2:B" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("A2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("C2:C" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("B2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("I2:I" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("C2").Select ActiveSheet.Paste Workbooks("Данные из системы.xlsx").Worksheets("1").Range("K2:K" & r1_).Copy Workbooks("Выгрузка.xlsm").Activate ActiveWorkbook.Worksheets("Лист1").Range("D2").Select ActiveSheet.Paste Application.CutCopyMode = False Workbooks("Данные из системы.xlsx").Close savechanges:=False Application.CutCopyMode = True End Sub
[/vba] суть вопроса в том, что в файле "выгрузка из системы" порядок столбцов может быть каждый раз разным, но названия столбцов из выгрузки в выгрузку всегда одинаковое. Вопрос в том, можно ли организовать копирование данных из книги в книгу, ориентируясь только на названия нужных столбцов?Maxxxis
Можно Ваш код особо и не менять, просто выполните сперва этот (записано рекордером): [vba]
Код
Sub Макрос2() ' ' Макрос2 Макрос '
' ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("A1:M1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1").Sort .SetRange Range("A1:M35") .Header = xlYes .MatchCase = False .Orientation = xlLeftToRight .SortMethod = xlPinYin .Apply End With End Sub
[/vba] Но конечно в своём нужно теперь поправить копируемые столбцы, в каком порядке и куда - это надеюсь разберётесь. P.S. сейчас только обратил внимание что Range("A1:M35") нужно сперва определить динамически, ну это умеете.
Можно Ваш код особо и не менять, просто выполните сперва этот (записано рекордером): [vba]
Код
Sub Макрос2() ' ' Макрос2 Макрос '
' ActiveWorkbook.Worksheets("1").Sort.SortFields.Clear ActiveWorkbook.Worksheets("1").Sort.SortFields.Add Key:=Range("A1:M1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("1").Sort .SetRange Range("A1:M35") .Header = xlYes .MatchCase = False .Orientation = xlLeftToRight .SortMethod = xlPinYin .Apply End With End Sub
[/vba] Но конечно в своём нужно теперь поправить копируемые столбцы, в каком порядке и куда - это надеюсь разберётесь. P.S. сейчас только обратил внимание что Range("A1:M35") нужно сперва определить динамически, ну это умеете.Hugo
Ну в общем тут главное определить 35 там или другое число. А это умеете. Хотя вполне может быть что можно просто брать Range("A1").currentregion, но я не проверял. Как другой вариант - поиском или перебором выяснить в каком столбце нужные названия, и затем в коде использовать эти значения. Но зачем, если согласно исходных условий достаточно отсортировать столбцы и брать заранее известные?
Ну в общем тут главное определить 35 там или другое число. А это умеете. Хотя вполне может быть что можно просто брать Range("A1").currentregion, но я не проверял. Как другой вариант - поиском или перебором выяснить в каком столбце нужные названия, и затем в коде использовать эти значения. Но зачем, если согласно исходных условий достаточно отсортировать столбцы и брать заранее известные?Hugo