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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.08.2010, 20:05   #1
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
Вопрос Копирование из одной таблицы и вставка в другую

Товарищи, прошу совета как снять выделение группы строк после выполнения
Range(...).Select
Selection.Copy

Задача:
нужен макрос (для Excel 2003), вызываемой одной кнопкой, который из первой таблицы ("СПИСОК") копирует строки со второй по последнюю, и вставляет их в конец второй таблицы ("БАЗА") + 1 пустая строка (разделитель), затем выделение копированных строк снимается и активной ячейкой становиться первая в последней строке таблицы "СПИСОК".

--------------- начало кода ---------------
Код:
Public Function GetMaxRow(shtName As String)      ' определение числа используемых строк на листе
' эта функция взята где-то на форуме
    GetMaxRow = Worksheets(shtName).UsedRange.Row + Worksheets(shtName).UsedRange.Rows.Count - 1
End Function


Public Sub CopyPaste1()     ' эта функция копирует записи за сегодня и вставляет их в общую базу
    Dim maxRowSrc As Integer, maxRowTrg As Integer  ' объявление переменных

    maxRowSrc = GetMaxRow("СПИСОК")     ' определяем количество строк на листе "СПИСОК"
    maxRowTrg = GetMaxRow("БАЗА")      ' определяем количество строк на листе "БАЗА"

    Sheets("СПИСОК").Select     ' Выделяем таблицу "СПИСОК"

    Worksheets("СПИСОК").Range("2:" & maxRowSrc).Select     ' Выделяем диапазон строк со второй по последней
    Selection.Copy      ' копируем строки в буфер

    Sheets("БАЗА").Select      '  Выделяем таблицу "БАЗА"
    Cells(maxRowTrg + 2, 1).Activate    ' переходим на последнюю строку базы + 2
    Selection.PasteSpecial      ' Добавляем скопированные строки в базу

    Sheets("СПИСОК").Select     ' Возвращаемся в таблицу "СПИСОК"
    Cells(maxRowSrc + 1, 1).Activate    ' Переход на последнюю строку таблицы "СПИСОК" + 1

End Sub
--------------- конец кода ---------------


Все это вроде бы работает, но никак не могу программно снять выделение строк, как в исходной таблице "СПИСОК", так и в таблице "БАЗА".

Что я написал неправильно?

И еще хочу уточнить, как правильнее сделать таблицу (например, "СПИСОК") текущей,
Sheets("СПИСОК").Select
или
Sheets("СПИСОК").Activate

Большое спасибо за ответ!

Последний раз редактировалось Smaragdov; 21.08.2010 в 20:08.
Smaragdov вне форума Ответить с цитированием
Старый 21.08.2010, 20:46   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Ну можно, например, сделать активной какую-нибудь ячейку другую
motorway вне форума Ответить с цитированием
Старый 21.08.2010, 21:32   #3
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Цитата:
Сообщение от motorway Посмотреть сообщение
Ну можно, например, сделать активной какую-нибудь ячейку другую
Уже пытался, выделение удается снять только в таблице "СПИСОК", а в "БАЗА" все равно остается....
Smaragdov вне форума Ответить с цитированием
Старый 21.08.2010, 22:46   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

1. Снять выделение (которое после копирования) можно строкой кода
application.CutCopyMode= false

2. В вашем случае (да и вообще почти в любом коде) использование методов Select и Activate не требуется, и только усложняет код, увеличивая время выполнения макроса.


Проще и быстрее будет так:

Код:

Public Sub CopyPaste1()     ' эта функция копирует записи за сегодня и вставляет их в общую базу
    Dim maxRowSrc As Integer, maxRowTrg As Integer  ' объявление переменных

    maxRowSrc = GetMaxRow("СПИСОК")     ' определяем количество строк на листе "СПИСОК"
    maxRowTrg = GetMaxRow("БАЗА")      ' определяем количество строк на листе "БАЗА"

    ' копирование и вставка без всяких выделений - так проще и быстрее
    Worksheets("СПИСОК").Range("2:" & maxRowSrc).Copy Sheets("БАЗА").Cells(maxRowTrg + 2, 1)
