Страницы: 1
RSS
VBA копирование ячеек между листами без переключения листов
 
Коллеги, здравствуйте.  
 
Нужна помощь с копированием ячеек между разными листами при помощи VBA. Скажем я нахожусь на Sheet1 и хочу скопировать ячейку А1 на этом листе в Sheet2 ячейки В1:В10, причем не переключаясь между листами. Код Worksheets(“Sheet1”).Range(“A1”).Copy Worksheets(“Sheet2”).Range(“B1:10”) не работает, выдает Application-defined or object-defined error. Если же дописать строчку переключения между листами, все работает, но хотелось бы знать можно ли это сделать без переключения.  
 
Заранее благодарен за помощь.
 
Можно. Конструкцию With - End With применить.
 
{quote}{login=Юрий М}{date=28.07.2009 11:57}{thema=}{post}Можно. Конструкцию With - End With применить.{/post}{/quote}  
 
Юрий,  
 
Большое спасибо за быстрый ответ. Не могли бы вы, пожалуйста, по-подробнее объяснить ваше решение, не совсем понимаю.
 
Проверьте вот такой код:  
Sub CopyFromSheetToSheet()  
  With Sheets("Лист2")  
     Range("A1").Copy .Range("B1:B10")  
  End With  
End Sub
 
Юрий, большущее вам спасибо за столь оперативный ответ. Ваш код работает на приведенном мною примере, однако, когда я пытаюсь применить его в своем файле, все равно возникает ошибка.  
 
В связи с этим я решил прикрепить файл с которым я работаю. По сути дела мне надо преобразовать данные, содержащиеся на Листе 1 согласно примеру на Листе 2. Проблема у меня возникает, когда я пытаюсь перенести информацию из 3ий строки (Period X) на Лист 2 в Столбец J. Я попробовал конструкцию With – End With, предложенную Юрием, но она не сработала.    
 
Sub Reformatin_Fcst_with_Jugmt()  
   Dim i As Integer, rgX As Range, rgX2 As Range, DetFields As Range  
   Dim intNumRow As Integer, intNumRow2 As Integer, intNumCol As Integer  
     
   Worksheets("Sheet2").Cells.Clear  
   Worksheets("Sheet2").Range("B1").Value = "Project + Period"  
   Worksheets("Sheet2").Range("C1").Value = "WBS Org Level 2"  
   Worksheets("Sheet2").Range("D1").Value = "Project"  
   Worksheets("Sheet2").Range("E1").Value = "Project2"  
   Worksheets("Sheet2").Range("F1").Value = "PRJ Customer2"  
   Worksheets("Sheet2").Range("G1").Value = "PRJ Resp Person2"  
   Worksheets("Sheet2").Range("H1").Value = "PRJ Admin2"  
   Worksheets("Sheet2").Range("I1").Value = "Fiscal Quarter"  
   Worksheets("Sheet2").Range("J1").Value = "Fiscal year/period"  
   Worksheets("Sheet2").Range("K1").Value = "Plan Revenue"  
   Worksheets("Sheet2").Range("L1").Value = "Plan Total Incurred Cost"  
   Worksheets("Sheet2").Range("M1").Value = "EGM%"  
     
   Set rgX = Range("a1").End(xlDown).Offset(-1)  
   Set rgX2 = Worksheets("Sheet2").Range("a2")  
   intNumRow = Range("a1").End(xlDown).CurrentRegion.Rows.Count  
   Set DetFields = Range(Cells(Range("a1").End(xlDown).Row + 1, 1), Cells(intNumRow, 5))  
   For i = 1 To Application.WorksheetFunction.CountIf(Rows("3:3"), "Period*")  
       Set rgX = Rows("3:3").Find(What:="Period", After:=rgX)  
       DetFields.Copy Worksheets("Sheet2").Cells(rgX2.Row, rgX2.Column + 2)  
       Range(Cells(rgX.Row + 2, rgX.Column), Cells(intNumRow, rgX.Column + 1)).Copy _  
       Worksheets("Sheet2").Cells(rgX2.Row, rgX2.Column + 10)  
       intNumRow2 = rgX2.Offset(0, 2).End(xlDown).CurrentRegion.Rows.Count  
         
       With Sheets("Sheet2")  
           rgX.Copy .Range(Cells(rgX2.Row, rgX2.Column + 9), Cells(intNumRow2, rgX2.Column + 9))  
       End With  
     
       Set rgX2 = Worksheets("Sheet2").Cells(intNumRow2 + 1, 1)  
   Next i  
End Sub  
 
Может у меня руки кривые, помогите, пожалуйста. Мне принципиально скопировать без переключения листов, поскольку у меня достаточно много листов, и поэтому с переключением, даже с выключенным ScrenUpdate это займет много времени. Спасибо.
 
вот файл с прикрепленным макросом
 
Не нашёл в Вашем файле кода. Попробуйте поменять строку на такую:  
rgX.Copy Range(.Cells(rgX2.Row, rgX2.Column + 9), .Cells(intNumRow2, rgX2.Column + 9))
 
