|
Компьютерный форум OSzone.net » Сфера Microsoft » Microsoft Office (Word, Excel, Outlook и т.д.) » 2010 - "Прикрутить" столбец из другого файла с условием |
|
2010 - "Прикрутить" столбец из другого файла с условием
|
Старожил Сообщения: 329 |
Всем привет. Есть задачка:
имеется 2 файла: в 1м файле перечень во 2м файле перечень и еще один столбец. Необходимо к перечню 1го файла прикрутить тот столбец что во втором файле, учитывая что перечни не полностью совпадают и расположение совпадающих различно. Пример прилагаетсяв трех файлах:1й файл,2й файл и результирующий. Ошибочный итоговый файл был Вот верный. Реализовать надо в макросе.. В общем все сводится к тому что: есть список(файл1) и есть база (файл2).Из базы в список копируются необходимые данные, если не совпали,то пропускается(остаётся пустая ячейка) |
|
Отправлено: 16:21, 25-01-2016 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Цитата Iska:
![]() ![]() Судя по всему - массивы более компромиссный вариант, правда непонятно, как они тут помогут ![]() |
|
Отправлено: 15:49, 01-02-2016 | #11 |
Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети. Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля. |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Цитата a_axe:
На счёт того что отверг-каково задание дали мне, так я его и выложил. Не моя прихоть. А так спасибо за лестные слова ![]() |
|
Отправлено: 18:50, 01-02-2016 | #12 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Оффтоп
Цитата blackeangel:
Цитата blackeangel:
Цитата blackeangel:
В мое советское школьное детство преподаватели вбили одну незатейливую истину: правильно и грамотно оформленные условия задачи являются ровно половиной ее решения. Что нужно делать у вас - извините, абсолютно для меня не понятно. Цитата blackeangel:
Цитата blackeangel:
Цитата blackeangel:
Цитата blackeangel:
Еще раз терпеливо вам объясняю: отсутствие внятной постановки задачи с большой долей вероятности делает невозможным ее решение. Опишите хотя бы Ваше виденье алгоритма: "обработчик в исходном файле ищет ячейку с содержимым "Инструм.", получает номер столбца, перебирает в нем все непустые ячейки, ищет значение каждой из этих ячеек во втором файле, если нашел - копирует значения из столбцов с заголовками такими-то..." и т.д. Вы это формулируете в виде "нужно прикрутить", а что конкретно делать нужно - в общем-то не понятно. Привожу свое интуитивное виденье кода, который вероятно вам нужен. Если вы его просто проигнорируете - как первый код, будто его и не было - возьму самоотвод от участия в этой теме. Запускать код нужно при активном документе, куда вы хотите копировать данные. Открыты д.б. оба документа. код
Public Sub osn() Dim dataBook As Workbook Dim dataSheet As Worksheet Dim myCell As Range Dim i As Long, j As Long, k As Long, m As Long, n As Long 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 = dataSheet.Rows(1).Find(What:="Инструм.", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column k = dataSheet.Rows(1).Find(What:="Год", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column m = ActiveSheet.Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column Debug.Print dataSheet.Name Debug.Print i & " " & j & " " & k & " " & m For Each myCell In Intersect(ActiveWorkbook.ActiveSheet.UsedRange, ActiveWorkbook.ActiveSheet.Columns(m)) On Error Resume Next Err.Clear n = Application.WorksheetFunction.Match(myCell.Value, Range(dataSheet.Cells(1, i), dataSheet.Cells(dataSheet.UsedRange.Count, i)), 0) myCell.Offset(0, 1).Value = Application.WorksheetFunction.Index(Range(dataSheet.Cells(1, j), dataSheet.Cells(dataSheet.UsedRange.Count, j)), n) myCell.Offset(0, 2).Value = Application.WorksheetFunction.Index(Range(dataSheet.Cells(1, k), dataSheet.Cells(dataSheet.UsedRange.Count, k)), n) If Err.Number <> 0 Then myCell.Offset(0, 1).Value = "" myCell.Offset(0, 2).Value = "" End If Next ActiveWorkbook.ActiveSheet.Cells(1, m).Value = "Обозначение" Else MsgBox "Должно быть открыто 2 файла." End If Set dataSheet = Nothing End Sub |
|||||||
Отправлено: 12:02, 02-02-2016 | #13 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Итак, по коду - постоянно ругается, что не открыты 2 файла, хотя открыты оба и кроме них больше ничего.
В общем задание утряслось и есть чёткие требования. Прикладываю файлы. В первом на первом листе список, на втором итого,что должно получиться. В 2файле несколько вариантов "базы" откуда берутся данные. Уточню ещё один момент, если имеет значение - winXP, office 2010. |
Последний раз редактировалось blackeangel, 03-04-2017 в 22:53. Отправлено: 10:08, 03-02-2016 | #14 |
Динохромный Сообщения: 704
|
Профиль | Отправить PM | Цитировать Цитата blackeangel:
код с проверкой
Public Sub osn() Dim dataBook As Workbook Dim dataSheet As Worksheet Dim myCell As Range Dim i As Long, j As Long, k As Long, m As Long, n As Long, Ik As Integer For Each dataBook In Application.Workbooks Ik = Ik + 1 MsgBox "Открыто " & Application.Workbooks.Count & " рабочих книг, №" & Ik & " - " & dataBook.Name Next 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 = dataSheet.Rows(1).Find(What:="Инструм.", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column k = dataSheet.Rows(1).Find(What:="Год", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column m = ActiveSheet.Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByRows).Column Debug.Print dataSheet.Name Debug.Print i & " " & j & " " & k & " " & m For Each myCell In Intersect(ActiveWorkbook.ActiveSheet.UsedRange, ActiveWorkbook.ActiveSheet.Columns(m)) On Error Resume Next Err.Clear n = Application.WorksheetFunction.Match(myCell.Value, Range(dataSheet.Cells(1, i), dataSheet.Cells(dataSheet.UsedRange.Count, i)), 0) myCell.Offset(0, 1).Value = Application.WorksheetFunction.Index(Range(dataSheet.Cells(1, j), dataSheet.Cells(dataSheet.UsedRange.Count, j)), n) myCell.Offset(0, 2).Value = Application.WorksheetFunction.Index(Range(dataSheet.Cells(1, k), dataSheet.Cells(dataSheet.UsedRange.Count, k)), n) If Err.Number <> 0 Then myCell.Offset(0, 1).Value = "" myCell.Offset(0, 2).Value = "" End If Next ActiveWorkbook.ActiveSheet.Cells(1, m).Value = "Обозначение" Else MsgBox "Должно быть открыто 2 файла." End If Set dataSheet = Nothing End Sub Отпишитесь по результату, сколько он показывает файлов. Либо можно определить имя файла, из которого будет выполняться копирование. |
|
------- Отправлено: 10:24, 03-02-2016 | #15 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Показал верно, отработал криво, не учитывал первые строки. Осталось оформить как в примере на листе итого в предыдущем посте.
|
Последний раз редактировалось blackeangel, 03-04-2017 в 22:53. Отправлено: 11:43, 03-02-2016 | #16 |
Старожил Сообщения: 329
|
Профиль | Отправить PM | Цитировать Пытался сделать из вашего кода чтобы читал из файла не получилось
Sub osn() Dim myCell As Range Application.ScreenUpdating = False k = "D:\Обмен\МИПУ.xlsx" Set s = GetObject(k) Set i = s.Worksheets(1).Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns) mckoboz = i.Column Set j = s.Worksheets(1).Rows(1).Find(What:="Маршрут", LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByColumns) mck = j.Column Set m = ActiveSheet.Rows(1).Find(What:="Обозначение", LookIn:=xlValues, LookAt:=xlPart, SearchOrder:=xlByColumns) dceoboz = m.Column For Each myCell In Intersect(ActiveWorkbook.ActiveSheet.UsedRange, s.Worksheets(1).Columns(dceoboz)) On Error Resume Next n = Application.WorksheetFunction.Match(myCell.Value, Range(s.Worksheets(1).Cells(1, mckoboz), s.Worksheets(1).Cells(s.Worksheets(1).UsedRange.Count, mckoboz)), 0) myCell.Offset(0, 1).Value = Application.WorksheetFunction.Index(Range(s.Worksheets(1).Cells(1, mck), s.Worksheets(1).Cells(s.Worksheets(1).UsedRange.Count, mck)), n) Next s.Close SaveChanges:=False Application.ScreenUpdating = True End Sub |
Отправлено: 09:02, 08-02-2016 | #17 |
![]() |
Участник сейчас на форуме |
![]() |
Участник вне форума |
![]() |
Автор темы |
![]() |
Сообщение прикреплено |
| |||||
Название темы | Автор | Информация о форуме | Ответов | Последнее сообщение | |
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 |
|