Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Спасибо! сравнивая действия вышеописанного алгоритма  и свои возможности решила пока ограничиться макросом добавления формулы суммирования :)
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
повторов нет,  о переменной тоже думала. если я ее интегрирую после
Код
 t = el & "|" & k & "|" & "Получили"
           t2 = t & "|" & "V"
           If data_dic.exists(t2) Then aa(y, 1) = data_dic.Item(t2)
это правильно будет?
Код
For Each p In data_dic.Item(t2)
   g = 0
   g = g + p
   Next
ну и дальше как было...
Код
t2 = t & "|" & "B"
           If data_dic.exists(t2) Then aa(y, 2) = data_dic.Item(t2)
Изменено: Ira1 - 23.04.2014 15:55:35
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Цитата
Hugo пишет:Ес ли нужно собирать 3 разные суммы к одному ключу - проще создать 3 разных словаря, и собирать в каждом свои суммы. А ключи будут одинаковые.
ключ переименовала для удобства.
по ключу t2 = t & "|" & "V" в   data_dic.Item(t2) есть все нужные для меня значения, мне их нужно просуммировать.
Вот единственный приметив который приходит в голову(((((((((((
Код
       Dim g As Integer
      Dim itogo As Object, s$
        Set itogo = CreateObject("Scripting.Dictionary"    
        itogo.Add s, data_dic.Item(t2)
        g = 0
      For Each p In itogo.Item(s)
      g = g + p
      Next
     G11 = g
Изменено: Ira1 - 23.04.2014 12:30:19
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Ок, поняла, спасибо!
а еще вопрос по суммированию ячеек в массиве:
решила попробовать написать код, чтобы выводимые данные на шаблон суммировались по столбцам. т.е. чтобы была строчка ИТОГО, где будет сумма по столбцу "Получили", сумма по столбцу "Выдали",сумма по столбцу "Результат".
Учитывая все советы на примере одного столбца пока получила вот что:
Код
 Set itogo = CreateObject ("Scripting.Dictionary"  )
 Dict.Key (t2 = t & "|" & "V" ) = S
Itogo.add "S", data_dic.Item(t2)
If itogo.exists(s) then ????? 

а дальше не понимаю как сумму значений  получить...
Изменено: Ira1 - 23.04.2014 10:22:11
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Всем доброго дня! Продолжаю свое познание словарей.
есть вопрос по коду, написанный Hugo: в той части, где мы собираем словарь городов

Код
 For i = 1 To UBound(a)
     t = a(i, 2)
     If Not city_dic.exists(t) Then city_dic.Add t, New Collection 

Как я понимаю, смысл этих строк - пробежать по массиву и проверить есть ли город в словаре или нет, если есть - то добавить его в коллекцию

Никак не могу понять предназначенние следующей записи:
Код
city_dic.Item(t).Add a(i, 1), a(i, 1) 

поисковик пишет:
"Items:   Назначение: возвращает массив элементов коллекции. Позволяет перебрать коллекцию в цикле. (http://www.script-coding.com/WSH/Dictionary.html)"

То есть мы его используем для перебора коллекции городов и добавляем фамилии к ним, так? если да, то почему 2 раза прописано  "a(i, 1), a(i, 1)"?
Изменено: Ira1 - 22.04.2014 11:37:51
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Михаил, Hugo, спасибо! Сейчас попробую...
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
с k  согласна. по сути я ссылаюсь на ячейку шаблона, которая пустая. заполниться только после выполнения первого кода. как лучше сделать? 2мя командами?в начале выполнять один код, а потом пролистовать листы и заполнять их другими данными или это можно как то одновременно делать?
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Свой пример решила усложнить данными, с другого листа. Написала кучу макросов - ничего не сработало. И конечный (как мне кажется - наиболее правильный) вариант следующий:
Код
 With Sheets("Данные2"  ;)  
           Set exc_dic = CreateObject("Scripting.Dictionary"  ;)  : exc_dic.comparemode = 1
         iLastrow = .Cells(.Rows.Count, 1).End(xlUp).Row
         b = Range(.[A5], .Range("B" & iLastrow)).Value
         w = 0
         w = w + 1
         b(1, w) = d
         If exc_dic.exists(d) = k Then b(w, 2) = exc_dic.Item(w, 2)
         End With 
Next
.[B4].Resize(1, 1) = b    'выгрузка данных
 

Данный код должен брать "Обозначения" с листа "Данные 2" и переносить их в ячейку B4, в случае если обозначение соответствует городу (переменная k, ячейка "А4".Подскажите, пожалуйста, в чем ошибка ? (все переменные в начале я прописала аналогично переменным в предыдущем коде).
Файл с результатом здесь:
https://www.dropbox.com/s/hd4t5u9wbpi18bw/%D0%9D%D1%83%D0%B6%D0%BD%D1%8B%D0%B9%2­0%D1%80%D0%B5%D0%B7%D1%83%D0%BB%D1%8C%D1%82%D0%B0%D1%82%202.xlsm
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Вопрос снимается, теперь все ок. перестал ругаться
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
я просто код немного переписала, так как данные Получили, Выдали,Результат  не  в те ячейки выводились. получилось следующее:

Код
 t = el & "|" & k & "|" & "Получили"
          t2 = t & "|" & "V"
          If data_dic.exists(t2) Then aa(y, 1) = data_dic.Item(t2)
          t2 = t & "|" & "B"
          If data_dic.exists(t2) Then aa(y, 4) = data_dic.Item(t2)
          t2 = t & "|" & "F"
          If data_dic.exists(t2) Then aa(y, 7) = data_dic.Item(t2)
          t = el & "|" & k & "|" & "Выдали"
          t2 = t & "|" & "V"
          If data_dic.exists(t2) Then aa(y, 2) = data_dic.Item(t2)
          t2 = t & "|" & "B"
          If data_dic.exists(t2) Then aa(y, 5) = data_dic.Item(t2)
          t2 = t & "|" & "F"
          If data_dic.exists(t2) Then aa(y,  8)  = data_dic.Item(t2)
          t = el & "|" & k & "|" & "Результат"
          t2 = t & "|" & "V"
          If data_dic.exists(t2) Then aa(y, 3) = data_dic.Item(t2)
          t2 = t & "|" & "B"
          If data_dic.exists(t2) Then aa(y, 6) = data_dic.Item(t2)
          t2 = t & "|" & "F"
          If data_dic.exists(t2) Then aa(y, 9) = data_dic.Item(t2)

 и сразу же excel указал на " ReDim aa(1 To x, 1 To 9)"
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
вопрос по строке
Код
 ReDim aa(1 To x, 1 To 9) 

как указать на то что данные будут разноситься не последоватьльно по столбцам 1 2 3 4 5 ...9, а случайно 1 4 7 или 2 5 8. Что написать вместо "to"
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
К сожалению, нет) пробовала перебирать все знакомые буквы :) . Ошибку excel объясняет : "доступ к файлу невозможен". проверьте есть ли она в наличии и нет ли в ней лишних знаков. Про знаки наводит на мысль название городов - может, как уже писала есть такие типа Москва (пос. "Северный")
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
перешла к "апгрейдингу". Все считает выдает книгу с первым городом. но форматы ему не нравяться почему-то. Перебрала много(Изначально у меня файл в ".xlsm".)

 строку
Код
 .SaveAs ThisWorkbook.Path & "/" & k & ".xls" 
 выделяет желтым. Как я понимаю, "одним махом" ее не удалишь. Ведь смысл последнией строчки, "Сокранить книгу как" , далее "Некстом" вывести данные из словаря по след.городу  и  "сохранить как"... то есть при данном раскладе должно сохраниться множество листов без переодического нажатия на кнопку с выполнением макроса. Так?
У меня выдается ошибка, а при игнорировании ее и выполнения макроса заново открывается новая книга с тем же самым городом
Изменено: Ira1 - 15.04.2014 17:35:26
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
5 минут 600 листов. сейчас немного усложнила лист данные самими данными (их стало больше). Пробую
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Ок, считает......ждемс
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Ему не нравиться  ".Name = k" в переборе городов. с чем может быть связано? Некоторые прописаны "Комсомольск на Амуре (село Иваново) - это может быть причиной?
Некоторые города или села в кавычках написаны. Ехсel пишет ошибку 1004 (нужно убедиться нет ли определенных знаком или длина не превышает 31 знак
Изменено: Ira1 - 10.04.2014 17:12:55
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Я самая счасливая женщина на земле.СПАСИБО!
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Это я пробовала изначально данные выгружать из закрытой книги, а нули скрывать. Не стала просто с этим макросом файл выгружать.так как массивы - главная проблема, которую пока мой мозг отвергает
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Звездочку игнорим
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Ок, спасибо...появляется надежда на прекрасное будущее
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Распечатала, код, разбираюсь...
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
ок
Изменено: Ira1 - 10.04.2014 11:13:07
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
у меня в закладках http://www.planetaexcel.ru/forum/?PAGE_NAME=read&FID=8&TID=35060 следующий код вашей руки.
Код
Sub compare() 
Dim tm!: tm = Timer 
 Dim a(), b(), c(), iLastrow As Long, i As Long, ii As Long, x As Byte 

 '1. 
 With Sheets(1) 
 iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row 
 a = Range(.[f1], .Range("A" & iLastrow)).Value 
 End With 

 With Sheets(2) 
 iLastrow = .Cells(Rows.Count, 1).End(xlUp).Row 
 b = Range(.[a1], .Range("A" & iLastrow)).Value 
 End With 

 '2. 
 ReDim c(1 To UBound(b), 1 To 6) 

 With CreateObject("Scripting.Dictionary"  ;)  

 '3. 
 For i = 1 To UBound(a) 
 .Item(a(i, 1)) = i 
 Next 

 '4. 
 For i = 1 To UBound(b) 
 If .exists(b(i, 1)) Then 
 ii = .Item(b(i, 1)) 
 c(i, 1) = b(i, 1) 
 For x = 2 To 6: c(i, x) = a(ii, x): Next 
 End If 
 Next 
 End With 

 '5. 
 With Sheets(3) 
 .[a1].Resize(i - 1, 6) = c 
 .Activate 
 End With 

Debug.Print Timer - tm 
End Sub 

может мне его как то можно под себя подстроить? (2 недели уже мучаюсь над вопросом))))
Изменено: Ira1 - 10.04.2014 10:28:29
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Город в ячейке А4 стоит со времен ВПР, когда вбивался город и шел перебор. Оставила его с той логикой, чтобы при создании множества листов понимать какие листы к какому городу относятся
Изменено: Ira1 - 10.04.2014 10:14:46
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Нужны все города, чтобы был такой же лист как и по Москве, по остальным городам, где будут одни и теже фамилии. Иванов, Петров, Васечкин.
Т.е. количество листов в книге = количеству городов на листе данные
Пустые столбцы оставила для внесения отдельных данных (текстовых"руками" вне макроса).

Может есть какой то пример кода максимально приближенный к моему случаю?
Изменено: Ira1 - 10.04.2014 09:51:47
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
ок
Вот файл с примером
Изменено: Ira1 - 10.04.2014 10:18:32
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Вот пример. С форумом тоже первое знакомство)))))))))
Изменено: Ira1 - 10.04.2014 00:03:57
Суммирование данных из массива по нескольким критериям, Применение массивов при большом количестве строк
 