Юрий, вы гений, все заработало, спасибо вам огромное. Последняя просьба, не могли бы вы пояснить, пожалуйста, в чем разница между  
rgX.Copy .Range(Cells(rgX2.Row, rgX2.Column + 9), Cells(intNumRow2, rgX2.Column + 9))  
и  
rgX.Copy Range(.Cells(rgX2.Row, rgX2.Column + 9), .Cells(intNumRow2, rgX2.Column + 9))  
То что точки в разных местах стоят, я заметел, но почему в одном случае все работает, а в другом нет?  
 
Или может ткнете носом, где можно почить про это. Еще раз большое вам спасибо
 
Насчёт Гения - это Вы загнули :-)  
Про точки. Когда применяем конуструкцию With - End With, то ячейки нужно начинать с точки. Это примерно так:  
Sheets("Лист1").Cells(1, 1)  
Но ведь мы Sheets("Лист1") указали выше - With Sheets("Лист1"), значит от выражения Sheets("Лист1").Cells(1, 1) остаётся только .Cells(1, 1)  
Вот так, в общем виде.
 
Во избежание недаразумений в будущем, я бы добавил еще одну точку ;-)  
 
rgX.Copy .Range(.Cells(rgX2.Row, rgX2.Column + 9), .Cells(intNumRow2, rgX2.Column + 9))  
 
Объект Range не может содержать объекты Cells принадлежащие другому листу :-)
KL
 
Кирилл, но ведь без точки перед диапазоном работает. В каком случае ждать неприятностей?
 
{quote}{login=Юрий М}{date=29.07.2009 01:47}{thema=}{post}Кирилл, но ведь без точки перед диапазоном работает. В каком случае ждать неприятностей?{/post}{/quote}  
Просто повезло, что совпали обстоятельства, но...  
 
Навскидку:  
1) Если сам код находится в модуле "Лист1", а With... работает с "Лист2", то получится:  
 
rgX.Copy Worksheets("Лист1").Range(Worksheets("Лист2").Cells(rgX2.Row, rgX2.Column + 9), Worksheets("Лист2").Cells(intNumRow2, rgX2.Column + 9))  
 
что - нонсенс  
 
2) Если сам код находится в стандартном модуле, активный лист - "Лист1", а With... работает с "Лист2", то получится:  
 
rgX.Copy Worksheets("Лист1").Range(Worksheets("Лист2").Cells(rgX2.Row, rgX2.Column + 9), Worksheets("Лист2").Cells(intNumRow2, rgX2.Column + 9))  
 
что также - нонсенс
 
Предыдущий пост мой :-)
KL
 
{quote}{login=}{date=29.07.2009 02:54}{thema=Re: }{post}{quote}{login=Юрий М}{date=29.07.2009 01:47}{thema=}{post}Кирилл, но ведь без точки перед диапазоном работает. В каком случае ждать неприятностей?{/post}{/quote}  
Просто повезло, что совпали обстоятельства{/post}{/quote}  
Какие обстоятельства совпали?  
В стандартном модуле код:  
Sub Test()  
  With Sheets("Лист2")  
     Cells(1, 1).Copy Range(.Cells(1, 2), .Cells(10, 2))  
  End With  
End Sub  
Работает корректно и с точкой перед Range и без неё. Вот я и хотел уточнить: когда ждать неприятностей? :-))
 
{quote}{login=Юрий М}{date=29.07.2009 05:26}{thema=Re: Re: }{post}Какие обстоятельства совпали?  
В стандартном модуле код:  
Sub Test()  
  With Sheets("Лист2")  
     Cells(1, 1).Copy Range(.Cells(1, 2), .Cells(10, 2))  
  End With  
End Sub  
Работает корректно и с точкой перед Range и без неё. Вот я и хотел уточнить: когда ждать неприятностей? :-)){/post}{/quote}  
Проверил. Признаю свою ошибку. Судя по всему, лист объекта Range определяется листом объектов Cells в него входящих :-)
KL
 
Кирилл, спасибо. Вот только осталось последнее: почему точка перед диапазоном (если она не нужна) не приводит к ошибке? Т.е., как я говорил,- работает и так и эдак.
 
{quote}{login=Юрий М}{date=29.07.2009 06:05}{thema=}{post}Кирилл, спасибо. Вот только осталось последнее: почему точка перед диапазоном (если она не нужна) не приводит к ошибке? Т.е., как я говорил,- работает и так и эдак.{/post}{/quote}  
Меня-то как раз удивляет, почему Range(.Cells(),.Cells()) не приводит к ошибке, а в .Range(.Cells(),.Cells()), по-моему, все до безобразия логично :-)
KL
 
У меня как-то раз была ситуация, когда без точки перед Range работало некорректно, Но не могу вспомнить, что за условия были.
Страницы: 1
Читают тему
Наверх