Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 03.05.2010, 17:35   #1
Tsvetochek
 
Регистрация: 03.05.2010
Сообщений: 8
По умолчанию как перенести опред. строки с одного листа...

Уважаемые программисты, как перенести определенные строки с одного листа на другой и чтобы они были по порядку. В общем смотрите приложение.
Вложения
Тип файла: rar Excel.rar (2.4 Кб, 62 просмотров)
Tsvetochek вне форума Ответить с цитированием
Старый 03.05.2010, 18:03   #2
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Попробуйте такой макрос:

Код:
Sub test()
    Лист1.UsedRange.Offset(1).Clear
    Dim ra As Range: Application.ScreenUpdating = False
    Set ra = Range([c2], Range("c" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    Intersect(ra.EntireRow, [a:c]).Copy Лист1.[a2]
    Лист1.Activate
End Sub
Пример в файле:

EducatedFool вне форума Ответить с цитированием
Старый 03.05.2010, 18:31   #3
Tsvetochek
 
Регистрация: 03.05.2010
Сообщений: 8
По умолчанию

Спасибо Большое, а можно написать что означает каждая строчка в макросе.
просто, чтобы мне подстроить этот код под свой отчет. Что менять нужно не совсем понимаю

Последний раз редактировалось EducatedFool; 03.05.2010 в 18:51.
Tsvetochek вне форума Ответить с цитированием
Старый 03.05.2010, 18:48   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    ' берем используемый диапазон листа1 (Лист1.UsedRange),
    ' смещаемся на одну строку вниз (чтобы не затереть заголовок) - Лист1.UsedRange.Offset(1)
    ' и очищаем всё содержимое вместе с форматированием: .Clear
    Лист1.UsedRange.Offset(1).Clear
    
    Dim ra As Range ' объявляем переменную ra как диапазон ячеек
    
    Application.ScreenUpdating = False ' отключаем обновление экрана
    
    ' берем с активного листа диапазон, начиная с ячейки [c2]
    ' и заканчивая последней заполненой ячейкой в столбце С - Range("c" & Rows.Count).End(xlUp)
    ' теперь из этого диапазона - Range([c2], Range("c" & Rows.Count).End(xlUp))
    ' берем только непустые ячейки (с константами) - .SpecialCells(xlCellTypeConstants)
    ' и заносим этот диапазон в переменную ra
    ' ( сейчас RA ссылается на диапазон ячеек "$C$3,$C$8,$C$13,$C$16,$C$19")
    Set ra = Range([c2], Range("c" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    
    ' берем строки, содержащие ячейки из ra  - ra.EntireRow
    ' и столбцы [a:c]
    ' теперь то, что находится на их пересечении - Intersect(ra.EntireRow, [a:c])
    ' копируем (.Copy) на лист1, начиная с ячейки [a2] - .Copy Лист1.[a2]
    Intersect(ra.EntireRow, [a:c]).Copy Лист1.[a2]
    
    ' активируем лист1 (чтобы увидеть результат, ведь макрос запускался с другого листа)
    Лист1.Activate
End Sub

Последний раз редактировалось EducatedFool; 03.05.2010 в 18:51.
EducatedFool вне форума Ответить с цитированием
Старый 03.05.2010, 19:15   #5
Tsvetochek
 
Регистрация: 03.05.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
Sub test()
    ' берем используемый диапазон листа1 (Лист1.UsedRange),
    ' смещаемся на одну строку вниз (чтобы не затереть заголовок) - Лист1.UsedRange.Offset(1)
    ' и очищаем всё содержимое вместе с форматированием: .Clear
    Лист1.UsedRange.Offset(1).Clear
    
    Dim ra As Range ' объявляем переменную ra как диапазон ячеек
    
    Application.ScreenUpdating = False ' отключаем обновление экрана
    
    ' берем с активного листа диапазон, начиная с ячейки [c2]
    ' и заканчивая последней заполненой ячейкой в столбце С - Range("c" & Rows.Count).End(xlUp)
    ' теперь из этого диапазона - Range([c2], Range("c" & Rows.Count).End(xlUp))
    ' берем только непустые ячейки (с константами) - .SpecialCells(xlCellTypeConstants)
    ' и заносим этот диапазон в переменную ra
    ' ( сейчас RA ссылается на диапазон ячеек "$C$3,$C$8,$C$13,$C$16,$C$19")
    Set ra = Range([c2], Range("c" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    
    ' берем строки, содержащие ячейки из ra  - ra.EntireRow
    ' и столбцы [a:c]
    ' теперь то, что находится на их пересечении - Intersect(ra.EntireRow, [a:c])
    ' копируем (.Copy) на лист1, начиная с ячейки [a2] - .Copy Лист1.[a2]
    Intersect(ra.EntireRow, [a:c]).Copy Лист1.[a2]
    
    ' активируем лист1 (чтобы увидеть результат, ведь макрос запускался с другого листа)
    Лист1.Activate
End Sub
А если у меня листы по-другому называются?
Tsvetochek вне форума Ответить с цитированием
Старый 03.05.2010, 19:53   #6
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Код:
Sub test()
    Worksheets("ИмяЛистаКудаБудутКопироватьсяДанные").UsedRange.Offset(1).Clear
    Dim ra As Range: Application.ScreenUpdating = False
    Set ra = Range([c2], Range("c" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
    Intersect(ra.EntireRow, [a:c]).Copy Worksheets("ИмяЛистаКудаБудутКопироватьсяДанные").[a2]
    Worksheets("ИмяЛистаКудаБудутКопироватьсяДанные").Activate
End Sub
При запуске макроса должен быть активен лист, содержащий исходные данные.
Как называется исходный лист - неважно.


PS: А сложно было выложить реальный файл, чтобы получить готовый универсальный макрос, который не надо было бы переделывать?
EducatedFool вне форума Ответить с цитированием
Старый 11.05.2010, 23:07   #7
Tsvetochek
 
Регистрация: 03.05.2010
Сообщений: 8
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
Код:
        Set ra = Range([c2], Range("c" & Rows.Count).End(xlUp)).SpecialCells(xlCellTypeConstants)
Он ищет только константы в этом столбце, а как прописать строку, чтобы еще и ячейки с формулой искал. Нужно добавить это: xlCellTypeformulas
Tsvetochek вне форума Ответить с цитированием
Старый 20.04.2011, 15:22   #8
niydiyin
 
Регистрация: 20.04.2011
Сообщений: 8
По умолчанию

здравствуйте!
спасибо за скрипт, он работает, но я пытаюсь сделать немного модифицированную версию и у меня не получаются кое-какие моменты.

вот мой скрипт:

Sub test()
Лист2.UsedRange.Clear
Dim ra As Range: Application.ScreenUpdating = False
Set ra = Range([c1], Range("c" & Rows.Count).End(xlUp))
ra.EntireRow.Copy Лист2.[a2]
Лист2.Activate
End Sub

в чем, собственно, у меня проблема:
1. мне надо чтобы данные вставлялись не в ячейку а2, а в с11. а если я указываю любой столбец кроме а, формула не работает.
2. мне нужно, чтобы на листе 2 появлялась только первая строка листа 1 (начиная со столбца с и до конца), а не вся таблица с листа 1.
3. после того, как я все-таки перенесу одну строку на второй лист, мне необходимо в следующей строке (то есть d11 и до конца) вставить формулу, которая по дате с первого листа ищет значение и вставляет его в соответствующий столбец

вроде все. очень надеюсь на вашу помощь
Вложения
Тип файла: rar post_218710.rar (10.9 Кб, 22 просмотров)
niydiyin вне форума Ответить с цитированием
Старый 20.04.2011, 15:35   #9
niydiyin
 
Регистрация: 20.04.2011
Сообщений: 8
По умолчанию

вот необходимая формула:

=ЕСЛИ(ВПР($B21;Лист1!$A$1:$O$15;C$1 8;ЛОЖЬ)<>"";ВПР($B21;Лист1!$A$1:$O$ 15;C$18;ЛОЖЬ);ЛОЖЬ())

и прикрепил еще экселевский файл с формулой

выручайте!
niydiyin вне форума Ответить с цитированием
Старый 20.04.2011, 15:45   #10
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
1. мне надо чтобы данные вставлялись не в ячейку а2, а в с11. а если я указываю любой столбец кроме а, формула не работает.
2. мне нужно, чтобы на листе 2 появлялась только первая строка листа 1 (начиная со столбца с и до конца), а не вся таблица с листа 1.
Реализовано:

Код:
Sub test()
    Лист2.UsedRange.Clear
    Dim ra As Range: Application.ScreenUpdating = False
    Set ra = Range([c1], Range("iv1").End(xlToLeft))
    ra.Copy Лист2.[c11]
    Лист2.Activate
End Sub
Цитата:
3. после того, как я все-таки перенесу одну строку на второй лист, мне необходимо в следующей строке (то есть d11 и до конца) вставить формулу, которая по дате с первого листа ищет значение и вставляет его в соответствующий столбец
нифига не понял.
пример сложно было сделать?

Зачем первой строкой макроса затирать ВСЁ содержимое листа2 ???
Вручную пропишите формулы и всё такое, а Лист2.UsedRange.Clear уберите, - и макрос будет заполнять на втором листе только 11-ю строку
EducatedFool вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как вытащить из таблицы одного листа нужные строки на др лист? alexabv Microsoft Office Excel 3 30.04.2010 12:08
Удаление активой строки с одного листа на другой MilanAC Помощь студентам 0 28.04.2010 22:08
скопировать дублирующие строки с одного листа на другие листы mars56 Microsoft Office Excel 22 17.02.2010 19:58
Перенести данные с одного листа на другой. albih Microsoft Office Excel 2 02.05.2009 12:55
как перенести данные с листа excel в текстовой фаил? sergey34 Microsoft Office Excel 6 02.12.2007 22:59