|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2010 - "Прикрутить" столбец из другого файла с условием |
|
|
2010 - "Прикрутить" столбец из другого файла с условием
|
Старожил Сообщения: 329 |
Всем привет. Есть задачка:
имеется 2 файла: в 1м файле перечень во 2м файле перечень и еще один столбец. Необходимо к перечню 1го файла прикрутить тот столбец что во втором файле, учитывая что перечни не полностью совпадают и расположение совпадающих различно. Пример прилагаетсяв трех файлах:1й файл,2й файл и результирующий. Ошибочный итоговый файл был Вот верный. Реализовать надо в макросе.. В общем все сводится к тому что: есть список(файл1) и есть база (файл2).Из базы в список копируются необходимые данные, если не совпали,то пропускается(остаётся пустая ячейка) |
|
Отправлено: 16:21, 25-01-2016 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Вот кривой, помогите поправить и доделать с переносом на новый лист по причине того что встречается несколько раз одно обозначение с разными данными
Sub osnastka() Application.ScreenUpdating = False i = 2 ' работаем с активной книгой sWhatFind2 = "Обозначение" Cells.Find(What:=sWhatFind2, After:=ActiveCell, SearchOrder:=xlByColumns).Activate ncolumn2 = ActiveCell.Column ' нашли столбец с обозначением Columns(ncolumn2 + 1).Insert 'вставляем столбец справа Cells(1, ncolumn2 + 1).Value = "Инструм." 'вставляем заголовок столбца ' работаем с "базой" sWhatFind = "№ детали" sWhatFind3 = "Инструм." n = ThisWorkbook.Path & "" & "Оснастка.xlsx" Set s = GetObject(n) Set ndetali = s.Worksheets(1).Cells.Find(What:=sWhatFind, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows) k = ndetali.Column Set ninstrum = s.Worksheets(1).Cells.Find(What:=sWhatFind3, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows) l = ninstrum.Column MsgBox "cell= " & Cells(i, k).Value 'цикл Do While Cells(i, ncolumn2).Value <> Empty 'поставил на "Обозначение" т.к. обрывался на пустой ячейке If Cells(i, k).Value Like Cells(i, ncolumn2).Value Then Cells(i, ncolumn2 + 1).Value = s.Worksheets(1).Cells(i.Row, l) End If i = i + 1 Loop s.Close SaveChanges:=False 'закрываем файл без сохранения End Sub |
Отправлено: 13:45, 26-01-2016 | #2 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Вот для большей ясности
|
Последний раз редактировалось blackeangel, 03-04-2017 в 22:53. Отправлено: 13:48, 26-01-2016 | #3 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
Updated: Один из способов реализовать стандартными способами: в файле 1файл выберите: вкладка "Данные", группа "Получение внешних данных", кнопка "Существующие подключения". В диалоге нажмите кнопку "Найти другие...", в следующем диалоге выберите файл 2файл, лист 1. Способ вставки - таблица, место вставки - новый лист, в свойствах нужно выставить частоту обновлений (только при открытии, каждые 10 минут и т.п.). Данные второго свяжутся с файлом 1 и автоматически будут обновляться , даже если второй файл закрыт. Соответственно в столбец "Закуска" файла 1файл нужно вбить формулу "=ЕСЛИОШИБКА(ВПР(A7;Таблица__2файл;4;ЛОЖЬ);"")" При изменении данный в вашем втором файле соответственно изменится заполнение в фале №1. Для файла "оснастка.xlsx" можно сделать по аналогии. |
|
Последний раз редактировалось a_axe, 27-01-2016 в 11:53. Отправлено: 09:31, 27-01-2016 | #4 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Цитата a_axe:
|
|||
Отправлено: 23:48, 29-01-2016 | #5 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
Код должен храниться в рабочей книге, куда вы хотите скопировать данные. Оба файла должны быть открыты, кроме них рабочих книг открывать нельзя. Логика следующая - код будет копировать данные в ту книгу, где хранится он сам, источником он считает вторую открытую книгу. Заголовки хранятся в строке №1 каждого файла. Столбец с данными для копирования должен иметь номер на единицу больше, чем столбец "№ детали" в файле источнике. Код
Public Sub osn() Dim dataBook As Workbook Dim dataSheet As Worksheet Dim myCell As Range Dim i As Integer, j As Integer If Application.Workbooks.Count = 2 Then For Each dataBook In Application.Workbooks If dataBook.Name <> ThisWorkbook.Name Then Set dataSheet = dataBook.ActiveSheet Next i = dataSheet.Rows(1).Find(What:="№ детали", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column j = ThisWorkbook.ActiveSheet.Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column + 1 Debug.Print dataSheet.Name Debug.Print i & " " & j For Each myCell In Intersect(ThisWorkbook.ActiveSheet.UsedRange, ThisWorkbook.ActiveSheet.Columns(j)) On Error Resume Next Err.Clear myCell.Value = Application.WorksheetFunction.VLookup(myCell.Offset(0, -1).Value, _ Range(dataSheet.Cells(1, i), dataSheet.Cells(dataSheet.UsedRange.Count, i + 1)), 2, False) If Err.Number <> 0 Then myCell.Value = "" Next ThisWorkbook.ActiveSheet.Cells(1, j).Value = "Инструм." Else MsgBox "Должно быть открыто 2 файла." End If Set dataSheet = Nothing End Sub |
|
Отправлено: 19:42, 30-01-2016 | #6 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Я сделал вот так
Скрытый текст
Sub osnastka() Application.ScreenUpdating = False i = 2 ' работаем с активной книгой sWhatFind2 = "Обозначение" Cells.Find(What:=sWhatFind2, After:=ActiveCell, SearchOrder:=xlByColumns).Activate ncolumn2 = ActiveCell.Column ' нашли столбец с обозначением Columns(ncolumn2 + 1).Insert 'вставляем столбец справа Cells(1, ncolumn2 + 1).Value = "Инструм." 'вставляем заголовок столбца ' работаем с "базой" sWhatFind = "№ детали" sWhatFind3 = "Инструм." n = ThisWorkbook.Path & "" & "оснастка.xlsx" Set s = GetObject(n) Set ndetali = s.Worksheets(1).Cells.Find(What:=sWhatFind, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows) k = ndetali.Column Set ninstrum = s.Worksheets(1).Cells.Find(What:=sWhatFind3, LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows) l = ninstrum.Column 'MsgBox "cell= " & Cells(i, k).Value 'цикл lLR = s.Worksheets(1).Cells(Rows.Count, 1).End(xlUp).Row Do While ActiveSheet.Cells(i, ncolumn2).Value <> Empty 'поставил на "Обозначение" т.к. обрывался на пустой ячейке For j = 2 To lLR If Cells(i, ncolumn2).Value Like s.Worksheets(1).Cells(j, k).Value Then Cells(i, ncolumn2 + 1).Value = s.Worksheets(1).Cells(j, l).Value End If Next j i = i + 1 Loop s.Close SaveChanges:=False 'закрываем файл без сохранения Application.ScreenUpdating = True End Sub Но есть огромный недостаток-учитывает только первую входимость, а надо все... Для перебора 30к позиций хватает...больше уже вешается... Здесь надо через массивы... Но как хз,я в них ни але Если что - код, в любом случае, будет в надстройке.... Ах да, и как оказалось, столбцов из базы(2 файл) надо брать 3... И располагаются они хаотично.. |
Последний раз редактировалось blackeangel, 31-01-2016 в 00:46. Отправлено: 00:38, 31-01-2016 | #7 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
Цитата blackeangel:
Кроме того, тематических ресурсов по VBA великое множество, помнится у одного из участников подобного форума была очень подходящая к случаю подпись к сообщениям: Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы... . Набейте в любом поисковике VBA и после этого слова подпись - и обязательно найдете этот ресурс с большим количеством материала для вашего самообразования. Лично я бы уделил больше времени самой подписи в силу ее универсальности. |
||
Отправлено: 15:26, 31-01-2016 | #8 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Цитата a_axe:
А на счёт необдимости- это простая задачка, а когда работа будет например с 1,5 млн строк в которых примерно 40 столбцов, тогда перебор увы не покатит. Сейчас в меня полетят какашки по поводу что тут надо что то более сложное, или вооБще аксес или какую нибудь другую прогу по работе с базами данных. Но, есть только Эксель и работаем в том что есть.Как говорится не было б ограничений, все было б проще. Вот был пример http://www.cyberforum.ru/vba/thread1617510-page3.html Но не знаю как к нему прикрутить столбцы |
|||
Последний раз редактировалось blackeangel, 31-01-2016 в 19:40. Отправлено: 17:33, 31-01-2016 | #9 |
Ветеран Сообщения: 27449
|
Профиль | Отправить PM | Цитировать Цитата a_axe:
![]() |
|
Отправлено: 19:14, 31-01-2016 | #10 |
|
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
CMD/BAT - [решено] Как "прикрутить" (прогресбар), к скрипту для копирования файлов. | ufooo | Скриптовые языки администрирования Windows | 2 | 20-05-2015 02:35 | |
Разное - [решено] Проводник: столбец "Количество файлов" всегда остается пустой. | Ladislaus | Microsoft Windows 8 и 8.1 | 1 | 23-07-2014 16:04 | |
Службы - Как прикрутить"start /affinity 0x000c" к службе | Николай_Крамаренко@vk | Microsoft Windows 8 и 8.1 | 0 | 28-03-2013 20:36 | |
[решено] Как прикрутить к скрипту "HardDriveInfo.dll" для определения серийника жесткого? | centaurvv | AutoIt | 3 | 09-03-2010 20:28 | |
Запретить/удалить пункт "Programs" ("Программы") из меню кнопки "Start" ("Пуск") | submaster | Microsoft Windows NT/2000/2003 | 5 | 13-09-2006 12:29 |
|