Есть файл СПК (файл-пример разбил на 2 архива) Необходимо при помощи макросов дынные из столбца С (каждого листа - в примере 3, в реалии 15) книги СПК, перенести на каждый лист в столбец С его копии (по сути, книги СПК-копия). При этом, чтобы в ячейки вставлялись значения, а не формулы.
Там, как я понял 3 варианта: 1) Макрос вставляется в книгу ОТКУДА переносятся данные (в моем случае будет СПК) 2) Макрос вставляется в книгу КУДА будут переносится данные (в моем случае СПК-копия) 3) Я не совсем понял, что там написано. Вот что понял: данные копируются из активной к в другую, с нескольких листов, вставляются только значения. По идее, мне нужен вот этот сложный страшный третий вариант.
Но у меня просьба. Если не сложно, сделайте пожалуйста 3 варианта, может уже на готовых реальных примерах получится разобраться)) И подскажите, еще каким образом лучше копировать диапазоны данных в редактор vba
Есть файл СПК (файл-пример разбил на 2 архива) Необходимо при помощи макросов дынные из столбца С (каждого листа - в примере 3, в реалии 15) книги СПК, перенести на каждый лист в столбец С его копии (по сути, книги СПК-копия). При этом, чтобы в ячейки вставлялись значения, а не формулы.
Там, как я понял 3 варианта: 1) Макрос вставляется в книгу ОТКУДА переносятся данные (в моем случае будет СПК) 2) Макрос вставляется в книгу КУДА будут переносится данные (в моем случае СПК-копия) 3) Я не совсем понял, что там написано. Вот что понял: данные копируются из активной к в другую, с нескольких листов, вставляются только значения. По идее, мне нужен вот этот сложный страшный третий вариант.
Но у меня просьба. Если не сложно, сделайте пожалуйста 3 варианта, может уже на готовых реальных примерах получится разобраться)) И подскажите, еще каким образом лучше копировать диапазоны данных в редактор vba biomirror
Выложите примеры файлов, а то действительно непонятно становится что вы хотите) Файл откуда переносить, файл куда переносить и укажите на какие листы и что переносить
Выложите примеры файлов, а то действительно непонятно становится что вы хотите) Файл откуда переносить, файл куда переносить и укажите на какие листы и что переноситьexcelhelprus
Правильно заданный вопрос ...... дальше, думаю, понятно Врт пример перебора листов и переноса значений колонки С на вновьсоздаваемыее листы новой книги [vba]
Код
Sub QWERT() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR Set WI = ActiveWorkbook Set WB = Workbooks.Add 'в новую книгу For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущеголиста Set SB = WB.Worksheets.Add 'добавляем новый лист в новую книгу SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения Next End Sub
[/vba]
Правильно заданный вопрос ...... дальше, думаю, понятно Врт пример перебора листов и переноса значений колонки С на вновьсоздаваемыее листы новой книги [vba]
Код
Sub QWERT() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR Set WI = ActiveWorkbook Set WB = Workbooks.Add 'в новую книгу For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущеголиста Set SB = WB.Worksheets.Add 'добавляем новый лист в новую книгу SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения Next End Sub
Я вот например не понял что именно нужно - перенос или копирование? Вроде всё время говорите про перенос, и вдруг один раз - копирование. Предложили копирование - промолчали...
"каким образом лучше копировать диапазоны данных в редактор vba" - вообще фраза-загадка. Особенно если учесть "(не по одному же диапазону каждый раз вставляют)".
Я вот например не понял что именно нужно - перенос или копирование? Вроде всё время говорите про перенос, и вдруг один раз - копирование. Предложили копирование - промолчали...
"каким образом лучше копировать диапазоны данных в редактор vba" - вообще фраза-загадка. Особенно если учесть "(не по одному же диапазону каждый раз вставляют)".Hugo
biomirror, Вот, если Вы поместите файл и файл-копию в 1 папку. То можно тот же что у alex77755, только без создания новых листов: [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения Next SB Next SI End Sub
[/vba]
biomirror, Вот, если Вы поместите файл и файл-копию в 1 папку. То можно тот же что у alex77755, только без создания новых листов: [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения Next SB Next SI End Sub
(по сути, книги СПК-копия). При этом, чтобы в ячейки вставлялись значения, а не формулы.
Если я правильно понимаю, то можно так. [vba]
Код
Sub Копия() Dim Sh As Worksheet, iPath$, fa$, fk$ iPath = ThisWorkbook.Path & "\" Application.ScreenUpdating = False: Application.DisplayAlerts = False fa = ThisWorkbook.Name 'файл активный (рабочий) fk = Mid(fa, 1, Len(fa) - 4) & "-копия" & ".xls" 'файл копия 'если расширение файла больше 3-х букоф, 4 заменить на 5
ThisWorkbook.Save 'сохраняем активный (рабочий) файл ActiveWorkbook.SaveCopyAs iPath & fk 'сохраняем файл как копию Workbooks.Open iPath & fk 'открываем файл копию и далее обрабатываем For Each Sh In Workbooks(fk).Sheets 'Workbooks(fk).Sheets(Sh.Name).Buttons.Delete 'Удаляем кнопки 'Workbooks(fk).Sheets(Sh.Name).DrawingObjects.Delete 'Удаляем все элементы Workbooks(fk).Sheets(Sh.Name).UsedRange.Value = Workbooks(fk).Sheets(Sh.Name).UsedRange.Value Next Sh Windows(fa).Activate 'активируем (рабочий) файл Workbooks(fk).Save 'сохраняем файл копию Workbooks(fk).Close 'закрываем файл копию Application.ScreenUpdating = True: Application.DisplayAlerts = True End Sub
(по сути, книги СПК-копия). При этом, чтобы в ячейки вставлялись значения, а не формулы.
Если я правильно понимаю, то можно так. [vba]
Код
Sub Копия() Dim Sh As Worksheet, iPath$, fa$, fk$ iPath = ThisWorkbook.Path & "\" Application.ScreenUpdating = False: Application.DisplayAlerts = False fa = ThisWorkbook.Name 'файл активный (рабочий) fk = Mid(fa, 1, Len(fa) - 4) & "-копия" & ".xls" 'файл копия 'если расширение файла больше 3-х букоф, 4 заменить на 5
ThisWorkbook.Save 'сохраняем активный (рабочий) файл ActiveWorkbook.SaveCopyAs iPath & fk 'сохраняем файл как копию Workbooks.Open iPath & fk 'открываем файл копию и далее обрабатываем For Each Sh In Workbooks(fk).Sheets 'Workbooks(fk).Sheets(Sh.Name).Buttons.Delete 'Удаляем кнопки 'Workbooks(fk).Sheets(Sh.Name).DrawingObjects.Delete 'Удаляем все элементы Workbooks(fk).Sheets(Sh.Name).UsedRange.Value = Workbooks(fk).Sheets(Sh.Name).UsedRange.Value Next Sh Windows(fa).Activate 'активируем (рабочий) файл Workbooks(fk).Save 'сохраняем файл копию Workbooks(fk).Close 'закрываем файл копию Application.ScreenUpdating = True: Application.DisplayAlerts = True End Sub
Я вот например не понял что именно нужно - перенос или копирование? Вроде всё время говорите про перенос, и вдруг один раз - копирование. Предложили копирование - промолчали...
Каюсь, каюсь... честно, виноват) Для под "переносом" я имел в виду копирование...(в уме было, чтобы "значения оказались в нужной книги"). Копирование, копирование, конечно копирование
alex77755, да-да, мне почти это надо. Только, чтобы не листы создавались, а значения копировались в уже готовые.
Wasilic, меня почти правильно понял. Только в его скрипте книга сама дублируется. А мне надо, чтобы значения переносились в уже созданную книгу. Хотя в некоторых случаях его вариант удобней)
"каким образом лучше копировать диапазоны данных в редактор vba" - вообще фраза-загадка. Особенно если учесть "(не по одному же диапазону каждый раз вставляют)".
'Выделить диапазон который необходимо скопировать Range("A1:F52").Select
[/vba] Я когда пытался применить этот пример к своему случаю, я копировал диапазоны из столбца С следующим образом: в любой ячейке вводил формулу суммы и выбирал диапазоны, которые мне надо скопировать в другую книгу, получалось так:=СУММ(C6:C9;C30:C37;C41:C63) и отсюда уже эти диапазоны я копировал в свой "макрос")) Вот и подумал, что, наверно, можно как-то по проще диапазоны копировать))
Я вот например не понял что именно нужно - перенос или копирование? Вроде всё время говорите про перенос, и вдруг один раз - копирование. Предложили копирование - промолчали...
Каюсь, каюсь... честно, виноват) Для под "переносом" я имел в виду копирование...(в уме было, чтобы "значения оказались в нужной книги"). Копирование, копирование, конечно копирование
alex77755, да-да, мне почти это надо. Только, чтобы не листы создавались, а значения копировались в уже готовые.
Wasilic, меня почти правильно понял. Только в его скрипте книга сама дублируется. А мне надо, чтобы значения переносились в уже созданную книгу. Хотя в некоторых случаях его вариант удобней)
"каким образом лучше копировать диапазоны данных в редактор vba" - вообще фраза-загадка. Особенно если учесть "(не по одному же диапазону каждый раз вставляют)".
'Выделить диапазон который необходимо скопировать Range("A1:F52").Select
[/vba] Я когда пытался применить этот пример к своему случаю, я копировал диапазоны из столбца С следующим образом: в любой ячейке вводил формулу суммы и выбирал диапазоны, которые мне надо скопировать в другую книгу, получалось так:=СУММ(C6:C9;C30:C37;C41:C63) и отсюда уже эти диапазоны я копировал в свой "макрос")) Вот и подумал, что, наверно, можно как-то по проще диапазоны копировать))biomirror
Сообщение отредактировал biomirror - Четверг, 23.04.2015, 10:55
Roman777, Вставил в макрос название своего файла. запустил - вылетает ошибка.
Wasilic, вот, вот, именно так мне и надо. Только почему-то при запуске макроса вылетает ошибка, но при нажатии на ок, макрос выполняется и все становится как надо.
А при открытии файла копии, появляется сообщение, что данный файл имеет другое расширение. Можно как-то сделать, чтобы это сообщение не появлялось, не меняя формата файла-копии.
Ну вот, в принципе процесс пошел. Теперь даже формулировать становиться легче. Мне нужно тоже самое, что сделал Wasilic, только чтобы 1. значения копировались в уже готовый файл-копию. 2. И та же задача только с другой стороны, - чтобы файл-копия сам забирал данные значения из уже готового файла.
Roman777, Вставил в макрос название своего файла. запустил - вылетает ошибка.
Wasilic, вот, вот, именно так мне и надо. Только почему-то при запуске макроса вылетает ошибка, но при нажатии на ок, макрос выполняется и все становится как надо.
А при открытии файла копии, появляется сообщение, что данный файл имеет другое расширение. Можно как-то сделать, чтобы это сообщение не появлялось, не меняя формата файла-копии.
Ну вот, в принципе процесс пошел. Теперь даже формулировать становиться легче. Мне нужно тоже самое, что сделал Wasilic, только чтобы 1. значения копировались в уже готовый файл-копию. 2. И та же задача только с другой стороны, - чтобы файл-копия сам забирал данные значения из уже готового файла.biomirror
Сообщение отредактировал biomirror - Четверг, 23.04.2015, 11:25
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
А задача наоборот - тоже самое, только открывать надо будет файл - исходник и копировать из него. [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
[/vba] Поидее так должно сработать)
А задача наоборот - тоже самое, только открывать надо будет файл - исходник и копировать из него. [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
Roman777, спасибо, "прямая" задача, работает как надо на примере. В моей реальной задаче листов 15. Как сделать, чтобы данные переносились во все 15 листов?
А обратная, выдает ошибку. Но мне в принципе, пока решения "прямой" задачи, думаю, хватит))
Roman777, спасибо, "прямая" задача, работает как надо на примере. В моей реальной задаче листов 15. Как сделать, чтобы данные переносились во все 15 листов?
А обратная, выдает ошибку. Но мне в принципе, пока решения "прямой" задачи, думаю, хватит))biomirror
Сообщение отредактировал biomirror - Пятница, 24.04.2015, 06:49
biomirror, KuklP, Действительно, не углядел. Ошибка, вместо WI.path должно быть WB.path [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
[/vba] biomirror, Разве не во все листы данные переносятся? Просто по-сути, для норм работы кода, книга-исходник и книга-копия, лучше всего были бы идентичными...
biomirror, KuklP, Действительно, не углядел. Ошибка, вместо WI.path должно быть WB.path [vba]
Код
Sub QWERT2() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения end If Next SB Next SI End Sub
[/vba] biomirror, Разве не во все листы данные переносятся? Просто по-сути, для норм работы кода, книга-исходник и книга-копия, лучше всего были бы идентичными...Roman777
Модераторы, войдите, пожалуйста в положение, разрешите ссылку дать ссылку на реальный файл(файлы-примеры никуда не денутся). Я по другому не могу объяснить, что мне надо... Roman777, Вот файл http://1drv.ms/1ONs1RZ, с которым я работаю. Вот его копия http://1drv.ms/1ONsiV1 Мне нужно, чтобы данные с видимых 15 пронумерованных листов файла, скопировались бы в 15 листов файла-копии. При этом лист ИК3, остался бы незатронутым макросом.
Про задачу наоборот, я имел ввиду немного другое: чтобы данные копировались в файл-копию, не открывая файла исходника)) Вот, надеюсь, не криво объяснил))
Модераторы, войдите, пожалуйста в положение, разрешите ссылку дать ссылку на реальный файл(файлы-примеры никуда не денутся). Я по другому не могу объяснить, что мне надо... Roman777, Вот файл http://1drv.ms/1ONs1RZ, с которым я работаю. Вот его копия http://1drv.ms/1ONsiV1 Мне нужно, чтобы данные с видимых 15 пронумерованных листов файла, скопировались бы в 15 листов файла-копии. При этом лист ИК3, остался бы незатронутым макросом.
Про задачу наоборот, я имел ввиду немного другое: чтобы данные копировались в файл-копию, не открывая файла исходника)) Вот, надеюсь, не криво объяснил))biomirror
Сообщение отредактировал biomirror - Пятница, 24.04.2015, 11:47
biomirror, Я пока не имею возможности работать в ВБА. Поэтому пока отвечу на что могу. Чтобы не трогал лист "ИК3" надо поставить просто условие, что имя листа не должно = "ИК3"
[vba]
Код
Sub ПрямаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <> "ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI End Sub
[/vba]
И макрос ориентируется именно на названия листов. сравнивает их и если они совпадает - записывает данные. А про задачу наоборот. То вродебы данные так и копируются, но вот неоткрывая исходника как сделать, я не знаю, честно говоря, если это вообще возможно. Могу просто закрыть после копирования файл-исходник:
[vba]
Код
Sub ОбратнаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <>"ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI WI.close End Sub
[/vba]
biomirror, Я пока не имею возможности работать в ВБА. Поэтому пока отвечу на что могу. Чтобы не трогал лист "ИК3" надо поставить просто условие, что имя листа не должно = "ИК3"
[vba]
Код
Sub ПрямаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WI = ActiveWorkbook BookPath = WI.Path & "\" NameCopyBook = "Пример2.xlsx" 'необходимо ввести самому, обязательно с расширением!!! Set WB = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <> "ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI End Sub
[/vba]
И макрос ориентируется именно на названия листов. сравнивает их и если они совпадает - записывает данные. А про задачу наоборот. То вродебы данные так и копируются, но вот неоткрывая исходника как сделать, я не знаю, честно говоря, если это вообще возможно. Могу просто закрыть после копирования файл-исходник:
[vba]
Код
Sub ОбратнаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <>"ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI WI.close End Sub
Roman777, в прямой задаче данные копируются только на первые два листа, 1 и 2) Дальше не копируются.
В обратной задаче делал так: Открывал файл копию, вставлял в него код
[vba]
Код
Sub ОбратнаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <>"ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI WI.close End Sub
[/vba]
Изменял в коде "файл-исходник" на имя файла исходника, открывал файл-исходник. В файле-копии вносил изменения, закрывал файл. Затем снова открывал, запускал выполнение кода... но ничего не копировалось....(
Roman777, в прямой задаче данные копируются только на первые два листа, 1 и 2) Дальше не копируются.
В обратной задаче делал так: Открывал файл копию, вставлял в него код
[vba]
Код
Sub ОбратнаяЗадача() Dim WB As Workbook, SB As Worksheet Dim WI As Workbook, SI As Worksheet, LR As Long Dim BookPath As String Dim sovpal As Integer Set WB = ActiveWorkbook BookPath = WB.Path & "\" NameCopyBook = "Файл-исходник.xls" 'необходимо ввести самому, обязательно с расширением!!! Set WI = Workbooks.Open(BookPath & NameCopyBook) 'открываем книгу-дубликат For Each SI In WI.Worksheets 'перебираем листы в книге-источнике LR = SI.Cells(SI.Rows.Count, 3).End(xlUp).Row 'определяем количество занятых строк текущего листа For Each SB In WB.Worksheets If SB.Name <>"ИК-3" Then If SB.Name = SI.Name Then SB.Range(SB.Cells(1, 3), SB.Cells(LR, 3)) = SI.Range(SI.Cells(1, 3), SI.Cells(LR, 3)).Value 'копируем значения End If End If Next SB Next SI WI.close End Sub
[/vba]
Изменял в коде "файл-исходник" на имя файла исходника, открывал файл-исходник. В файле-копии вносил изменения, закрывал файл. Затем снова открывал, запускал выполнение кода... но ничего не копировалось....(biomirror
Сообщение отредактировал biomirror - Пятница, 24.04.2015, 14:29
Wasilic, сейчас попробовал ваш код на своем реальном файле, с которым работаю. Работает четко) По поводу ошибки при копировании файла - ее решение, которое на сайте майкрософт https://support.microsoft.com/en-us/kb/948615/ru меня не устроило, - компьютер рабочий, менять в реестре что-либо нежелательно. Я нашел следующий выход: у вас файл копия сохраняется как .xls, я сохранил как .xlsx и проблема пропала)) Еще раз спасибо)
Wasilic, сейчас попробовал ваш код на своем реальном файле, с которым работаю. Работает четко) По поводу ошибки при копировании файла - ее решение, которое на сайте майкрософт https://support.microsoft.com/en-us/kb/948615/ru меня не устроило, - компьютер рабочий, менять в реестре что-либо нежелательно. Я нашел следующий выход: у вас файл копия сохраняется как .xls, я сохранил как .xlsx и проблема пропала)) Еще раз спасибо)biomirror
Сообщение отредактировал biomirror - Пятница, 24.04.2015, 14:42
Ну дык, я же в комментариях кода и написал: fk = Mid(fa, 1, Len(fa) - 4) & "-копия" & ".xls" 'файл копия 'если расширение файла больше 3-х букоф, 4 заменить на 5
Я и менять на пять пробовал... почему-то все равно вылетает сообщение, что что-то не то, с расширением файла... Но это все мелочи)) Главное, что задача решена.
alex77755, спасибо, что первым откликнулись) Roman777, спасибо, за то что вникли в то, что мне надо и несколько раз исправляли код, Wasilic, спасибо, что наиболее простым способом решили задачу
Ну дык, я же в комментариях кода и написал: fk = Mid(fa, 1, Len(fa) - 4) & "-копия" & ".xls" 'файл копия 'если расширение файла больше 3-х букоф, 4 заменить на 5
Я и менять на пять пробовал... почему-то все равно вылетает сообщение, что что-то не то, с расширением файла... Но это все мелочи)) Главное, что задача решена.
alex77755, спасибо, что первым откликнулись) Roman777, спасибо, за то что вникли в то, что мне надо и несколько раз исправляли код, Wasilic, спасибо, что наиболее простым способом решили задачу biomirror