Здравствуйте! Требуется помощь! Есть Макрос, любезно подсказанный на этом форуме , который извлекает данные по условию, так называемый "словарь" Но к сожалению после его работы формулы в столбцах меняются на значения. Та же задача выполнима циклом, но на большом файле тормозит. Возможно ли сохранять формулы после работы "словаря" Спасибо!
Здравствуйте! Требуется помощь! Есть Макрос, любезно подсказанный на этом форуме , который извлекает данные по условию, так называемый "словарь" Но к сожалению после его работы формулы в столбцах меняются на значения. Та же задача выполнима циклом, но на большом файле тормозит. Возможно ли сохранять формулы после работы "словаря" Спасибо!pechkin
А что, Sub Словарь() в приложенном файле работает? Для того, чтобы работал, нужно переписывать формирование условия проверки. Для того, чтобы не убивал формулы, нужно переопределять диапазоны.
А что, Sub Словарь() в приложенном файле работает? Для того, чтобы работал, нужно переписывать формирование условия проверки. Для того, чтобы не убивал формулы, нужно переопределять диапазоны.RAN
Но если данных много - то конечно экономичнее в массив с критериями брать только критерии (2 столбца), а для результата создать отдельный массив (или несколько) строго под нужное количество столбцов, и только их и выгружать, формулы вообще не трогая. А то сейчас в коде есть косячок - UsedRange то фальшивая
Измените эту строку так: [vba]
Код
b = Sheets("янв").UsedRange.Offset(1).Formula
[/vba]
Но если данных много - то конечно экономичнее в массив с критериями брать только критерии (2 столбца), а для результата создать отдельный массив (или несколько) строго под нужное количество столбцов, и только их и выгружать, формулы вообще не трогая. А то сейчас в коде есть косячок - UsedRange то фальшивая Hugo
Спасибо RAN, Спасибо Hugo! Ваши рекомендации для меня очень полезны, хотя я не имею никаких теоретических знаний в VBA. Все что получается (или нет) только благодаря этому форуму и методу практического "тыка" под свою задачу. Если не трудно, то что значит "фальшивая UsedRange " Мне казалось что это означает пользовательский (используемый или заполненный) диапазон Заменив строку по совету Hugo в первом приближении все работает еще проверю на файле. Спасибо!
Спасибо RAN, Спасибо Hugo! Ваши рекомендации для меня очень полезны, хотя я не имею никаких теоретических знаний в VBA. Все что получается (или нет) только благодаря этому форуму и методу практического "тыка" под свою задачу. Если не трудно, то что значит "фальшивая UsedRange " Мне казалось что это означает пользовательский (используемый или заполненный) диапазон Заменив строку по совету Hugo в первом приближении все работает еще проверю на файле. Спасибо!pechkin
Offset(1) было в первом варианте, там я шапку откидывал - чем-то вероятно мешала, не помню уже. Про usedrange - если вот в этом варианте заполненные ячейки скопировать на новый чистый лист (или удалить все столбцы правее данных на этом) - то код выпадет в ошибку. Т.е. код писался под другие данные, где шапка была по всему нужному диапазону, и в этой области было место для данных. Сейчас шапки такой нет, и ошибки нет только потому, что когда-то эта область использовалась, и эксель это помнит (хотя правильнее было бы забыть...)
Вот так не трогаем ничего лишнего - но куча массивов... [vba]
Код
Sub Словарь() Sub Словарь()
Dim a(), aa(), b(), i&, t$, x&
With CreateObject("scripting.dictionary"): .comparemode = 1 With Sheets("Месячный").UsedRange a = .Columns(2).Resize(, 3).Value aa = .Columns(7).Value End With For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 2)) = i: Next
b = Sheets("янв").UsedRange.Columns(1).Resize(, 2).Value ReDim c(1 To UBound(b), 1 To 1) ReDim d(1 To UBound(b), 1 To 1) For i = 1 To UBound(b) t = b(i, 1) & "|" & b(i, 2) If .exists(t) Then x = .Item(t) c(i, 1) = a(x, 3) d(i, 1) = aa(x, 1) End If Next End With With Sheets("янв") .[r1].Resize(UBound(b), 1).Value = c .[t1].Resize(UBound(b), 1).Value = d End With End Sub
[/vba]
Offset(1) было в первом варианте, там я шапку откидывал - чем-то вероятно мешала, не помню уже. Про usedrange - если вот в этом варианте заполненные ячейки скопировать на новый чистый лист (или удалить все столбцы правее данных на этом) - то код выпадет в ошибку. Т.е. код писался под другие данные, где шапка была по всему нужному диапазону, и в этой области было место для данных. Сейчас шапки такой нет, и ошибки нет только потому, что когда-то эта область использовалась, и эксель это помнит (хотя правильнее было бы забыть...)
Вот так не трогаем ничего лишнего - но куча массивов... [vba]
Код
Sub Словарь() Sub Словарь()
Dim a(), aa(), b(), i&, t$, x&
With CreateObject("scripting.dictionary"): .comparemode = 1 With Sheets("Месячный").UsedRange a = .Columns(2).Resize(, 3).Value aa = .Columns(7).Value End With For i = 1 To UBound(a): .Item(a(i, 1) & "|" & a(i, 2)) = i: Next
b = Sheets("янв").UsedRange.Columns(1).Resize(, 2).Value ReDim c(1 To UBound(b), 1 To 1) ReDim d(1 To UBound(b), 1 To 1) For i = 1 To UBound(b) t = b(i, 1) & "|" & b(i, 2) If .exists(t) Then x = .Item(t) c(i, 1) = a(x, 3) d(i, 1) = aa(x, 1) End If Next End With With Sheets("янв") .[r1].Resize(UBound(b), 1).Value = c .[t1].Resize(UBound(b), 1).Value = d End With End Sub
Здравствуйте! Еще раз спасибо RAN и Hugo, давших свои советы по этой теме и прошу прощения за еще один вопрос... Последний Макрос от Hugo отлично работает быстро, формулы не трогает, но убивает старые значения в ячейках где совпадения не найдены. Как бы подкорректировать? Спасибо!
Здравствуйте! Еще раз спасибо RAN и Hugo, давших свои советы по этой теме и прошу прощения за еще один вопрос... Последний Макрос от Hugo отлично работает быстро, формулы не трогает, но убивает старые значения в ячейках где совпадения не найдены. Как бы подкорректировать? Спасибо!pechkin
Огромное спасибо, Manyasha!-Работает. И все же обращаясь к первоисточнику, Hugo, для неграмотных укажите буквами как записать и где Ваше a() и b() (строчку макроса) Спасибо!
Огромное спасибо, Manyasha!-Работает. И все же обращаясь к первоисточнику, Hugo, для неграмотных укажите буквами как записать и где Ваше a() и b() (строчку макроса) Спасибо!pechkin
Сообщение отредактировал pechkin - Пятница, 13.02.2015, 19:23
[/vba] вот туда добавьте ещё c(), d() - аналогично a(), b() А строки с ReDim вообще уберите, они не мешают - но будут лишними, если после них эти массивы будут создаваться из диапазонов. Так и научитесь потихоньку
Первая строка макроса: [vba]
Код
Dim a(), aa(), b(), i&, t$, x&
[/vba] вот туда добавьте ещё c(), d() - аналогично a(), b() А строки с ReDim вообще уберите, они не мешают - но будут лишними, если после них эти массивы будут создаваться из диапазонов. Так и научитесь потихоньку Hugo