Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Сохранить формулы в "словаре" - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Сохранить формулы в "словаре"
pechkin Дата: Понедельник, 09.02.2015, 17:43 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 332
Репутация: 49 ±
Замечаний: 0% ±

2003
Здравствуйте! Требуется помощь! Есть Макрос, любезно подсказанный на этом форуме hands , который извлекает данные по условию, так называемый "словарь" Но к сожалению после его работы формулы в столбцах меняются на значения. Та же задача выполнима циклом, но на большом файле тормозит. Возможно ли сохранять формулы после работы "словаря" Спасибо!
К сообщению приложен файл: 3548912.xls (93.5 Kb)
 
Ответить
СообщениеЗдравствуйте! Требуется помощь! Есть Макрос, любезно подсказанный на этом форуме hands , который извлекает данные по условию, так называемый "словарь" Но к сожалению после его работы формулы в столбцах меняются на значения. Та же задача выполнима циклом, но на большом файле тормозит. Возможно ли сохранять формулы после работы "словаря" Спасибо!

Автор - pechkin
Дата добавления - 09.02.2015 в 17:43
RAN Дата: Понедельник, 09.02.2015, 18:22 | Сообщение № 2
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
А что, Sub Словарь() в приложенном файле работает?
Для того, чтобы работал, нужно переписывать формирование условия проверки.
Для того, чтобы не убивал формулы, нужно переопределять диапазоны.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеА что, Sub Словарь() в приложенном файле работает?
Для того, чтобы работал, нужно переписывать формирование условия проверки.
Для того, чтобы не убивал формулы, нужно переопределять диапазоны.

Автор - RAN
Дата добавления - 09.02.2015 в 18:22
Hugo Дата: Понедельник, 09.02.2015, 18:36 | Сообщение № 3
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Измените эту строку так:
[vba]
Код
b = Sheets("янв").UsedRange.Offset(1).Formula
[/vba]

Но если данных много - то конечно экономичнее в массив с критериями брать только критерии (2 столбца), а для результата создать отдельный массив (или несколько) строго под нужное количество столбцов, и только их и выгружать, формулы вообще не трогая.
А то сейчас в коде есть косячок - UsedRange то фальшивая :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Понедельник, 09.02.2015, 18:42
 
Ответить
СообщениеИзмените эту строку так:
[vba]
Код
b = Sheets("янв").UsedRange.Offset(1).Formula
[/vba]

Но если данных много - то конечно экономичнее в массив с критериями брать только критерии (2 столбца), а для результата создать отдельный массив (или несколько) строго под нужное количество столбцов, и только их и выгружать, формулы вообще не трогая.
А то сейчас в коде есть косячок - UsedRange то фальшивая :)

Автор - Hugo
Дата добавления - 09.02.2015 в 18:36
pechkin Дата: Понедельник, 09.02.2015, 19:17 | Сообщение № 4
Группа: Проверенные
Ранг: Обитатель
Сообщений: 332
Репутация: 49 ±
Замечаний: 0% ±

