Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.03.2013, 16:03   #11
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

а что мешает сделать примерно так (проверял на примере файла):

Код:
Sub Sum()
  Set R = [A1]
  I = 3
  While [A1].Offset(, I) = "№"
    Set R = Union(R, [A1].Offset(, I))
    I = I + 3
  Wend
  Set R = R.EntireColumn.SpecialCells(xlCellTypeConstants)
  Set Dic = CreateObject("Scripting.Dictionary")
  With Dic
    For Each Cod In R
      If IsNumeric(Cod.Offset(, 2)) Then
        .Item(Cod & "|" & Cod.Offset(, 1)) = .Item(Cod & "|" & Cod.Offset(, 1)) + Cod.Offset(, 2)
      End If
    Next Cod
    [A12].Resize(.Count).Value = Application.WorksheetFunction.Transpose(.Keys)
    [B12].Resize(.Count).Value = Application.WorksheetFunction.Transpose(.Items)
  End With
End Sub
Да и раскидать потом значения из словаря в квадратную таблицу проблем не составит...
при желании из цикла можно убрать проверку на IsNumeric, если сделать пересечение с областью данных без заголовка.
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 14.03.2013 в 16:06.
DiemonStar вне форума Ответить с цитированием
Старый 14.03.2013, 16:41   #12
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Примерно понял, спасибо! Буду пробовать
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 14.03.2013, 16:43   #13
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от DiemonStar Посмотреть сообщение
а что мешает сделать примерно так (проверял на примере файла):
Спасибо большое за помощь! немного накидали работы, попозже все проверю и отпишусь!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 14.03.2013, 17:32   #14
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Ну я предлагал примерно тоже самое.
1.Только для ускорения сперва взять данные в массив и перебирать его (а не ячейки листа).
2.Выгружать результат не на лист, а в виртуальный массив, потому что
3.всё это дело упаковать в UDF, для чего этот массив и нужен.

+ не нужно запускать/выполнять код
+ результат внешне будет точно как заказано (количество строк/столбцов пааметров не важно)
- сложнее этот код написать
- сложнее ввести формулу на лист - нужно выделить весь диапазон
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 14.03.2013 в 18:21. Причина: упс, что-то копипаст не закопипастил...
Hugo121 вне форума Ответить с цитированием
Старый 15.03.2013, 08:11   #15
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Цитата:
1.Только для ускорения сперва взять данные в массив и перебирать его (а не ячейки листа).
тогда можно для простоты выбор столбцов вынести в событие, например, по открытию книг или активации листа (по-идее же столбцы добавляться не должны, или должны, но редко), а в функции оставить только пересечение со строками и сохранение в массив.

Цитата:
Ну я предлагал примерно тоже самое.
У меня был практически готовый пример, сделанный, кстати, на базе макроса автора темы) немного доработать - дело недолгое.
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Старый 21.03.2013, 13:45   #16
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Добрый день! Извините что долго не появлялся, работой загрузили. Не могли бы Вы дать пример с подобной УДФ функцией, чтобы быстрее я сообразил как и что? Спасибо!
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 21.03.2013, 14:14   #17
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Готовой "подобной" под задачу не нашёл, есть просто демонстрационный код массивной UDF кажется Казанского:

Выделите диапазон 3*3 ячейки (например B5:D7)
Введите в строке формул =ReturnArray()
Нажмите Ctrl-Shift-Enter

Код:
Public Function ReturnArray() As Variant
Dim temp(1 To 3, 1 To 3) As Integer
Dim i As Integer
Dim j As Integer
For i = 1 To 3
    For j = 1 To 3
        temp(i, j) = i * i + j
    Next
Next
ReturnArray = temp
End Function

Вот исходя из аргументов формируете нужный массив, возвращаете его на лист.
webmoney: E265281470651 Z422237915069 R418926282008

Последний раз редактировалось Hugo121; 21.03.2013 в 14:17.
Hugo121 вне форума Ответить с цитированием
Старый 21.03.2013, 15:27   #18
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Наваял.


Код:
Function summproizv(tabl As Range, nr As Range, kod As Range)
    Dim a(), n(), k(), i&, ii&, t$
    a = tabl.Value: n = nr.Value: k = kod.Value

    With CreateObject("Scripting.Dictionary")
        .comparemode = 1

        For i = 2 To UBound(a, 1)
            For ii = 1 To UBound(a, 2) - 2 Step 3
                t = a(i, ii) & "|" & a(i, ii + 1)
                .Item(t) = .Item(t) + a(i, ii + 2)
            Next ii, i

            ReDim out(1 To nr.Cells.Count, 1 To kod.Cells.Count)
            For i = 1 To UBound(n, 1)
                For ii = 1 To UBound(k, 2)
                    t = n(i, 1) & "|" & k(1, ii)
                    If .exists(t) Then out(i, ii) = .Item(t)
                Next ii, i
        End With

            summproizv = out
    End Function
Выделить на листе диапазон 2х2, в строку формул ввести
=summproizv(A1:L8,N4:N5,O3:P3)
закончить ввод Ctrl+Shift+Enter.
В русском Экселе вероятно вместо "," нужно ";".
Естественно, название UDF можно придумать и пооригинальнее
Код написан под конкретную задачу - т.е. под именно такое расположение данных.

Проверьте сперва на примере, затем на данных побольше ( т.е. не 2х2, а например 100х10)
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 22.03.2013, 10:21   #19
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Цитата:
Сообщение от Hugo121 Посмотреть сообщение
Наваял.
Спасибо сегодня буду пробовать и отпишусь ))))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Старый 25.03.2013, 18:50   #20
staniiislav
Форумчанин
 
Аватар для staniiislav
 
Регистрация: 16.04.2010
Сообщений: 695
По умолчанию

Спасибо БОЛЬШОЕ за помощь!!! Вроде все что хотел получилось!!! ))))
Единственный способ стать умнее, играть с более умным противником...
staniiislav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
=СУММПРОИЗВ Slavatron1984 Microsoft Office Excel 16 01.02.2012 16:57
=СУММПРОИЗВ не осилил ее возможности Slavatron1984 Microsoft Office Excel 3 22.12.2011 15:17
Функция Суммпроизв liienna Microsoft Office Excel 5 03.07.2011 09:50
формула суммпроизв. запись в ячейку gsg Microsoft Office Excel 3 18.11.2010 09:16
Формула СУММПРОИЗВ() с данными из другой книги kipish_lp Microsoft Office Excel 7 03.06.2010 10:14