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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 21.03.2012, 11:50   #1
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
Вопрос поиск и копирование данных между листами в 2 книгах

Здравствуйте Ув. форумчане. Столкнулся с проблемой, поиска и копирования данных между двумя книгами по определенным листам. У меня есть пример поиска и копирования данных между двумя книгами и двумя листами. но как сделать грамотно чтобы искало и копировало по нескольким листам, я не могу понять. Прошу помощи. В файлике описал более конкретнее что у меня не получается.
Заранее огромное спасибо!

Забыл сказать, что описание проблемы в книге Основная на первом листе
Вложения
Тип файла: rar Copy.rar (18.9 Кб, 13 просмотров)
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 21.03.2012 в 11:54.
staniiislav вне форума Ответить с цитированием
Старый 21.03.2012, 12:19   #2
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Если есть код копирования между двумя листами разных книг - просто выполняйте его 3 раза, меняя листы.
Можно пройтись циклом по всем листам одной книги, копируя с аналогичного листа другой книги (нужно позаботится, чтоб была пара).
Смотрю, повторов дат быть не должно?
Тогда я бы занёс даты одного листа (в котором ищем) в словарь, в Item словаря позицию этой даты в исходном массиве (ну или сразу данные через разделитель).
Далее циклом по данным, которые ищем, сразу из словаря брал сохранённую позицию, из массива данные (или из Item словаря).
Ну и так столько раз, сколько пар листов - каждый раз новые массивы и словарь.
Но я бы не брал данные "при двух открытых книгах" - лучше кодом открывать вторую книгу, в диалоге или прямо указав путь.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.03.2012, 12:58   #3
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Если есть код копирования между двумя листами разных книг - просто выполняйте его 3 раза, меняя листы.
Можно пройтись циклом по всем листам одной книги, копируя с аналогичного листа другой книги (нужно позаботится, чтоб была пара).
Смотрю, повторов дат быть не должно?
Тогда я бы занёс даты одного листа (в котором ищем) в словарь, в Item словаря позицию этой даты в исходном массиве (ну или сразу данные через разделитель).
Далее циклом по данным, которые ищем, сразу из словаря брал сохранённую позицию, из массива данные (или из Item словаря).
Ну и так столько раз, сколько пар листов - каждый раз новые массивы и словарь.
Но я бы не брал данные "при двух открытых книгах" - лучше кодом открывать вторую книгу, в диалоге или прямо указав путь.
Hugo121 посмотрите пример пожалуйста, но пример еще ищет и столбец в который копировать. Как можно сделать по всем листам (в оригинальном файле 33 листа)
Спасибо за ответ!

Смотрю, повторов дат быть не должно? : в книги оригинал даты на год, в книге пт на каждом листе разные дата, и они меняются после достижения 50 дней, через 10 дней еще 50 новых дат. Вот почему нужен макрос, в противном случаи использовал бы ВПР или ИНДЕКС(ПОИСКПОЗ))...

Но я бы не брал данные "при двух открытых книгах" - лучше кодом открывать вторую книгу, в диалоге или прямо указав путь. : стоит проверка на открытие книги, это сделано чтобы не запускался макрос если книга уже открыта, пытался сделать условие если уже открыта то делать так... но через раз работало, так и не понял в чем была проблема...

спасибо, и кстати как убрать в коде проверку на поиск по столбцам?
Вложения
Тип файла: rar Copy.rar (35.2 Кб, 13 просмотров)
Единственный способ стать умнее, играть с более умным противником...

Последний раз редактировалось staniiislav; 21.03.2012 в 13:06.
staniiislav вне форума Ответить с цитированием
Старый 21.03.2012, 13:24   #4
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Таймаут, работой завалили... Некогда серьёзно вникать
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.03.2012 в 13:44.
Hugo121 вне форума Ответить с цитированием
Старый 21.03.2012, 13:36   #5
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Таймаут, работой завалили... Некогда серъёзно вникать
не вопрос ))) спасибо что откликнулись, будет время, посмотрите пожалуйста.
Спасибо!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 21.03.2012, 14:07   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,166
По умолчанию

