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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 19.10.2010, 18:17   #1
Deceased
Пользователь
 
Аватар для Deceased
 
Регистрация: 13.12.2007
Сообщений: 44
По умолчанию компоновка двух xls сравнением

Здравствуйте. Помогите пожалуйста дописать макрос.

Есть: два файла xls. В первом файле есть столбец id (с уникальным значением) и несколько других столбцов, во втором файле такая же структура.
требуется: скомпоновать эти два файла таким образом, чтобы происходила проверка: если из второго файла поле id совпадает с полем id из первого файла, то другие ячейки в этой строке из второго файла добавить в первый файл напротив соответствующего id. Если есть id во втором файле, которого в первом файле нет, то нужно добавить в первый файл эту новую строку с id и другими полями.

Мой код только тупо сравнивает, и если находит соответствующий айдишник - копирует данные.
Код:
Sub new()
Dim x1, x2 As Object
Dim i, j As Long
check = False
Set x1 = Workbooks.Open("C:\xl\12.xls")
Set x2 = Workbooks.Open("C:\xl\11.xls")
i = 0
j = 0
For J = 2 To 30 ' известное количество строк в первом файле
  For i = 2 To 16 ' известное количество строк во втором файле
    If x1.Sheets(1).Cells(i, 1) = x2.Sheets(1).Cells(j, 2) Then
     x2.Sheets(1).Cells(j, 3) = x1.Sheets(1).Cells(i, 2)
... ' и другие нужные ячейки копируем
...
    End If
  Next i
Next J
End Sub
А как написать на вставку новой строки, если он не нашёл нужного айдишника среди имеющихся?
Deceased вне форума Ответить с цитированием
Старый 19.10.2010, 18:21   #2
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Вставка пустой строки делается подобным образом:
Код:
Rows("11:11").Select
Selection.Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove
motorway вне форума Ответить с цитированием
Старый 19.10.2010, 18:38   #3
Deceased
Пользователь
 
Аватар для Deceased
 
Регистрация: 13.12.2007
Сообщений: 44
По умолчанию

извините, непонял ничего

мне нужно чтобы если он не находит в первом файле айдишника, который он берёт из второго файла, то строку с этим айдишником добавлял в первый файл в конец.
Deceased вне форума Ответить с цитированием
Старый 19.10.2010, 18:50   #4
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Принцип такой:
Код:
x1.Sheets(1).Rows("6:6").Select ' выделяете нужную строку, ее айди ' определяете, как вам нужно
    Selection.Copy
    x2.Sheets(1).Rows("7:7").Select ' а здесь вставляете на нужную строку во втором файле, ее номер тоже определяете сами
    Selection.Insert Shift:=xlDown
Номер последней строки можно определить с помощью отдельной функции, на форуме она была
motorway вне форума Ответить с цитированием
Старый 19.10.2010, 19:34   #5
Deceased
Пользователь
 
Аватар для Deceased
 
Регистрация: 13.12.2007
Сообщений: 44
По умолчанию

теперь я вас понял, но вы меня к сожалению нет.
Мой вопрос не в том, как скопировать строку.
Вопрос в том, как поставить условие - "Если данного айдишника нет среди айдишников в первом документе, то.."
Deceased вне форума Ответить с цитированием
Старый 19.10.2010, 19:39   #6
motorway
Участник клуба
 
Регистрация: 28.06.2009
Сообщений: 1,950
По умолчанию

Насколько я понял, у вас получилось определить, если он есть. Ну а если его нет, то надо поставить Else в условии для If, разве не так?
motorway вне форума Ответить с цитированием
Старый 19.10.2010, 20:24   #7
Deceased
Пользователь
 
Аватар для Deceased
 
Регистрация: 13.12.2007
Сообщений: 44
По умолчанию

догадался сделать через флаг, который показывает нашёл он нужный айди или не нашёл, и если не нашёл то добавляет нужную строчку в последнюю строку (all), которую мы прописываем изначально, мы знаем количество строк так что нам не надо ничего определять.

может написал не очень умнО, но вроде работает..
Код:
Sub new()
Dim x2, x1 As Object
Dim i, j, all As Long
Dim flag As Boolean
check = False
Set x1 = Workbooks.Open("C:\xl\12.xls")
Set x2 = Workbooks.Open("C:\xl\11.xls")
i = 0
j= 0
all = 36082 ' первая пустая строчка в итоговом файле
  For i = 2 To 16 ' строки для сравнения во втором файле

flag = False
For j = 2 To 36 ' строки для сравнения в первом файле
    If x1.Sheets(1).Cells(i, 1) = x2.Sheets(1).Cells(kol, 2) Then
     x2.Sheets(1).Cells(kol, 3) = x1.Sheets(1).Cells(i, 2)
... ' и другие ячейки копируем
     flag = True ' флаг показывает что идентишный айдишник найден
     GoTo ok ' если нашли одинаковый айдишник и скопировали ячейку, то сразу начинаем поиск следующей ячейки в новом кругу цикла
     End If

  Next j
  
If flag = True Then ' если флаг показывает что пройдя все айдишники идентичный найден, то идём на новый круг цикла, ..
GoTo ok
Else ' иначе - добавляем строку с текущим айдишником в конец
     x1.Sheets(1).Cells(all, 3) = x2.Sheets(1).Cells(i, 2)
... ' и другие ячейки

     all = all + 1 ' определяем следующую пустую строку
End If
ok:
Next i

End Sub
Deceased вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как сравнить данные в двух файлах .xls SlavenGVO Microsoft Office Excel 6 07.03.2011 16:48
Линкование двух xls файлов the_moon Microsoft Office Excel 3 15.03.2010 01:07
Запарка со сравнением текста BRcr Microsoft Office Excel 12 12.02.2010 15:48
Не могу разобраться с сравнением 2-х двумерных масивов на совпадения текста tj_pablo Общие вопросы C/C++ 0 11.03.2009 22:21
как присвоить значение ячейки R1C1 из 1.xls, допустим какой-нибудь любой ячейке из 2.xls ? diabloskrk Microsoft Office Excel 3 08.10.2007 12:27