Есть задача сделать макрос для следующей задачи.
Есть изначальный файл с данными с несколькими десятками колонок с уникальными именами типа Имя1, Имя2, Имя3 и т.д.
Их нужно перенести в другой эксель-файл в колонки ДругоеИмя1, ДругоеИмя2, ДругоеИмя3 и т.д. Есть информация, что соответствует чему, но колонки идут вразнобой. Потом ещё над некоторыми из них всякие действия, типа смены формата, операций Vlookup в других файлах, concatenate отдельных колонок и т.п.
В принципе, рабочий макрос уже есть, построенный на принципе: Искать Имя1 > Переход на 2-ю строку > Копировать 1000 строк > Переход в другой файл > Искать ДругоеИмя1 > Переход на 2-ю строку > Вставить. Как мне изначально сказали, так я и сделала.
Однако изучение кода макроса показало, что у него нет связи между нахождением ячейки Имя1 и переходом на 2-ю строку той же колонки. Что значит, что если макрос запустить на файле с другим порядком колонок, то он скопирует не то или не туда, т.к. ориентируется не на имена, а на буквенные обозначения колонок. Он ищет ячейки, а не колонки. Как его научить искать именно колонки?
Вот отрывок:
[code:1utw8whc] Cells.Find(What:="employerphone", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate ///вот тут он нашёл нужную колонку (точнее ячейку)
Range("Q2:Q1001").Select /// а вот это уже совсем другое действие, а нужна логика +1 к предыдущему
Selection.Copy
Windows("Файл куда копируется.xlsx").Activate
Cells.Find(What:="telbur", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:= _
False, SearchFormat:=False).Activate
Range("D2").Select /// Та же проблема
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Columns("D:D").Select
Application.CutCopyMode = False[/code:1utw8whc]
Если знаете ответ, напишите его в очень простом виде без использования сложных терминов и программистских понятий. Не в виде кода, а в виде инструкций куда и как жать в окне Экселя.
Спасибо
50 долларов в час. Гаданием по бартеру не беру.
Я б сама, но Эксель — слишком сильное колдунство.
ActiveCell.Offset(1, 0)
[quote="nouveau":27dconzx]ActiveCell.Offset(1, 0)[/quote:27dconzx]Это куда и что с этим потом делать?
У меня макрос на около 300 действий. Мне нужно знать сам принцип, чтобы его использовать при выполнении этих почти 300 действий из окна экселя, не касаясь кода.
Вот очень живенький форум, там часто помогают (забесплатно! а не так как я
)
https://www.planetaexcel.ru/forum/
[quote="Merlion":29mz1abo][quote="nouveau":29mz1abo]ActiveCell.Offset(1, 0)[/quote:29mz1abo]Это куда и что с этим потом делать?
У меня макрос на около 300 действий. Мне нужно знать сам принцип, чтобы его использовать при выполнении этих почти 300 действий из окна экселя, не касаясь кода.[/quote:29mz1abo]
замените проблемную линию
ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
У меня не одна линия проблемная. У меня сам принцип установления соотношений между искомыми колонками и данными в них проблемный.
Я хочу, чтобы в каждой связке
[i:2draqkds]Найти Имя14 — перейти на 2 строку — копировать 1000 строк — перейти в файл2 — найти ДругоеИмя10 — перейти на 2 строку — вставить[/i:2draqkds]
Была относительная связь между найденными ячейками, — которые суть названия колонок, — и ячейками прямо под ними, куда я копирую данные.
Мне кажется, это какая-то очень базовая функция, для которой должна быть галочка или кнопка.
[quote:2draqkds]Вот очень живенький форум, там часто помогают (забесплатно! а не так как я
)
https://www.planetaexcel.ru/forum/[/quote:2draqkds]Я зарегилась на одном таком, но там в качестве ответов дают непонятный код. Когда говоришь, что непонятно, добавляют непонятного кода.
так функция OFFSET(x,y) это и делает. она переходит на х линий вниз/вверх, или у колон вправо/влево относительно выбранной клетки.
OK, предположим, поиск нашёл моё значение в D1
Как будет выглядеть [b:3umx8887]копирование[/b:3umx8887] со 2-й по 1001-ю ячейки с этим офсетом?
В вашем коде
ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
целых 3 места, где вводятся координаты. Если в 3-м месте ясно, что это последняя ячейка, то что писать в 2 первых скобках?
Правильно ли я понимаю, что эту замену надо будет потом на все подобные макросы делать вручную по окончании записи макроса и что не существует действия через клавиатуру или мышкой через пользовательских интерфейс, который бы создавал именно такую строку кода?
Чёрт возьми, я знала! Есть такая кнопочка!
[img:3lb7pjcy]https://i.imgur.com/rU8EXVR.png[/img:3lb7pjcy]
Как только я на неё нажала, в коде появились строчки с офсетом.
[code:3lb7pjcy] Cells.Find(What:="aaa", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(1, 0).Range("A1:A298").Select
Selection.Copy
Windows("another file.xlsx").Activate
ActiveCell.Offset(18, 7).Range("A1").Select
Cells.Find(What:="bbb", After:=ActiveCell, LookIn:=xlFormulas, LookAt:= _
xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False _
, SearchFormat:=False).Activate
ActiveCell.Offset(1, 0).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False[/code:3lb7pjcy]
Однако за ними всё равно идут привязанные к колонке обозначения выделяемых данных.
[quote="Merlion":34ybdn5l]OK, предположим, поиск нашёл моё значение в D1
Как будет выглядеть [b:34ybdn5l]копирование[/b:34ybdn5l] со 2-й по 1001-ю ячейки с этим офсетом?
В вашем коде
ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
целых 3 места, где вводятся координаты. Если в 3-м месте ясно, что это последняя ячейка, то что писать в 2 первых скобках?
Правильно ли я понимаю, что эту замену надо будет потом на все подобные макросы делать вручную по окончании записи макроса и что не существует действия через клавиатуру или мышкой через пользовательских интерфейс, который бы создавал именно такую строку кода?[/quote:34ybdn5l]
ActiveCell.Offset(1, 0). — спустится на одну линия вниз, относительно найденной
.Range(ActiveCell.Offset(0, 0) — можно заменить на просто ActiveCell, остаемся в той же клетке
запустите это макро и поиграйте с цифрами
Sub Macro1()
Range("A1").Select
ActiveCell.Offset(1, 0).Range(ActiveCell, ActiveCell.Offset(10, 0)).Select
End Sub
через интерфайс, по-моему нельзя это сделать. по-крайней мере я не знаю как.
Ваш макрос выделил ячейки со 2 по 12.
Предположим, в A1 написано слово "Город". Ищем его через Ctrl+F. Потом нужен переход вниз и вставка названий городов.
И чтобы нигде не фигурировало название колонки А. Потому что если слово "Город" в другом исходном или целевом файле будет стоять в колонке G, то мне надо, чтобы макрос брал колонку G под словом "Город".
У меня появилась мысль разметить целевой файл этими… не знаю, как они по-русски… Которые в Formules > Gestionnaire de noms. Там выделенному массиву ячеек (например, колонке) присваивается имя. Тогда вставка в такой файл выглядит так:
[code:3gc7j03d] Cells.Find(What:="ааа", After:=ActiveCell, LookIn:=xlFormulas, _
LookAt:=xlWhole, SearchOrder:=xlByRows, SearchDirection:=xlNext, _
MatchCase:=False, SearchFormat:=False).Activate
ActiveCell.Offset(1, 0).Range("A1:A298").Select
Selection.Copy
Windows("файл.xlsx").Activate
Application.Goto Reference:="Уникальное имя"
ActiveSheet.Paste[/code:3gc7j03d]
Наверное, исходный файл так же можно разметить в первых операциях макроса.
Ээээ, вообще говоря, для решения таких задач надо таки изучить вижуал бейсик.
Как у нас говорили в начале 90х — басец)
Самоучителей в сети много, скажем вот —
http://office-guru.ru/excel/samouchitel … a-453.html
Если это разовая акция, то, конечно, можно обойтись и консультациями посторонних людей.
Но если это таки регулярный процесс, то таки надо владеть Excel VBA.
Лично я, например, никогда на нем сам ничего под эксель не писал, у меня для этого дела был программист, который по ходу дела чуток разобрался в вижуал бейске (так то он был программист на совсем другом). Я ему объяснял, что надо, а он уже писал код. Так что если у вас под рукой какой-нибудь программист, то можете его простимулировать написать нужное на VBA, вообще говоря, для нормального программиста достаточно почитать хелп. Упомянутый выше программер первый раз так и начал под эксел писать.
Но только такой программист должен быть, конечно, рядом, и быть вам чем-то обязанным, ибо просто так такой фигней они заниматься не любят.
Я извиняюсь за банальности, это я так, разговор поддержать.
[quote="Леша":32mo69jd]Ээээ, вообще говоря, для решения таких задач надо таки изучить вижуал бейсик.
Как у нас говорили в начале 90х — басец)
Самоучителей в сети много, скажем вот —
http://office-guru.ru/excel/samouchitel … a-453.html
Если это разовая акция, то, конечно, можно обойтись и консультациями посторонних людей.
Но если это таки регулярный процесс, то таки надо владеть Excel VBA.
Лично я, например, никогда на нем сам ничего под эксель не писал, у меня для этого дела был программист, который по ходу дела чуток разобрался в вижуал бейске (так то он был программист на совсем другом). Я ему объяснял, что надо, а он уже писал код. Так что если у вас под рукой какой-нибудь программист, то можете его простимулировать написать нужное на VBA, вообще говоря, для нормального программиста достаточно почитать хелп. Упомянутый выше программер первый раз так и начал под эксел писать.
Но только такой программист должен быть, конечно, рядом, и быть вам чем-то обязанным, ибо просто так такой фигней они заниматься не любят.
Я извиняюсь за банальности, это я так, разговор поддержать.[/quote:32mo69jd]
Вы явно были далеки от этого в начале 90-х. "Васик" же!
А стимулируются программисты деньгами. но наша гадалка хочет халявы.
Я предложила свои услуги, последние 25 лет я себе на хлеб зарабатываю Васиком в том числе, но мадам осталась недовольна расценками.
ну, для кого Васик, а для кого Басец)
А так — ну да, ну да…
Вся эта история пахнет не только тем, что "сделайте за меня". но и тем. что "найдите время. силы и желание лично мне обьяснить почему так. а не иначе". А это гораздо более тяжелый порок. Но карты сказали — "тебе все обьяснят, люди — они добрые. И работают за орешки
".
Мне не доплачивают за такие улучшения, так что я решила попытать удачи и закинула удочку мирозданию в пруд "А поговорить?".
Вдруг клюнуло бы… Ну, кто хочет улучшить себе карму?
Я тут поняла, что при первичном назывании столбцов уникальными именами в исходном файле всё равно будут использованы буквы колонок. Возвращаемся к изначальной проблеме сохранения инфы об относительном переходе между ячейками.
Nouveau, та строчка, что вы дали
ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
В ней вообще-вообще ничего менять не надо? Можно её как есть тупо вставить после каждого блока cell.find и перед началом операции копирования, как если бы она была одним большим иероглифом?
Лёша, я хэтээмэль и цээсэс еле поняла, а вы о языке программирования. Я ж говорю, всё то есть сильное колдунство!
Я иного биологического вида, не предназначенного природой для программирования и математики. Я умею только на кнопочки жать. И карточки с картинками раскладывать. Но это для данной задачи на моём уровне не более актуально, чем томик Шекспира для кенгуру с запором.
[quote="Merlion":3qsv44qs]Мне не доплачивают за такие улучшения, так что я решила попытать удачи и закинула удочку мирозданию в пруд
Nouveau, та строчка, что вы дали
ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
В ней вообще-вообще ничего менять не надо? Можно её как есть тупо вставить после каждого блока cell.find и перед началом операции копирования, как если бы она была одним большим иероглифом?
[/quote:3qsv44qs]
скопируйте ваш файл и попробуйте.
но с вашего примера,
Range("Q2:Q1001").Select одно и тоже должно быть ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(999, 0)).Select
а это
Range("D2").Select должно быть ActiveCell.Offset(1, 0).Select
[quote:yspzyqvt]Я иного биологического вида, не предназначенного природой для программирования и математики. Я умею только на кнопочки жать. И карточки с картинками раскладывать. [/quote:yspzyqvt]
Вотъ! Математики и программирования здесь нет.
[img:yspzyqvt]https://i.imgur.com/kTDRCgw.jpg[/img:yspzyqvt]