Есть 2 файла 1ый это обрабатываемый, второй это таблица соответствия.
Таблица представляет собой 2 столбца, 1ый это список кустарников, 2ой - список деревьев
В 1ом файле мы циклом идем по столбцу F, начиная с F4, берем значение ячейки и сравниваем его со значениями обоих столбцов в таблице соответствия. Если наименование породы есть в обоих столбцах, то оставляем содержимое ячейки E4 таким каким оно было(по сути переходим к следующей ячейке в столбце F), а если наинменование есть только в списке кустарников или деревьев, то вписываем в E4 соответствующее значение (Кустарник/Дерево) Затем цикл переходит к следующей ячейке (F5).
Приложу оба файла и попробую пояснить на примере:
Начинаем с ячейки F4 в "файл1". Сравниваем значение ячейки (F4="Шиповник") с каждой ячейкой таблицы соответствия, сначала в столбце А, потом в столбце В, если находится соответсвие в двух столбцах, то значение ячейки E4 не меняется, если соответствие находится в Столбце А (А337="Шиповник"), то пишем в Е4 "Кустарник", теперь можно переходить к следующей ячейке в "файл1" Перешли к ячейке F5, совпадение произошло и в столбце А и в столбце В, значит оставляем E5 без изменений, переходим к следующей ячейке в обрабатываемом файле. F7 - соответствие с ячейкой A337 в таблице соответсвия - в ячейку E4 идет "Кустарник" F8 - вот тут соответствие находится в столбце с наименованиями кустарников, а в ячейке E8 у нас стоит "Дерево", значит меняем на "кустарник"
ну и так далее, впринципе больше вариантов быть не должно, то есть либо наименование есть в обоих столбцах, тогда оставляем в обрабатываемом файле характеристику без изменений, либо меняем в соотвествии с таблицей.
Цикл по столбцу F заканчивается, как только попадает на пустую ячейку.
Надеюсь понятно обьяснил задачу)
При прикреплении имена файлов поменялись, файл1 это обрабатываемый, а таблица это файл с 2умя столбцами.
Есть 2 файла 1ый это обрабатываемый, второй это таблица соответствия.
Таблица представляет собой 2 столбца, 1ый это список кустарников, 2ой - список деревьев
В 1ом файле мы циклом идем по столбцу F, начиная с F4, берем значение ячейки и сравниваем его со значениями обоих столбцов в таблице соответствия. Если наименование породы есть в обоих столбцах, то оставляем содержимое ячейки E4 таким каким оно было(по сути переходим к следующей ячейке в столбце F), а если наинменование есть только в списке кустарников или деревьев, то вписываем в E4 соответствующее значение (Кустарник/Дерево) Затем цикл переходит к следующей ячейке (F5).
Приложу оба файла и попробую пояснить на примере:
Начинаем с ячейки F4 в "файл1". Сравниваем значение ячейки (F4="Шиповник") с каждой ячейкой таблицы соответствия, сначала в столбце А, потом в столбце В, если находится соответсвие в двух столбцах, то значение ячейки E4 не меняется, если соответствие находится в Столбце А (А337="Шиповник"), то пишем в Е4 "Кустарник", теперь можно переходить к следующей ячейке в "файл1" Перешли к ячейке F5, совпадение произошло и в столбце А и в столбце В, значит оставляем E5 без изменений, переходим к следующей ячейке в обрабатываемом файле. F7 - соответствие с ячейкой A337 в таблице соответсвия - в ячейку E4 идет "Кустарник" F8 - вот тут соответствие находится в столбце с наименованиями кустарников, а в ячейке E8 у нас стоит "Дерево", значит меняем на "кустарник"
ну и так далее, впринципе больше вариантов быть не должно, то есть либо наименование есть в обоих столбцах, тогда оставляем в обрабатываемом файле характеристику без изменений, либо меняем в соотвествии с таблицей.
Цикл по столбцу F заканчивается, как только попадает на пустую ячейку.
Надеюсь понятно обьяснил задачу)
При прикреплении имена файлов поменялись, файл1 это обрабатываемый, а таблица это файл с 2умя столбцами.
Нет, Сергей, это не оптимально. Можно наверное за два приёма накопировать рядом соответствий и потом через ЕСЛИ вытянуть результат, но это неоптимально. Оптимально - макрос на массивах. Хотя если смотреть на то, что данные в csv, то код нужно писать не в виде макроса и в третьем файле xls (т.к.в csv макрос не поместить), а например в виде скрипта vbs и обрабатывать csv как текст. Считать оба файла, сделать изменения, сохранить изменённый файл. Будет полегче, быстрее запускаться, но может чуть дольше работать (доли секунды/пару секунд, смотря на объём), зато одним кликом по скрипту можно получить результат (если путь к файлам не нужно выбирать в диалоге). И без Экселя. Но тогда это не по нашему профилю
Нет, Сергей, это не оптимально. Можно наверное за два приёма накопировать рядом соответствий и потом через ЕСЛИ вытянуть результат, но это неоптимально. Оптимально - макрос на массивах. Хотя если смотреть на то, что данные в csv, то код нужно писать не в виде макроса и в третьем файле xls (т.к.в csv макрос не поместить), а например в виде скрипта vbs и обрабатывать csv как текст. Считать оба файла, сделать изменения, сохранить изменённый файл. Будет полегче, быстрее запускаться, но может чуть дольше работать (доли секунды/пару секунд, смотря на объём), зато одним кликом по скрипту можно получить результат (если путь к файлам не нужно выбирать в диалоге). И без Экселя. Но тогда это не по нашему профилю Hugo
Не понятно, зачем нужен именно макрос. Если эту задачу нужно автоматизировать, т.к. она будет часто выполняться, или этот процесс - звено в цепи обработки данных - тогда да, нужен код. Но если задача разовая - вполне можно сделать формулами, и разными путями. Например, в примере сделал с тремя доп. столбцами., хотя можно все три формулы совместить в одном столбце. Теперь результат как значения скопировать поверх столбца E. Там в скрытых столбцах результат работы кода http://www.excelworld.ru/index/comparefiles_find/0-25 - можно и эти данные анализировать вместо единиц (отпадают два столбца формул), но с единицами проще. Но для работы макроса пришлось файлы сохранить как xls, а для того, чтобы показать формулы на форуме - тоже csv не годится. Поэтому сперва сохранил оба файла как xls, потом сочинял формулы.
Не понятно, зачем нужен именно макрос. Если эту задачу нужно автоматизировать, т.к. она будет часто выполняться, или этот процесс - звено в цепи обработки данных - тогда да, нужен код. Но если задача разовая - вполне можно сделать формулами, и разными путями. Например, в примере сделал с тремя доп. столбцами., хотя можно все три формулы совместить в одном столбце. Теперь результат как значения скопировать поверх столбца E. Там в скрытых столбцах результат работы кода http://www.excelworld.ru/index/comparefiles_find/0-25 - можно и эти данные анализировать вместо единиц (отпадают два столбца формул), но с единицами проще. Но для работы макроса пришлось файлы сохранить как xls, а для того, чтобы показать формулы на форуме - тоже csv не годится. Поэтому сперва сохранил оба файла как xls, потом сочинял формулы.Hugo
Если эту задачу нужно автоматизировать, т.к. она будет часто выполняться, или этот процесс - звено в цепи обработки данных
Это звено в цепи обработки данных) Как раз поэтому нужен макрос) Собственно я в csv пользуюсь 2умя простыми макросами, и хотел еще добавить к ним функцию, описанную в первом посте, не думал что это настолько сложно, там по сути то пару циклов да пару ветвлений. Формулами результат есть, но это опять же надо формулу вставлять в каждый документ, что в итоге делает работу довольно громоздкой, неужели нельзя допустим чтобы макрос обращался к подгруженному csv файлу, и обрабатывал в соответствии с задачей обрабатываемый файл?
Quote (Hugo)
Если эту задачу нужно автоматизировать, т.к. она будет часто выполняться, или этот процесс - звено в цепи обработки данных
Это звено в цепи обработки данных) Как раз поэтому нужен макрос) Собственно я в csv пользуюсь 2умя простыми макросами, и хотел еще добавить к ним функцию, описанную в первом посте, не думал что это настолько сложно, там по сути то пару циклов да пару ветвлений. Формулами результат есть, но это опять же надо формулу вставлять в каждый документ, что в итоге делает работу довольно громоздкой, неужели нельзя допустим чтобы макрос обращался к подгруженному csv файлу, и обрабатывал в соответствии с задачей обрабатываемый файл?
"Можно всё, были бы время и деньги" - так где-то в подписи видел Расскажите подробнее - почему макрос, как он оказался в csv, зачем csv загружаете в Эксель, нужно ли сохранять изменения в файле и в каком формате - xls или csv? Т.е. можно сделать анализ и сохранить изменения скриптом (или макросом) без открытия этих файлов в Экселе. Но работа не такая простая, как кажется. Т.е. несложно в принципе, но муторно, если именно такой алгоритм уже не готов, и его нужно придумывать. Мне так кажется.
"Можно всё, были бы время и деньги" - так где-то в подписи видел Расскажите подробнее - почему макрос, как он оказался в csv, зачем csv загружаете в Эксель, нужно ли сохранять изменения в файле и в каком формате - xls или csv? Т.е. можно сделать анализ и сохранить изменения скриптом (или макросом) без открытия этих файлов в Экселе. Но работа не такая простая, как кажется. Т.е. несложно в принципе, но муторно, если именно такой алгоритм уже не готов, и его нужно придумывать. Мне так кажется.Hugo
Ну макрос потому что нужно получить изменения в файле грубо говоря нажав на одну кнопку. Сохранять можно и вручную, не так это и долго, открывать каждый файл, чтобы запустить макрос тоже не особо напрягает, то есть по сути скрипт который бы все это пакетно обрабатывал не нужен. Я мог бы попробовать описать алгоритм на каком нить подобии псевдокода)) Но я думал что все подробно расписал в первом посте)
Ну макрос потому что нужно получить изменения в файле грубо говоря нажав на одну кнопку. Сохранять можно и вручную, не так это и долго, открывать каждый файл, чтобы запустить макрос тоже не особо напрягает, то есть по сути скрипт который бы все это пакетно обрабатывал не нужен. Я мог бы попробовать описать алгоритм на каком нить подобии псевдокода)) Но я думал что все подробно расписал в первом посте)Hammeron
Ну описано подробно и понятно, но вот как в коде сделать например это - "если находится соответствие в двух столбцах"... пока мутно. Flag1 и flag2 анализировать? Но сделать можно. Открыть файл с кодом, нажать кнопку, выбрать в диалоге один файл, потом другой (кстати, это нужно, или пути постоянны?),потом сохранить вручную... Проще одним кликом по скрипту, ну и остаётся выбор файлов, если нужно.
Ну описано подробно и понятно, но вот как в коде сделать например это - "если находится соответствие в двух столбцах"... пока мутно. Flag1 и flag2 анализировать? Но сделать можно. Открыть файл с кодом, нажать кнопку, выбрать в диалоге один файл, потом другой (кстати, это нужно, или пути постоянны?),потом сохранить вручную... Проще одним кликом по скрипту, ну и остаётся выбор файлов, если нужно.Hugo
Тут 3 исхода получается: 1. Находится соответствие в первом столбце (меняем значение на "кустарник") 2. находится соответствие во втором столбце (меняем значение на "дерево") 3. находится в обоих - вот этот пункт и вправду геморный, я думаю надо как то его исключить, чтобы осталось 2 исхода. тут мне видится такое решение: сделать так, чтобы алгоритм работал только с определенными наименованиями пород, то есть задать ветвление такого типа:
Идем циклом по столбцу F от i = 1 до n (n - номер последней заполненной ячейки) ЕСЛИ Fi не равно "Клен ясенелистный" ИЛИ "Боярышник" ИЛИ "Вишня" (и так далее, этот список я сам дополню, но суть в том, что эти наименования встречаются в обоих столбцах), то Дальше идет сравнивание ячейки с таблицей соответствия и присваивание значения ячейки Ei (дерево/кустарник, в зависимости от столбца, в котором он находит совпадение)
То есть мы сейчас исключили ту часть макроса которая бы работала с флаговыми переменными, упростив задачу)
теперь по поводу того как я вижу как это должно происходить. Макрос записывается в личную книгу макросов, создается кнопка ну и тд, это понятно как сделать и не нуждается в описании) Далее открывается файл, который представляет из себя таблицу соответствия, он постоянно открыт во время работы и его подгруженный статус является необходимым условием для работы макроса. Затем открывается файл который необходимо обработать, нажимается кнопка, запускающая макрос, макрос пробегает по файлу, делает необходимые замены, затем я вручную сохраняю файл, открываю следующий, и цикл повторяется. Заморачиваться скриптом думаю не стоит)
Тут 3 исхода получается: 1. Находится соответствие в первом столбце (меняем значение на "кустарник") 2. находится соответствие во втором столбце (меняем значение на "дерево") 3. находится в обоих - вот этот пункт и вправду геморный, я думаю надо как то его исключить, чтобы осталось 2 исхода. тут мне видится такое решение: сделать так, чтобы алгоритм работал только с определенными наименованиями пород, то есть задать ветвление такого типа:
Идем циклом по столбцу F от i = 1 до n (n - номер последней заполненной ячейки) ЕСЛИ Fi не равно "Клен ясенелистный" ИЛИ "Боярышник" ИЛИ "Вишня" (и так далее, этот список я сам дополню, но суть в том, что эти наименования встречаются в обоих столбцах), то Дальше идет сравнивание ячейки с таблицей соответствия и присваивание значения ячейки Ei (дерево/кустарник, в зависимости от столбца, в котором он находит совпадение)
То есть мы сейчас исключили ту часть макроса которая бы работала с флаговыми переменными, упростив задачу)
теперь по поводу того как я вижу как это должно происходить. Макрос записывается в личную книгу макросов, создается кнопка ну и тд, это понятно как сделать и не нуждается в описании) Далее открывается файл, который представляет из себя таблицу соответствия, он постоянно открыт во время работы и его подгруженный статус является необходимым условием для работы макроса. Затем открывается файл который необходимо обработать, нажимается кнопка, запускающая макрос, макрос пробегает по файлу, делает необходимые замены, затем я вручную сохраняю файл, открываю следующий, и цикл повторяется. Заморачиваться скриптом думаю не стоит)
Ладно, нашли в одном столбце, поменяли значение, потом нашли во втором столбце - снова поменяли значение Так что-ли получается? Я вижу флаги Получили два флага, умножили один на 1, второй на 2. Смотрим результат:
Code
Sub tt() Dim flag1 As Boolean Dim flag2 As Boolean
flag1 = True flag2 = False
Select Case flag1 * 1 + flag2 * 2 Case -1: Debug.Print "куст" Case -2: Debug.Print "дерево" Case -3: Debug.Print "оба" End Select End Sub
Вот это нечётко:"Затем открывается файл который необходимо обработать, нажимается кнопка, запускающая макрос" Где указать, какой файл обрабатываем? Если активный, то кнопка должна быть в нём. Или тогда не кнопка, а по Alt+F8 код запускать придётся. И кстати, что писать макрос, что скрипт - без разницы, работа одинакова. В макросе даже на 2 строки больше
Ладно, нашли в одном столбце, поменяли значение, потом нашли во втором столбце - снова поменяли значение Так что-ли получается? Я вижу флаги Получили два флага, умножили один на 1, второй на 2. Смотрим результат:
Code
Sub tt() Dim flag1 As Boolean Dim flag2 As Boolean
flag1 = True flag2 = False
Select Case flag1 * 1 + flag2 * 2 Case -1: Debug.Print "куст" Case -2: Debug.Print "дерево" Case -3: Debug.Print "оба" End Select End Sub
Вот это нечётко:"Затем открывается файл который необходимо обработать, нажимается кнопка, запускающая макрос" Где указать, какой файл обрабатываем? Если активный, то кнопка должна быть в нём. Или тогда не кнопка, а по Alt+F8 код запускать придётся. И кстати, что писать макрос, что скрипт - без разницы, работа одинакова. В макросе даже на 2 строки больше Hugo
Ладно, нашли в одном столбце, поменяли значение, потом нашли во втором столбце - снова поменяли значение
Ну мы же в ветвлении
Quote
ЕСЛИ Fi не равно "Клен ясенелистный" ИЛИ "Боярышник" ИЛИ "Вишня"
создали список значений, к которым ничего применяться не будет, просто алгоритм будет осуществлять переход к следующей ячейке, следовательно мы исключаем случай когда возможно совпадение в обоих столбцах)
Quote
Где указать, какой файл обрабатываем? Если активный, то кнопка должна быть в нём. Или тогда не кнопка, а по Alt+F8 код запускать придётся.
Ну если макрос будет в личной книге макросов, то его можно будет забиндить на кнопку и использовать в любой открытой книге на компе, разве нет?
Quote (Hugo)
Ладно, нашли в одном столбце, поменяли значение, потом нашли во втором столбце - снова поменяли значение
Ну мы же в ветвлении
Quote
ЕСЛИ Fi не равно "Клен ясенелистный" ИЛИ "Боярышник" ИЛИ "Вишня"
создали список значений, к которым ничего применяться не будет, просто алгоритм будет осуществлять переход к следующей ячейке, следовательно мы исключаем случай когда возможно совпадение в обоих столбцах)
Quote
Где указать, какой файл обрабатываем? Если активный, то кнопка должна быть в нём. Или тогда не кнопка, а по Alt+F8 код запускать придётся.
Ну если макрос будет в личной книге макросов, то его можно будет забиндить на кнопку и использовать в любой открытой книге на компе, разве нет?
Появилась мысль сделать на двух словарях. Загнали туда оба столбца, затем проверяем список - ответ сразу, без второго цикла. Даже интересно стало сделать... вечером, или на выходных.
Про кнопку: да, если кнопка на панели, а не на листе - тогда так получится.
Появилась мысль сделать на двух словарях. Загнали туда оба столбца, затем проверяем список - ответ сразу, без второго цикла. Даже интересно стало сделать... вечером, или на выходных.
Про кнопку: да, если кнопка на панели, а не на листе - тогда так получится.
Знал бы я хорошо синтаксис VBA с удовольствием бы тоже попробовал методом тыка))) Ну алгоритм по идее должен быть работающим. А словарь в какой форме будет? Там де можно в макросе прописать обращения к открытой книге? ( в данном случае это таблица соответствия)
Знал бы я хорошо синтаксис VBA с удовольствием бы тоже попробовал методом тыка))) Ну алгоритм по идее должен быть работающим. А словарь в какой форме будет? Там де можно в макросе прописать обращения к открытой книге? ( в данном случае это таблица соответствия)Hammeron
For Each x In b If dic1.exists(CStr(x)) Then If dic2.exists(CStr(x)) Then 'присутствует и во втором,т.е. в обоих Else 'только в первом End If Else If dic2.exists(CStr(x)) Then 'только во втором End If Next
End Sub
Со словарём лучше и намного быстрее.
Вот заготовка проверки присутствия в словарях:
Code
Sub Проверка()
For Each x In b If dic1.exists(CStr(x)) Then If dic2.exists(CStr(x)) Then 'присутствует и во втором,т.е. в обоих Else 'только в первом End If Else If dic2.exists(CStr(x)) Then 'только во втором End If Next
В общем, алгоритм сложился такой: Файлы открыты, определены - это как угодно. Само ядро: 1. Берём в массив два столбца Соответствие.csv 2. Цикл по массиву - заносим данные в два словаря. 3. Берём в массив два столбца файл1.csv 4. Цикл по массиву - проверяем второй элемент массива в двух словарях. 5. По результату проверки меняем/не меняем первый элемент массива. 6. Выгружаем массив назад в файл1.csv
В общем, алгоритм сложился такой: Файлы открыты, определены - это как угодно. Само ядро: 1. Берём в массив два столбца Соответствие.csv 2. Цикл по массиву - заносим данные в два словаря. 3. Берём в массив два столбца файл1.csv 4. Цикл по массиву - проверяем второй элемент массива в двух словарях. 5. По результату проверки меняем/не меняем первый элемент массива. 6. Выгружаем массив назад в файл1.csvHugo
Попробуйте скрипт. Поместите его в одну паку с Соответствие.csv и запустите. Если не будет диалога выбора обрабатываемого файла - значит или у Вас отключены скрипты wsh, или не работает UserAccounts.CommonDialog. Во втором случае можно приспособить другой диалог выбоа файлов. Ну и в общем почти без переделок можно использовать как макрос - там уже всё в коде есть - переставьте комменты в двух местах, подключите первую и последнюю строку. Ну и типы переменным можно добавить.
Попробуйте скрипт. Поместите его в одну паку с Соответствие.csv и запустите. Если не будет диалога выбора обрабатываемого файла - значит или у Вас отключены скрипты wsh, или не работает UserAccounts.CommonDialog. Во втором случае можно приспособить другой диалог выбоа файлов. Ну и в общем почти без переделок можно использовать как макрос - там уже всё в коде есть - переставьте комменты в двух местах, подключите первую и последнюю строку. Ну и типы переменным можно добавить.Hugo
Спасибо большое! =) Скрипт работает, только выявилась одна проблемка Вообщем он когда делает замену в обрабатываемом файле, он очищает содержимое всей строки, а там у меня еще дополнительные данные в строке справа от ячеек которые заменяем) Еще такой вопрос, у меня есть простой скрипт, он по сути делает несколько замен, я же могу его скомбинировать с тем скриптом, который написан Вами? Мне надо только понять куда вставлять свои строчки кода.
Спасибо большое! =) Скрипт работает, только выявилась одна проблемка Вообщем он когда делает замену в обрабатываемом файле, он очищает содержимое всей строки, а там у меня еще дополнительные данные в строке справа от ячеек которые заменяем) Еще такой вопрос, у меня есть простой скрипт, он по сути делает несколько замен, я же могу его скомбинировать с тем скриптом, который написан Вами? Мне надо только понять куда вставлять свои строчки кода.Hammeron