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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 23.03.2010, 08:07   #1
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию Копирование данных из одной книги в другую в разные столбцы.

Уважаемые форумчане, здравствуйте. Помогите пожалуйста. Мне нужно макросом скопировать данные из книги1 в книгу2, но только те строки, которые, например, помечены буквой «а» в столбце 1. Но не все данные, а по именам столбцов, либо, четко прописать из столбца 3 в столбец 5, из 4 в 8. Перед добавлением строки проверить, есть ли совпадение в книге2 по столбцу 5 со вставляемыми данными из столб.3 кн.1. Копируемые строки надо добавлять ниже существующих строк (создавать новые строки). Пробовала поискать на форуме похожее, не нашла, не подходит либо одно, либо другое.
kipish_lp вне форума Ответить с цитированием
Старый 23.03.2010, 08:34   #2
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Посмотрите вложение. Откройте оба файла и запустите макрос "Main".
Вложения
Тип файла: rar Пример.rar (12.6 Кб, 157 просмотров)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 23.03.2010, 14:36   #3
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Спасибо, замечательно работает.
kipish_lp вне форума Ответить с цитированием
Старый 23.03.2010, 15:35   #4
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

При дальнейшем использовании макроса появляются ошибки, то копирует повторяющиеся строки, то весь диапазон, независимо от "а", то заголовок таблицы
Может быть ошибка в этой строке?
Код:
          Set y = .[C:C].Find(what:=Cells(cell.Row, 3), LookAt:=xlWhole)
Что она делает?
Вложения
Тип файла: rar Пример1.rar (12.9 Кб, 27 просмотров)
kipish_lp вне форума Ответить с цитированием
Старый 24.03.2010, 06:24   #5
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
При дальнейшем использовании макроса появляются ошибки, то копирует повторяющиеся строки, то весь диапазон, независимо от "а", то заголовок таблицы
Это Вы про какой макрос? Вы его переделали, сделав "кучу" ошибок и предъявляете претензии.
Давайте рассмотрим фрагмент Вашего кода:
Код:
Set y = .[C:C].Find(what:=Cells(cell.Row, 3), LookAt:=xlWhole)
If y Is Nothing Then
    i = .Cells(Rows.Count, 3).End(xlUp).Row + 1
    .Cells(i, 5) = Cells(cell.Row, 1): .Cells(i, 5) = Cells(cell.Row, 2)
    .Cells(i, 3) = Cells(cell.Row, 3): .Cells(i, 8) = Cells(cell.Row, 4)
    .Cells(i, 3) = Cells(cell.Row, 5): .Cells(i, 1) = Cells(cell.Row, 6)
    .Cells(i, 4) = Cells(cell.Row, 7): .Cells(i, 7) = Cells(cell.Row, 8)
End If
Глядя на него, я так и не смог понять, чего Вы хотите.
1. Вы ищите значение текущей строки 1-й книги 3-го столбца в 3-м столбце 2-й книги (помечено красным). И, если такого нет, то переносите требуемые значения. Так и надо?
2. В процессе переноса значений Вы в одну и ту же ячейку вставляете несколько раз разные значения (помечено красным). Зачем этот "винегрет"?

Либо исправьте самостоятельно, либо подробно опишите, что требуется.
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 24.03.2010, 08:55   #6
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Уважаемый SAS888!
Когда переделывала под себя, запуталась. Извините пожалуйста. Ошибки исправила. Просто в нужном файле у меня очень много столбцов, где-то в одинаковый столбец данные копировать надо, где-то в разные. Я претензий не предъявляла, просто не могла сама найти ошибку, а спотыкалась на той строке. Еще раз, извините пожалуйста!
kipish_lp вне форума Ответить с цитированием
Старый 24.03.2010, 09:44   #7
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
где-то в одинаковый столбец данные копировать надо, где-то в разные
Все равно, не понятно. Зачем в ячейку копируется одно значение, а следующей командой - в эту же ячейку заносится другое значение, причем безусловно.
Код:
.Cells(i, 5) = Cells(cell.Row, 1): .Cells(i, 5) = Cells(cell.Row, 2)
Чем шире угол зрения, тем он тупее.
SAS888 вне форума Ответить с цитированием
Старый 24.03.2010, 10:06   #8
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Те ошибки, которые вы увидели - это моя невнимательность, причем, проверяла все, кроме ошибок (ну, бывает, не у всех, но бывает). А в книге надо: кн1 столб2 --> кн2 столб2; кн1 ст3 --> кн2 ст3; кн1 ст4 --> кн2 ст8; кн1 ст5 --> кн2 ст15 и т.д. Много.
А можно еще вопрос. Почему "Hidden"
Код:
    [I:I].ColumnDifferences([I:I].Find("a")).EntireRow.Hidden = True