Попробуйте так - добавил цикл по листам (но если будут другие листы - диаграмм или макросов, то всё рухнет!):

Код:
Sub Copyy()
    If bBookOpen("пт.xls") Then
        'If TypeName(Range("A2").Value) = "Empty" Then
        '    MsgBox "Вы не выбрали № корпуса. Сначало выберите № корпуса!"
        '    Range("A2").Activate
        '    Exit Sub
        '    Else
        If MsgBox("Скопировать ?", vbYesNo, "Подтверждение") = vbYes Then
            Dim i%, objSheet(1) As Object, x As Object, sIndex As Byte
            For sIndex = 1 To ThisWorkbook.Sheets.Count
                Set objSheet(0) = Workbooks("пт.xls").Sheets(sIndex)
                Set objSheet(1) = ThisWorkbook.Sheets(sIndex)
                Application.EnableEvents = False    'Не обрабатывать события.
                Application.ScreenUpdating = False    'Отключить перерисовку объектов на экране, чтобы ничего не мигало.
                Application.Calculation = xlCalculationManual    'Выключить расчет. Внимание, если макрос прерваляс посреди работы, то расчет так и останется в ручном режиме!
                With CreateObject("Scripting.Dictionary")
                    objSheet(1).Unprotect ""
                    For Each x In objSheet(0).Columns(1).SpecialCells(xlCellTypeConstants)
                        If x.Value <> "" Then .Add x.Value, x.Address
                    Next
                    i = objSheet(1).UsedRange.Find(objSheet(0).[A1].Value, LookIn:=xlValues).Column
                    For Each x In objSheet(1).Columns(1).SpecialCells(xlCellTypeConstants)
                        If .Exists(x.Value) Then
                            'objSheet(0).Range(.Item(x.Value)).Offset(, 4).Copy objSheet(1).Cells(x.Row, i)
                            objSheet(0).Range(.Item(x.Value)).Offset(, 2).Copy
                            objSheet(1).Cells(x.Row, i).PasteSpecial Paste:=xlPasteValues
                            objSheet(1).Cells(x.Row, i).PasteSpecial Paste:=xlPasteFormats
                        End If
                    Next
                    objSheet(1).Protect ""
                End With
                Application.Calculation = xlCalculationAutomatic    'Выключить расчет. Внимание, если макрос прерваляс посреди работы, то расчет так и останется в ручном режиме!
                Application.ScreenUpdating = True    'Отключить перерисовку объектов на экране, чтобы ничего не мигало.
                Application.EnableEvents = True    'Не обрабатывать события.
                MsgBox "Копирование листов " & sIndex & " завершено."
        Next sIndex
            End If
            'End If
        
    Else


        MsgBox "Книга [пт] закрыта. Для продолжения работы откройте [пт]!", vbInformation, "Сообщение"
    End If

End Sub

'ActiveSheet.DisplayPageBreaks = True ' Отображение границ страниц, тоже почему-то помогает.
'Application.DisplayStatusBar = True 'В статусной строке выводятся различные данные, что замедляет работу, отключаем.
'Application.DisplayAlerts = True 'Это если нужно. Выключает сообщения Экселя. Например, мы делаем Workbook.Close,
'Эксель хочет спросить сохранить ли изменения. При выключении этого параметра все ответы будут даны автоматически (изменения не сохранятся).
P.S. Добавил ThisWorkbook - т.к. у меня после конвертера имя изменилось на непрописываемое
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 21.03.2012, 14:30   #7
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Ок, буду что-то придумывать! Спасибо огромное!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Копирование данных между листами с условием igorMalov Microsoft Office Excel 3 24.02.2012 11:03
Переход между листами Fezdipekla Microsoft Office Excel 2 14.06.2010 20:27
Поиск данных по условиям соответствия и копирование Игор41 Microsoft Office Excel 7 10.06.2010 23:23
поиск/копирование данных в edit kate158 Компоненты Delphi 4 24.09.2009 16:58
Excel глюкает из-за большого количества формул и связей между листами? Diva Microsoft Office Excel 1 07.08.2008 11:52