2003
Спасибо RAN, Спасибо Hugo! Ваши рекомендации для меня очень полезны, хотя я не имею никаких теоретических знаний в VBA. Все что получается (или нет) только благодаря этому форуму и методу практического "тыка" под свою задачу. Если не трудно, то что значит "фальшивая UsedRange " Мне казалось что это означает пользовательский (используемый или заполненный) диапазон :( Заменив строку по совету Hugo в первом приближении все работает еще проверю на файле.
Спасибо!
 
Ответить
СообщениеСпасибо RAN, Спасибо Hugo! Ваши рекомендации для меня очень полезны, хотя я не имею никаких теоретических знаний в VBA. Все что получается (или нет) только благодаря этому форуму и методу практического "тыка" под свою задачу. Если не трудно, то что значит "фальшивая UsedRange " Мне казалось что это означает пользовательский (используемый или заполненный) диапазон :( Заменив строку по совету Hugo в первом приближении все работает еще проверю на файле.
Спасибо!

Автор - pechkin
Дата добавления - 09.02.2015 в 19:17
RAN Дата: Понедельник, 09.02.2015, 19:34 | Сообщение № 5
Группа: Друзья
Ранг: Экселист
Сообщений: 5660
Репутация: 1163 ±
Замечаний: 0% ±

2010
По поводу не работает я погорячился, не обратил внимание, что в скрытых слолбцах дубль информации.
По поводу фальшивости не понял, но в строке
[vba]
Код
b = Sheets("янв").UsedRange.Offset(1).Formula
[/vba]
[vba]
Код
.Offset(1)
[/vba] не дает ровным счетом ничего.
Мне казалось что это означает пользовательский (используемый или заполненный) диапазон

Правильно казалось. Но еще правильнее то, что он (A1:U510) вам не нужен, а нужен определенный диапазон с данными.


Быть или не быть, вот в чем загвоздка!
 
Ответить
СообщениеПо поводу не работает я погорячился, не обратил внимание, что в скрытых слолбцах дубль информации.
По поводу фальшивости не понял, но в строке
[vba]
Код
b = Sheets("янв").UsedRange.Offset(1).Formula
[/vba]
[vba]
Код
.Offset(1)
[/vba] не дает ровным счетом ничего.
Мне казалось что это означает пользовательский (используемый или заполненный) диапазон

Правильно казалось. Но еще правильнее то, что он (A1:U510) вам не нужен, а нужен определенный диапазон с данными.

Автор - RAN
Дата добавления - 09.02.2015 в 19:34
Hugo Дата: Понедельник, 09.02.2015, 20:32 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

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


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD


Сообщение отредактировал Hugo - Понедельник, 09.02.2015, 20:50
 
Ответить
Сообщение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]

Автор - Hugo
Дата добавления - 09.02.2015 в 20:32
pechkin Дата: Четверг, 12.02.2015, 17:49 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 332
Репутация: 49 ±
Замечаний: 0% ±

2003
Здравствуйте! Еще раз спасибо RAN и Hugo, давших свои советы по этой теме и прошу прощения за еще один вопрос... Последний Макрос от Hugo отлично работает быстро, формулы не трогает, но убивает старые значения в ячейках где совпадения не найдены. Как бы подкорректировать? Спасибо!
К сообщению приложен файл: 21.xls (92.0 Kb)


Сообщение отредактировал pechkin - Четверг, 12.02.2015, 17:49
 
Ответить
СообщениеЗдравствуйте! Еще раз спасибо RAN и Hugo, давших свои советы по этой теме и прошу прощения за еще один вопрос... Последний Макрос от Hugo отлично работает быстро, формулы не трогает, но убивает старые значения в ячейках где совпадения не найдены. Как бы подкорректировать? Спасибо!

Автор - pechkin
Дата добавления - 12.02.2015 в 17:49
Hugo Дата: Четверг, 12.02.2015, 18:03 | Сообщение № 8
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Файл пока смотреть некогда, но ответ ясен - берите в массивы c и d диапазоны с листа, а не создавайте их заново пустые.


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеФайл пока смотреть некогда, но ответ ясен - берите в массивы c и d диапазоны с листа, а не создавайте их заново пустые.

Автор - Hugo
Дата добавления - 12.02.2015 в 18:03
Manyasha Дата: Пятница, 13.02.2015, 17:25 | Сообщение № 9
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Если еще нужно, добавила после строчек в макросе Hugo
[vba]
Код
        ReDim c(1 To UBound(b), 1 To 1)
         ReDim d(1 To UBound(b), 1 To 1)
[/vba]
код
[vba]
Код
c = Sheets("янв").UsedRange.Columns(4).Resize(, 1).Value
d = Sheets("янв").UsedRange.Columns(20).Resize(, 1).Value
[/vba]

Тогда старые значения остаются.


ЯД: 410013299366744 WM: R193491431804

Сообщение отредактировал Manyasha - Пятница, 13.02.2015, 17:28
 
Ответить
СообщениеЕсли еще нужно, добавила после строчек в макросе Hugo
[vba]
Код
        ReDim c(1 To UBound(b), 1 To 1)
         ReDim d(1 To UBound(b), 1 To 1)
[/vba]
код
[vba]
Код
c = Sheets("янв").UsedRange.Columns(4).Resize(, 1).Value
d = Sheets("янв").UsedRange.Columns(20).Resize(, 1).Value
[/vba]

Тогда старые значения остаются.

Автор - Manyasha
Дата добавления - 13.02.2015 в 17:25
Hugo Дата: Пятница, 13.02.2015, 17:29 | Сообщение № 10
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Manyasha, в таком варианте ReDim лишнее - достаточно просто объявить массивы, как с a() и b()


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеManyasha, в таком варианте ReDim лишнее - достаточно просто объявить массивы, как с a() и b()

Автор - Hugo
Дата добавления - 13.02.2015 в 17:29
Manyasha Дата: Пятница, 13.02.2015, 17:41 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Hugo, спасибо! Буду знать)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеHugo, спасибо! Буду знать)

Автор - Manyasha
Дата добавления - 13.02.2015 в 17:41
pechkin Дата: Пятница, 13.02.2015, 19:22 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 332
Репутация: 49 ±
Замечаний: 0% ±

2003
Огромное спасибо, Manyasha!-Работает. И все же обращаясь к первоисточнику, Hugo, для неграмотных :( укажите буквами как записать и где Ваше a() и b() (строчку макроса) Спасибо!


Сообщение отредактировал pechkin - Пятница, 13.02.2015, 19:23
 
Ответить
СообщениеОгромное спасибо, Manyasha!-Работает. И все же обращаясь к первоисточнику, Hugo, для неграмотных :( укажите буквами как записать и где Ваше a() и b() (строчку макроса) Спасибо!

Автор - pechkin
Дата добавления - 13.02.2015 в 19:22
Hugo Дата: Пятница, 13.02.2015, 20:08 | Сообщение № 13
Группа: Друзья
Ранг: Участник клуба
Сообщений: 3859
Репутация: 819 ±
Замечаний: 0% ±

365
Первая строка макроса:
[vba]
Код
Dim a(), aa(), b(), i&, t$, x&
[/vba]
вот туда добавьте ещё c(), d() - аналогично a(), b()
А строки с ReDim вообще уберите, они не мешают - но будут лишними, если после них эти массивы будут создаваться из диапазонов.
Так и научитесь потихоньку :)


webmoney: E265281470651 Z422237915069
USDT TRC20: TN8XeEF17o5KPBD9pNwYzNyruycuAc2mVD
 
Ответить
СообщениеПервая строка макроса:
[vba]
Код
Dim a(), aa(), b(), i&, t$, x&
[/vba]
вот туда добавьте ещё c(), d() - аналогично a(), b()
А строки с ReDim вообще уберите, они не мешают - но будут лишними, если после них эти массивы будут создаваться из диапазонов.
Так и научитесь потихоньку :)

Автор - Hugo
Дата добавления - 13.02.2015 в 20:08
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2025 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!