не работает, когда на листе кнопки с запрещением изменения размера в формате объекта?
kipish_lp вне форума Ответить с цитированием
Старый 24.03.2010, 10:44   #9
SAS888
Старожил
 
Аватар для SAS888
 
Регистрация: 05.12.2007
Сообщений: 4,180
По умолчанию

Цитата:
А в книге надо: кн1 столб2 --> кн2 столб2; кн1 ст3 --> кн2 ст3; кн1 ст4 --> кн2 ст8; кн1 ст5 --> кн2 ст15 и т.д. Много.
Все можно сделать просто. Так, например, для тех столбцов, которые Вы указали:
В начале макроса добавим определения:
Код:
Dim j As Integer, a(): a = Array(0, 0, 2, 3, 8, 15)
А в коде, блок вставки значений заменить на
Код:
If y Is Nothing Then
    i = .Cells(Rows.Count, 5).End(xlUp).Row + 1
    For j = 2 To 5: .Cells(i, a(j)) = Cells(cell.Row, j): Next
End If
где каждому значению j (столбец книги 1) соответствует элемент массива a(j) (столбец книги 2). Обратите внимание, что счет элементов массива начинается с 0, а цикл For...Next начинается с 2, поэтому в массиве a первые 2 элемента =0 (просто, они не используются).

Цитата:
А можно еще вопрос. Почему "Hidden"
Такой подход позволяет выбрать требуемые значения без использования цикла. Метод ColumnDifferences выделяет ячейки с значениями не равными искомым [I:I].Find("a"). А нам нужно наоборот. Поэтому, скрываем все, которые определены методом ColumnDifferences, и работаем с видимой областью. Изначально, никаких ограничений на этот счет не было. Если Вас по каким-либо причинам это не устраивает - давайте переделаем (будет менее изящно).
Чем шире угол зрения, тем он тупее.

Последний раз редактировалось SAS888; 24.03.2010 в 10:50.
SAS888 вне форума Ответить с цитированием
Старый 24.03.2010, 13:04   #10
kipish_lp
Форумчанин
 
Регистрация: 25.11.2009
Сообщений: 113
По умолчанию

Цитата:
первые 2 элемента =0 (просто, они не используются).
А почему не используются, если надо в столб2 кн2 добавить значение столб2 кн1?
И все-таки конкретно прописать что в какую ячейку вставить работает корректней. А так он выводит подряд по столбцам, а у меня надо вразноброс.
А "изящность" с "Hidden" меня вполне устраивает, просто кнопки с листа убрала на стандартную панель. А почему кнопки мешают? Они фиксируют строки что-ли?
kipish_lp вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование и вставка формул из одной книги в другую KNatalia Microsoft Office Excel 5 10.06.2010 13:15
Копирование данных из одной рабочей книги в другую макросом. Andrey3055 Microsoft Office Excel 2 30.10.2009 22:00
Сложное копирование из одной книги в другую kzld Microsoft Office Excel 12 15.07.2009 11:56
Помогите с интеграцией данных из одной книги в другую. Lexeron Microsoft Office Excel 5 05.03.2009 13:01
Копирование данных из одной таблицы в другую! фЁдОр БД в Delphi 18 06.01.2008 19:27