накропал самостоятельно макрос с циклом (для меня это вверх моего познания VBA, поэтому сильно не смеяться)
[vba]
Код
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Application.ScreenUpdating = False Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i Dim q For i = 3 To 26000 Sheets("остальные сборочки").Select Dan2 = Cells(i, 23) Cells(i, 1).Interior.Color = 31569 Cells(i, 30) = i - 2 For q = 3 To 25788 Sheets("НКУ").Select Dan1 = Cells(q, 23) If Dan1 = Dan2 Then Cells(q, 1).Interior.Color = 31569 Cells(q, 30) = q - 2 Exit For End If Next q Next i Application.ScreenUpdating = True MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
[/vba]
Но срок работы его просто видимо на многие часы.. есть способ как то ускорить этот процесс?
накропал самостоятельно макрос с циклом (для меня это вверх моего познания VBA, поэтому сильно не смеяться)
[vba]
Код
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Application.ScreenUpdating = False Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i Dim q For i = 3 To 26000 Sheets("остальные сборочки").Select Dan2 = Cells(i, 23) Cells(i, 1).Interior.Color = 31569 Cells(i, 30) = i - 2 For q = 3 To 25788 Sheets("НКУ").Select Dan1 = Cells(q, 23) If Dan1 = Dan2 Then Cells(q, 1).Interior.Color = 31569 Cells(q, 30) = q - 2 Exit For End If Next q Next i Application.ScreenUpdating = True MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
[/vba]
Но срок работы его просто видимо на многие часы.. есть способ как то ускорить этот процесс?ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Сообщение отредактировал ovechkin1973 - Суббота, 27.01.2018, 19:33
для начала избавьтесь от Sheets("остальные сборочки").Select и Sheets("НКУ").Select Ну а следом, можно просто для перебора использовать два массива, а не переберать ячейки, и после сравнения производить. я так понимаю Cells(i, 1).Interior.Color = 31569 - это вы просто пытались отметить, обработано или нет.
для начала избавьтесь от Sheets("остальные сборочки").Select и Sheets("НКУ").Select Ну а следом, можно просто для перебора использовать два массива, а не переберать ячейки, и после сравнения производить. я так понимаю Cells(i, 1).Interior.Color = 31569 - это вы просто пытались отметить, обработано или нет.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Суббота, 27.01.2018, 22:48
и насколько или во сколько какие действия ускоряют работу? И еще возможно глупый вопрос.. а можно как то прикинуть сколько будет работать по времени такой макрос?
и насколько или во сколько какие действия ускоряют работу? И еще возможно глупый вопрос.. а можно как то прикинуть сколько будет работать по времени такой макрос?ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Сообщение отредактировал ovechkin1973 - Суббота, 27.01.2018, 20:24
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Dim OldCalc As Integer With Application .ScreenUpdating = False OldCalc = .Calculation .Calculation = xlCalculationManual End With Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i As Long Dim q As Long With Sheets("остальные сборочки") For i = 3 To 26000 Dan2 = .Cells(i, 23) .Cells(i, 1).Interior.Color = 31569 .Cells(i, 30) = i - 2 With Sheets("НКУ") For q = 3 To 25788 If .Cells(q, 23) = Dan2 Then .Cells(q, 1).Interior.Color = 31569 .Cells(q, 30) = q - 2 Exit For End If Next q End With Next i End With With Application .ScreenUpdating = True .Calculation = OldCalc End With MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
[/vba]
А прикинуть невозможно, так как зависит в том числе и от производительности ПК. То что на нем параллельно работает ....
Ну для начала так
[vba]
Код
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Dim OldCalc As Integer With Application .ScreenUpdating = False OldCalc = .Calculation .Calculation = xlCalculationManual End With Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i As Long Dim q As Long With Sheets("остальные сборочки") For i = 3 To 26000 Dan2 = .Cells(i, 23) .Cells(i, 1).Interior.Color = 31569 .Cells(i, 30) = i - 2 With Sheets("НКУ") For q = 3 To 25788 If .Cells(q, 23) = Dan2 Then .Cells(q, 1).Interior.Color = 31569 .Cells(q, 30) = q - 2 Exit For End If Next q End With Next i End With With Application .ScreenUpdating = True .Calculation = OldCalc End With MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
[/vba]
А прикинуть невозможно, так как зависит в том числе и от производительности ПК. То что на нем параллельно работает .... bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Суббота, 27.01.2018, 21:00
Уважаемый bmv98rus, Пока ждал работы своего макроса (в итоге ждать не стал и остановил принудительно работу и Ваш код перезаписал) читал инфу по ускорению работы VBA.. немного стало стыдно.. Оказывается я не только про отключение обновления экрана должен знать, но и об отключении формул на время работы макроса и другие вещи, которые даже не понимая мог использовать.. Но это к лучшему.. пока Экслель "висел" я кое что прочитал.. некоторые вещи примененные Вами мне понятны. Ну и массивы Вы тоже не применяли.. так? Макрос запустил.. буду ждать результата. Потом отпишусь. Если кто то даст ссылку с примером(и) на решение аналогичных задач с помощью массивов - будет для меня познавательно. Сам пока не смог даже приблизительно разобраться.
Уважаемый bmv98rus, Пока ждал работы своего макроса (в итоге ждать не стал и остановил принудительно работу и Ваш код перезаписал) читал инфу по ускорению работы VBA.. немного стало стыдно.. Оказывается я не только про отключение обновления экрана должен знать, но и об отключении формул на время работы макроса и другие вещи, которые даже не понимая мог использовать.. Но это к лучшему.. пока Экслель "висел" я кое что прочитал.. некоторые вещи примененные Вами мне понятны. Ну и массивы Вы тоже не применяли.. так? Макрос запустил.. буду ждать результата. Потом отпишусь. Если кто то даст ссылку с примером(и) на решение аналогичных задач с помощью массивов - будет для меня познавательно. Сам пока не смог даже приблизительно разобраться.ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
ла не применял, возможно для вашего случая такого варианта будет достаточно
[vba]
Код
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Dim OldCalc As Integer With Application .ScreenUpdating = False OldCalc = .Calculation .Calculation = xlCalculationManual End With Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i As Long Dim q As Long arr = Sheets("НКУ").Range(Sheets("НКУ").Cells(3, 23), Sheets("НКУ").Cells(25788, 23)) With Sheets("остальные сборочки") For i = 3 To 26000 Dan2 = .Cells(i, 23) .Cells(i, 1).Interior.Color = 31569 .Cells(i, 30) = i - 2 With Sheets("НКУ") For q = 1 To UBound(arr) If arr(q, 1) = Dan2 Then .Cells(q, 1).Interior.Color = 31569 .Cells(q, 30) = q - 2 Exit For End If Next q End With Next i End With With Application .ScreenUpdating = True .Calculation = OldCalc End With MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
ла не применял, возможно для вашего случая такого варианта будет достаточно
[vba]
Код
Sub СравнениеКороткий() Dim iTimer As Single 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) iTimer = Timer 'включаем таймер для определения времени назначения гиперссылок (не представляю как работает) Dim OldCalc As Integer With Application .ScreenUpdating = False OldCalc = .Calculation .Calculation = xlCalculationManual End With Dim Dan1 As String 'назначаем переменную Dan String (текстового типа) Dim Dan2 As String 'назначаем переменную Dan String (текстового типа) Dim i As Long Dim q As Long arr = Sheets("НКУ").Range(Sheets("НКУ").Cells(3, 23), Sheets("НКУ").Cells(25788, 23)) With Sheets("остальные сборочки") For i = 3 To 26000 Dan2 = .Cells(i, 23) .Cells(i, 1).Interior.Color = 31569 .Cells(i, 30) = i - 2 With Sheets("НКУ") For q = 1 To UBound(arr) If arr(q, 1) = Dan2 Then .Cells(q, 1).Interior.Color = 31569 .Cells(q, 30) = q - 2 Exit For End If Next q End With Next i End With With Application .ScreenUpdating = True .Calculation = OldCalc End With MsgBox "Макрос работал " & Format((Timer - iTimer) / 86400, "Long Time"), vbExclamation, "" 'выводит сообщение о времени работы макроса End Sub
возможно для вашего случая такого варианта будет достаточно
Попробую после того, как первый вариант маркоса отработает. Если конечно он до утра расчет сделает. Самое противное, что мне надо часто запускать макрос, чтобы проверить работу по заполнению базы данных.. но тут уж лучше пусть комп это делает..
возможно для вашего случая такого варианта будет достаточно
Попробую после того, как первый вариант маркоса отработает. Если конечно он до утра расчет сделает. Самое противное, что мне надо часто запускать макрос, чтобы проверить работу по заполнению базы данных.. но тут уж лучше пусть комп это делает..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Начать можно отсюда Взять диапазон в массив Был бы файл с примером, можно было бы говорить более предметно
Елена, завтра почитаю ссылку.. и только после этого сделаю пример для наглядности, который можно будет выложить. На дружественном форуме прочитал, как правильно задавать вопросы... понял, что делаю это как троечник .. поэтому вначале вашу ссылку почитаю, но это завтра..
Начать можно отсюда Взять диапазон в массив Был бы файл с примером, можно было бы говорить более предметно
Елена, завтра почитаю ссылку.. и только после этого сделаю пример для наглядности, который можно будет выложить. На дружественном форуме прочитал, как правильно задавать вопросы... понял, что делаю это как троечник .. поэтому вначале вашу ссылку почитаю, но это завтра..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
Вот тут возникает самый главный вопрос, может не циклом надо делать, а иными средствами . Вам что надо в итоге? У меня такое подозрение, что или формулы быстрее обработают, разве что без закраски, хотя и её условным форматом можно сделать или Power Query даст ответ. Пример из пары десятков строк двух таблиц дал бы пищку для размышлений и помощи. К стати, а почему 26000? лишнее тоже не стоит обсчитывать.
Вот тут возникает самый главный вопрос, может не циклом надо делать, а иными средствами . Вам что надо в итоге? У меня такое подозрение, что или формулы быстрее обработают, разве что без закраски, хотя и её условным форматом можно сделать или Power Query даст ответ. Пример из пары десятков строк двух таблиц дал бы пищку для размышлений и помощи. К стати, а почему 26000? лишнее тоже не стоит обсчитывать.bmv98rus
Замечательный Временно просто медведь , процентов на 20.
Сообщение отредактировал bmv98rus - Суббота, 27.01.2018, 22:00
bmv98rus, не знаю, возможно. Но для меня не очень удобно. Ваш макрос из поста №5 показал, что считал 23:03:15... это видимо какой то баг.. с таймером.. не считал он сутки.. около часа примерно. Макрос из сообщения №7 ругается на [vba]
bmv98rus, не знаю, возможно. Но для меня не очень удобно. Ваш макрос из поста №5 показал, что считал 23:03:15... это видимо какой то баг.. с таймером.. не считал он сутки.. около часа примерно. Макрос из сообщения №7 ругается на [vba]
работы макросу на этих данных без закраски несколько секунд 1. считать одну таблицу одной строкой в массив 2. загнать массив в словарь 3. считать в массив вторую таблицу 4. пробежаться по массиву 1 раз проверяя наличие в словаре. Если есть - ставить метку в 30 колонку 5. вывалить массив на лист
Цитата
не считал он сутки.. около часа примерно
работы макросу на этих данных без закраски несколько секунд 1. считать одну таблицу одной строкой в массив 2. загнать массив в словарь 3. считать в массив вторую таблицу 4. пробежаться по массиву 1 раз проверяя наличие в словаре. Если есть - ставить метку в 30 колонку 5. вывалить массив на лист
Прикладываю файл для наглядности.. Применить маркрос и поста №7 так и не смог.. Елена - смотрел инфу по вашей ссылке. Разобраться не смог.. Точнее не представляю пока что с этим делать.. я про массивы. Я так понимаю у меня должно быть для ускорения выполнения моей задачи два двухмерных массива. По той ссылке, что вы дали самый первый пример помогает определиться с его размерами (моих знаний только на это пока хватило).. если я конечно правильно понял. И еще пару багов обнаружил сделанных своими руками: 1. Я в 30 столбце хотел проставлять нумерацию найденных совпадений между листами.. т.е. если макрос нашел на обоих листах в 23 столбцах цифру 2 (Абакан), то и в 30 столбце номер должен быть одинаковый, который циклом проставляется.. У меня обои листы идентичны, я только на первом от Я до А фильтр сделал для проверки и не верно работает макрос.. 2. На листе 2 (остальные сборочки) после срабатывания макроса не работам фильтр или сортировка по цвету.. на листе1 (НКУ) работает... чего я "накосячить" мог для этого? B маркос закрашивает все данные в столбце 1.. такого по задумке не должно быть.. т.е. получается на листе "остальные сборочки" он сразу красит не дожидаясь проверки? 3. Ну и это наверно не только цикл в цикле, т.е. двойной, а тройной надо делать.. Допустим из 1111 городов он находит совпадений 768 (столько закрашивается городов на листе НКУ)... Как сделать, чтобы нуменация найденных совпадений на обоих листах в столбце 30 была от 1 до 768 тогда?
Прикладываю файл для наглядности.. Применить маркрос и поста №7 так и не смог.. Елена - смотрел инфу по вашей ссылке. Разобраться не смог.. Точнее не представляю пока что с этим делать.. я про массивы. Я так понимаю у меня должно быть для ускорения выполнения моей задачи два двухмерных массива. По той ссылке, что вы дали самый первый пример помогает определиться с его размерами (моих знаний только на это пока хватило).. если я конечно правильно понял. И еще пару багов обнаружил сделанных своими руками: 1. Я в 30 столбце хотел проставлять нумерацию найденных совпадений между листами.. т.е. если макрос нашел на обоих листах в 23 столбцах цифру 2 (Абакан), то и в 30 столбце номер должен быть одинаковый, который циклом проставляется.. У меня обои листы идентичны, я только на первом от Я до А фильтр сделал для проверки и не верно работает макрос.. 2. На листе 2 (остальные сборочки) после срабатывания макроса не работам фильтр или сортировка по цвету.. на листе1 (НКУ) работает... чего я "накосячить" мог для этого? B маркос закрашивает все данные в столбце 1.. такого по задумке не должно быть.. т.е. получается на листе "остальные сборочки" он сразу красит не дожидаясь проверки? 3. Ну и это наверно не только цикл в цикле, т.е. двойной, а тройной надо делать.. Допустим из 1111 городов он находит совпадений 768 (столько закрашивается городов на листе НКУ)... Как сделать, чтобы нуменация найденных совпадений на обоих листах в столбце 30 была от 1 до 768 тогда?ovechkin1973
alex77755, Это мой первый макрос с циклом сделанный своими ручками.. я про пост №1.. То, что вы предлагаете я пока даже и осмыслить не могу..
alex77755, Это мой первый макрос с циклом сделанный своими ручками.. я про пост №1.. То, что вы предлагаете я пока даже и осмыслить не могу..ovechkin1973
Плохо когда не знаешь, да еще забудешь. Правильно сформулированный вопрос содержит половину ответа.
С этого всегда надо начинать. Уверен, что вопрос уже давно был бы решен посмотрю сейчас
Согласен.. вчера окрыленный тем, что хоть что то сам смог сделать элементарное пытался без примера решить проблему.. в итоге время потеряно ( не скажу, что зря).. нашел кучу ошибок.. Ошибки я устранил.. но похоже опять код по производительности ухудшил..
С этого всегда надо начинать. Уверен, что вопрос уже давно был бы решен посмотрю сейчас
Согласен.. вчера окрыленный тем, что хоть что то сам смог сделать элементарное пытался без примера решить проблему.. в итоге время потеряно ( не скажу, что зря).. нашел кучу ошибок.. Ошибки я устранил.. но похоже опять код по производительности ухудшил..ovechkin1973