End Sub
Цитата:
И еще хочу уточнить, как правильнее сделать таблицу (например, "СПИСОК") текущей,
Sheets("СПИСОК").Select
или
Sheets("СПИСОК").Activate
Без разницы. Я обычно использую Activate

Последний раз редактировалось EducatedFool; 21.08.2010 в 22:49.
EducatedFool вне форума Ответить с цитированием
Старый 21.08.2010, 23:23   #5
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Я бы UsedRange не доверял. Разве если там никто руками не работал, и таблица только растёт... См. пример.
Вложения
Тип файла: rar UsedRange.rar (6.8 Кб, 54 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.08.2010, 00:18   #6
doober
Старожил
 
Аватар для doober
 
Регистрация: 02.05.2009
Сообщений: 3,907
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Я бы UsedRange не доверял. Разве если там никто руками не работал, и таблица только растёт... См. пример.
слабый пример.
Вот здесь всем примерам пример
В файле 40 записей.Файл размером 10 метров.Фильтр умудрились поставить на диапазон А1:B1048412
Анализ,обработка данных Недорого
doober вне форума Ответить с цитированием
Старый 22.08.2010, 16:21   #7
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Большое спасибо, EducatedFool !
application.CutCopyMode = false – мне действительно помогло!

Ваша процедура копирования действительно проще и работает лучше, не мигает экран при ее выполнении.

Заметил один интересный момент – в исходной таблице "СПИСОК" на строках были несколько кнопочек, созданных для экспериментов с макросами. В Вашем примере они также скопировались в таблицу "БАЗА", а в случае предварительного выделения диапазона и копирования – они не копируются.
Это не слишком принципиально, т.к. в окончательном варианте этих кнопочек не должно быть.

Скажите, а можно ли сделать так, чтобы копировались ТОЛЬКО строки с вбитыми значениями (не пустые)?


Уважаемый Hugo121, если Вы полагаете, что не стоит использовать UsedRange, то каким же образом лучше всего определить количество строк, использованных таблице?
Smaragdov вне форума Ответить с цитированием
Старый 22.08.2010, 17:10   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Цитата:
Сообщение от Smaragdov Посмотреть сообщение
Уважаемый Hugo121, если Вы полагаете, что не стоит использовать UsedRange, то каким же образом лучше всего определить количество строк, использованных таблице?
Для столбца В
iLastrow = Range("b" & Rows.Count).End(xlUp).Row
Это если ниже в столбце B даннх нет.

Для таблицы, которая снизу отделена пробелом:
LastRow = [b9].CurrentRegion.Row + [b9].CurrentRegion.Rows.Count - 1
B9 принадлежит этой таблице.
Это если ниже ещё есть данные.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.08.2010, 18:54   #9
Smaragdov
Пользователь
 
Регистрация: 30.11.2009
Сообщений: 13
По умолчанию

Hugo121, спасибо!
Первый пример проверил - работает!

Не понял, почему во втором примере выбрана именно ячейка B9...
Smaragdov вне форума Ответить с цитированием
Старый 22.08.2010, 19:37   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Цитата:
Сообщение от Smaragdov Посмотреть сообщение
[B]
Не понял, почему во втором примере выбрана именно ячейка B9...
Потому что я проверял на данных B9:D13 (там ещё A13 что-то стукнулось, но не суть...). Т.е. берёшь любую точно известную ячейку - например в шапке таблицы - и получаешь её последний ряд. Но ниже должен быть пробел, и даже вернее вокруг должен быть пустой ряд.
Да что там - см.пример. Поиграйтесь с единицами.
Вложения
Тип файла: rar CurrentRegion.rar (6.1 Кб, 56 просмотров)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
копирование таблицы из одной базы в другую chib_sv SQL, базы данных 7 20.08.2010 07:46
Копирование и вставка формул из одной книги в другую KNatalia Microsoft Office Excel 5 10.06.2010 13:15
Копирование записей из одной таблицы в другую rockedit БД в Delphi 4 10.12.2009 21:39
Копирование поля из одной таблицы в другую(ADO) RamireZ БД в Delphi 5 17.11.2009 22:48
Копирование данных из одной таблицы в другую! фЁдОр БД в Delphi 18 06.01.2008 19:27