Есть задача сделать макрос для следующей задачи.

Есть изначальный файл с данными с несколькими десятками колонок с уникальными именами типа Имя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]

Если знаете ответ, напишите его в очень простом виде без использования сложных терминов и программистских понятий. Не в виде кода, а в виде инструкций куда и как жать в окне Экселя.

Спасибо

Комментариев нет

  1. [quote="nouveau":27dconzx]ActiveCell.Offset(1, 0)[/quote:27dconzx]Это куда и что с этим потом делать?

    У меня макрос на около 300 действий. Мне нужно знать сам принцип, чтобы его использовать при выполнении этих почти 300 действий из окна экселя, не касаясь кода.

  2. [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

  3. У меня не одна линия проблемная. У меня сам принцип установления соотношений между искомыми колонками и данными в них проблемный.
    Я хочу, чтобы в каждой связке

    [i:2draqkds]Найти Имя14 — перейти на 2 строку — копировать 1000 строк — перейти в файл2 — найти ДругоеИмя10 — перейти на 2 строку — вставить[/i:2draqkds]

    Была относительная связь между найденными ячейками, — которые суть названия колонок, — и ячейками прямо под ними, куда я копирую данные.

    Мне кажется, это какая-то очень базовая функция, для которой должна быть галочка или кнопка.

    [quote:2draqkds]Вот очень живенький форум, там часто помогают (забесплатно! а не так как я :lol: )
    https://www.planetaexcel.ru/forum/[/quote:2draqkds]Я зарегилась на одном таком, но там в качестве ответов дают непонятный код. Когда говоришь, что непонятно, добавляют непонятного кода.

  4. 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 первых скобках?

    Правильно ли я понимаю, что эту замену надо будет потом на все подобные макросы делать вручную по окончании записи макроса и что не существует действия через клавиатуру или мышкой через пользовательских интерфейс, который бы создавал именно такую строку кода?

  5. Чёрт возьми, я знала! Есть такая кнопочка!

    [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]

    Однако за ними всё равно идут привязанные к колонке обозначения выделяемых данных.

  6. [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

    через интерфайс, по-моему нельзя это сделать. по-крайней мере я не знаю как.

  7. Ваш макрос выделил ячейки со 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]

    Наверное, исходный файл так же можно разметить в первых операциях макроса.

  8. Ээээ, вообще говоря, для решения таких задач надо таки изучить вижуал бейсик.
    Как у нас говорили в начале 90х — басец)
    Самоучителей в сети много, скажем вот —
    http://office-guru.ru/excel/samouchitel … a-453.html

    Если это разовая акция, то, конечно, можно обойтись и консультациями посторонних людей.
    Но если это таки регулярный процесс, то таки надо владеть Excel VBA.

    Лично я, например, никогда на нем сам ничего под эксель не писал, у меня для этого дела был программист, который по ходу дела чуток разобрался в вижуал бейске (так то он был программист на совсем другом). Я ему объяснял, что надо, а он уже писал код. Так что если у вас под рукой какой-нибудь программист, то можете его простимулировать написать нужное на VBA, вообще говоря, для нормального программиста достаточно почитать хелп. Упомянутый выше программер первый раз так и начал под эксел писать.
    Но только такой программист должен быть, конечно, рядом, и быть вам чем-то обязанным, ибо просто так такой фигней они заниматься не любят.

    Я извиняюсь за банальности, это я так, разговор поддержать.

  9. [quote="Леша":32mo69jd]Ээээ, вообще говоря, для решения таких задач надо таки изучить вижуал бейсик.
    Как у нас говорили в начале 90х — басец)
    Самоучителей в сети много, скажем вот —
    http://office-guru.ru/excel/samouchitel … a-453.html

    Если это разовая акция, то, конечно, можно обойтись и консультациями посторонних людей.
    Но если это таки регулярный процесс, то таки надо владеть Excel VBA.

    Лично я, например, никогда на нем сам ничего под эксель не писал, у меня для этого дела был программист, который по ходу дела чуток разобрался в вижуал бейске (так то он был программист на совсем другом). Я ему объяснял, что надо, а он уже писал код. Так что если у вас под рукой какой-нибудь программист, то можете его простимулировать написать нужное на VBA, вообще говоря, для нормального программиста достаточно почитать хелп. Упомянутый выше программер первый раз так и начал под эксел писать.
    Но только такой программист должен быть, конечно, рядом, и быть вам чем-то обязанным, ибо просто так такой фигней они заниматься не любят.

    Я извиняюсь за банальности, это я так, разговор поддержать.[/quote:32mo69jd]
    Вы явно были далеки от этого в начале 90-х. "Васик" же! :D
    А стимулируются программисты деньгами. но наша гадалка хочет халявы.
    Я предложила свои услуги, последние 25 лет я себе на хлеб зарабатываю Васиком в том числе, но мадам осталась недовольна расценками.

  10. Вся эта история пахнет не только тем, что "сделайте за меня". но и тем. что "найдите время. силы и желание лично мне обьяснить почему так. а не иначе". А это гораздо более тяжелый порок. Но карты сказали — "тебе все обьяснят, люди — они добрые. И работают за орешки ;)".

  11. Мне не доплачивают за такие улучшения, так что я решила попытать удачи и закинула удочку мирозданию в пруд "А поговорить?".
    Вдруг клюнуло бы… Ну, кто хочет улучшить себе карму?

    Я тут поняла, что при первичном назывании столбцов уникальными именами в исходном файле всё равно будут использованы буквы колонок. Возвращаемся к изначальной проблеме сохранения инфы об относительном переходе между ячейками.

    Nouveau, та строчка, что вы дали
    ActiveCell.Offset(1, 0).Range(ActiveCell.Offset(0, 0), ActiveCell.Offset(1000, 0)).Select
    В ней вообще-вообще ничего менять не надо? Можно её как есть тупо вставить после каждого блока cell.find и перед началом операции копирования, как если бы она была одним большим иероглифом?

    Лёша, я хэтээмэль и цээсэс еле поняла, а вы о языке программирования. Я ж говорю, всё то есть сильное колдунство!
    Я иного биологического вида, не предназначенного природой для программирования и математики. Я умею только на кнопочки жать. И карточки с картинками раскладывать. Но это для данной задачи на моём уровне не более актуально, чем томик Шекспира для кенгуру с запором.

  12. [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

  13. [quote:yspzyqvt]Я иного биологического вида, не предназначенного природой для программирования и математики. Я умею только на кнопочки жать. И карточки с картинками раскладывать. [/quote:yspzyqvt]

    Вотъ! Математики и программирования здесь нет.

    [img:yspzyqvt]https://i.imgur.com/kTDRCgw.jpg[/img:yspzyqvt]

Ответить