Очень-очень нужна помощь неравнодушных в написании макроса для массива данных.
Сама пробовала взяться за массивы, никак они мне не давались. решила пойти обходным путем...и тут тоже не сложилось (первый мой опыт в макросах)
Суть проблемы:
есть 2 листа
1)  Фамилии-город - шаблон для заполнения
2) Данные - сам массив
На листе данные существуют значения с цифрами по столбцам "Всего","Без налога", "Фирм."
Нужно чтобы макрос анализируя 3 критерия "Фамилии" , "Город", "Результат" суммировал отдельно значения "Всего","Без налога", "Фирм." и результат выводил на шаблон "Фамилия город".Приэтом моя головоломка осложняется тем, что листов "Фамилия город должно быть столько, сколько городов (их обычно около 20-25)
Иными словами, при нажатии кнопки появляется множество листов "Фамилии-Город", в которых в ячейке А4 занесен сам город, в столбце А (11:95) - Фамилии+ Итого, а в столбцах G: О значения "Всего","Без налога", "Фирм." с разбивкой на получили, выдали и результат. Раньше файл создавали функциями суммесли и впр, но процесс был длительный, очень по причине того, что массив достигал до 20000 тысяч строк.  Ниже результат моих попыток написания кода (пробовала по аналогу с форума
'http://www.planetaexcel.ru/forum.php?thread_id=29337).  
Код
 Sub Counter() 
Dim Uniq As New Collection, iLastRow As Long, iLastColumn As Long
Dim i As Long, j As Long, Uniq2 As New Collection, iName As String, n As Long ' Arr1()
[I]iLastColumn = Cells(2, Columns.Count).End(xlToLeft).Column[/I]
[I]iLastRow = Cells(Rows.Count, 2).End(xlUp).Row[/I]
[I]Range(Cells(11, 1), Cells(iLastRow + 1, iLastColumn + 1)).ClearContents[/I]
[I]Range(Cells(11, 5), Cells(11, iLastColumn + 1)).ClearContents[/I]
[I]    With Sheets("Данные "[/I])
     iLastRow = .Cells(Rows.Count, 3).End(xlUp).Row
     For i = 5 To iLastRow
      On Error Resume Next
      Uniq.Add .Cells(i, 1), CStr(.Cells(i, 1))
     Next
     iLastRow = 1
     For i = 1 To Uniq.Count
      Cells(iLastRow + 1, 1) = Uniq(i)
      iLastRow = iLastRow + 1
     Next
     iLastRow = .Cells(Rows.Count, 3).End(xlUp).Row
     For i = 5 To iLastRow
      On Error Resume Next
      Uniq2.Add .Cells(i, 3), CStr(.Cells(i, 3))
     Next
     iLastColumn = 5
     For i = 1 To Uniq2.Count
      Cells(4, iLastColumn + 1) = Uniq2(i)
      iLastColumn = iLastColumn + 1
     Next
     iLastColumn = Cells(2, Columns.Count).End(xlToLeft).Column
     iLastRow = .Cells(Rows.Count, 2).End(xlUp).Row
     For j = 4 To iLastColumn
      iName = Cells(2, j)
      For i = 1 To Uniq.Count
          For n = 3 To iLastRow
           If .Cells(n, 1) = iName Then
            If .Cells(n, 2) = Uniq(i) Then
                Cells(i + 2, j) = Cells(i + 2, j) + .Cells(n, 3)
            End If
           End If
          Next
      Next
     Next
'     Next
    End With
End Sub   
Изменено: Ira1 - 09.04.2014 23:44:50
Страницы: 1
Наверх