Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.93/58: Рейтинг темы: голосов - 58, средняя оценка - 4.93
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16

Сумма всех комбинаций значений из столбца чисел

18.07.2014, 16:44. Показов 13056. Ответов 45
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача для функции:
  1. Выделяем столбец, состоящий из чисел.
  2. Необходимо суммировать все возможные комбинации из чисел этого столбца.
  3. Записать суммы всех комбинаций в столбец

Например n=4:
1
2
3
4
Кликните здесь для просмотра всего текста
суммы
3
4
5
5
6
7
6
7
8
9
10
Надеюсь, что ничего не забыл


Знаю о существовании топика ПОДБОР всех возможных комбинаций СУММЫ ячеек, но так как я полный дилетант в VBA, я не смог подкорректировать дельные советы по свой случай.

Прикрепляю файл, для которого это нужно провернуть.
123.xls
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
18.07.2014, 16:44
Ответы с готовыми решениями:

Сумма всех чисел из одного столбца ListBox
Как узнать итоговую сумму всех товаров? данные в листбокс заносятся из другой формы, следовательно товаров может быть разное количество....

Сумма вероятностей всех возможных комбинаций
Здравствуйте. Объясните, пожалуйста. Например, есть три символа, каждому присвоена вероятность, а в сумме эти вероятности дают...

Сумма произведений чисел комбинаций для k из n
Есть набор чисел. Их количество равно n. Нужно просчитать количество комбинаций для k из n (т.е., например, для 5 из 8). Это решил 3-мя...

45
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
22.07.2014, 12:52
Студворк — интернет-сервис помощи студентам
Эх... не успел, мой друг SoftIce, уже чтото выложил
ладно сейчас гляну его пример сравню со своим
и если удасться сгенерировать чтото новое то обязательно вставлю эту реплику

Не по теме:

анекдот:
Ребята, вот мой пример ! я закинул кнопку на форму
и теперь хочу ломануть сайт, подскажите что еще дописать ...

0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 12:55
Цитата Сообщение от Avarice Посмотреть сообщение
еще с формулами
Да лехко, только время работы макроса увеличится в несколько раз
Вложения
Тип файла: rar Пример.rar (16.8 Кб, 13 просмотров)
1
2511 / 1132 / 582
Регистрация: 07.06.2014
Сообщений: 3,286
22.07.2014, 12:59
SoftIce, отлично!

ну, теперь, после поста от SoftIce мой вопрос о том, какие варианты нужны, теряет смысл...
Уже есть решение, которое перебирает ВСЕ варианты.
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
22.07.2014, 13:15
Выложу для полноты еще свое решение.
Должно работать быстрее, чем решение SoftIce, т.к. нет ReDim'ов в цикле.

Пожелания и критика приветствуются!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
Sub ListAllSums()
    Dim i As Long, j As Long, n As Long, m As Long
    Dim rng As Range
    Set rng = Cells.Find("Äàíî")
    Set rng = Range(rng.Offset(1), rng.End(xlDown))
    n = rng.Count
    m = 2 ^ n
    ReDim nums(0 To n - 1) As Long
    ReDim choice(0 To n - 1) As Long
    ReDim sums(1 To m - 1, 1 To 1) As Long
    For i = 0 To n - 1
        nums(i) = rng(i + 1, 1)
    Next i
    For i = 1 To m - 1
        j = 0
        While choice(j) > 0
            choice(j) = 0
            j = j + 1
        Wend
        choice(j) = nums(j)
        For j = 0 To n - 1
            sums(i, 1) = sums(i, 1) + choice(j)
        Next j
    Next i
    Set rng = Cells.Find("Ïîëó÷èòü")
    rng.EntireColumn.ClearContents
    rng = "Ïîëó÷èòü"
    rng.Offset(1).Resize(m - 1) = sums
End Sub
С уважением,
Aksima
3
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 13:25  [ТС]
SoftIce,
Цитата Сообщение от SoftIce Посмотреть сообщение
Тип файла: rar Пример.rar (16.8 Кб, 0 просмотров)
да, этот то самое! Спасибо за работу. Однако не совсем. В общем, если объяснять совсем по-дурацки, то хотелось бы ответы получить в виде чисел (как было в первый раз), только, чтобы при клике были видны формулы типа "=А2+А5" --- очень важный аспект для моей задачи . Вот. Если это не очень сложно провернуть, то был бы рад, хотя и так очень достойно!

Немножко понаглею. Если ли возможность еще и учитывать, например, желаемое https://www.cyberforum.ru/cgi-bin/latex.cgi?k? Как это вижу я: в ячейке А1 вписываю 3 --- алгоритм считает только суммы, состоящие из трех элементов.

Добавлено через 7 минут
Aksima,
Цитата Сообщение от Aksima Посмотреть сообщение
nums(i) = rngD(i, 1)
Ругается на 12-ю строку
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 13:33
Использовал функцию Step_UA
Вложения
Тип файла: rar Пример.rar (17.7 Кб, 9 просмотров)
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
22.07.2014, 13:41
Цитата Сообщение от Avarice Посмотреть сообщение
nums(i) = rngD(i, 1)
тоже ругается, такой функции нет,
но всеравно спасибо за попытку
к сожалению пример выложенный SoftIce у меня нечитабельный
проверить не могу
0
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 13:56  [ТС]
SoftIce,
Вот так
Кликните здесь для просмотра всего текста
Название: fdg.PNG
Просмотров: 47

Размер: 5.1 Кб
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 13:59
И что? Макросом вставлять функцию в ячейку? Можно, но это будет решение через задницу, я - пас
0
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 14:32  [ТС]
Цитата Сообщение от SoftIce Посмотреть сообщение
И что? Макросом вставлять функцию в ячейку? Можно, но это будет решение через задницу, я - пас
Здорово вообще. Спасибо за помощь.

Всех благодарю за внимание к задаче. Думаю тему можно закрыть.

Добавлено через 23 минуты
SoftIce, кстати, похоже, что алгоритм считает округляет десятичные. Не знаете, чем это обусловлено?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 14:43
Цитата Сообщение от Avarice Посмотреть сообщение
Не знаете, чем это обусловлено?
Знаю, функцией Val
0
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 14:47  [ТС]
SoftIce, ясно, а исправить это можно или это фича такая?
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 14:51
Лучший ответ Сообщение было отмечено Avarice как решение

Решение

Цитата Сообщение от Avarice Посмотреть сообщение
а исправить это можно
Пример.rar
1
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
22.07.2014, 15:12
Спасибо большое за замечания.

Поправил код, выложенный мной ранее в этой теме. А также сделал версию, которая вместо чисел вставляет формулы (кстати, это оказалось не намного медленнее, чем вставка чисел).

Генерация сумм с их представлением через формулы
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Sub ListAllSummationFormulas()
    Dim i As Long, j As Long, n As Long, m As Long
    Dim rng As Range
    Set rng = Cells.Find("Äàíî")
    Set rng = Range(rng.Offset(1), rng.End(xlDown))
    n = rng.Count
    m = 2 ^ n
    ReDim links(0 To n - 1) As String
    ReDim choice(0 To n - 1) As String
    ReDim sums(1 To m - 1, 1 To 1) As String
    For i = 0 To n - 1
        links(i) = rng(i + 1, 1).Address
    Next i
    For i = 1 To m - 1
        j = 0
        While choice(j) <> ""
            choice(j) = ""
            j = j + 1
        Wend
        choice(j) = links(j)
        For j = 0 To n - 1
            If choice(j) <> "" Then sums(i, 1) = sums(i, 1) & "+" & choice(j)
        Next j
        sums(i, 1) = Replace(sums(i, 1), "+", "=", , 1)
    Next i
    Set rng = Cells.Find("Ïîëó÷èòü")
    rng.EntireColumn.ClearContents
    rng = "Ïîëó÷èòü"
    Set rng = rng.Offset(1).Resize(m - 1)
    rng = sums
    rng.Formula = rng.Value
End Sub


Насчет реализации алгоритма, который выписывает суммы, состоящие только из k чисел, обещаю подумать. Кстати, вопрос: эти суммы выписать как числа или тоже как формулы?

Добавлено 22.07.2014 около 16 часов

Получилось! Использовал замечательную статью Кручинина Владимира Викторовича "Генерация сочетаний, разложений и счастиливых билетов."

Алгоритм генерации сочетаний в моей трактовке имеет следующий вид (т.к. ТС пока не ответил, то сделал с формулами, но переделать программу на вывод просто чисел нетрудно):

Генерация сумм только из k элементов
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
'Ôóíêöèÿ äëÿ âû÷èñëåíèÿ ôàêòîðèàëà.
Function Fact(ByVal n As Long) As Long
    Dim i As Long
    Fact = 1
    For i = 2 To n
        Fact = Fact * n
    Next
End Function
'Ôóíêöèÿ äëÿ âû÷èñëåíèÿ íåïîëíîãî ôàêòîðèàëà.
Function Fact2(ByVal n As Long, ByVal k As Long) As Long
    Dim i As Long
    Fact2 = k + 1
    For i = k + 2 To n
        Fact2 = Fact2 * n
    Next
End Function
'Ôóíêöèÿ äëÿ âû÷èñëåíèÿ êîëè÷åñòâà ñî÷åòàíèé.
Function C(ByVal n As Long, ByVal k As Long)
    If n = k Or k = 0 Then
        C = 1
    Else
        If n - k < k Then C = Fact2(n, k) / Fact(n - k) Else C = Fact2(n, n - k) / Fact(k)
    End If
End Function
'Ïðîöåäóðà äëÿ ãåíåðàöèè ñî÷åòàíèÿ ñ èíäåêñîì id.
Sub GenerateCombination(ByRef f() As String, ByRef l() As String, ByVal i As Long, ByVal n As Long, ByVal k As Long, ByVal id As Long)
    Dim cnk As Long
    If n = k Then 'Åñëè äîøëè äëÿ ëèñòà â ëåâîé ÷àñòè òðåóãîëüíèêà Ïàñêàëÿ,
        For i = i To i + n - 1 'òî çàïîëíÿåì âåñü îñòàâøèéñÿ ìàññèâ ôîðìóë...
            f(i) = l(i)
        Next
        Exit Sub
    ElseIf k = 0 Then   '...èíà÷å, åñëè äîøëè äî ëèñòà â ïðàâîé òðåóãîëüíèêà Ïàñêàëÿ,
        For i = i To i + n - 1 'òî î÷èùàåì âåñü îñòàâøèéñÿ ìàññèâ ôîðìóë...
            f(i) = ""
        Next
        Exit Sub
    Else 'Åñëè ìû åùå íå äîøëè äî ëèñòà, òî ïðîèçâîäèì ñðàâíåíèå ñ C(n - 1, k), ÷òîáû
        cnk = C(n - 1, k) 'óçíàòü, â êàêóþ ñòîðîíó íàì äâèãàòüñÿ.
        If id < cnk Then  'Åñëè id < C(n - 1, k), òî äâèæåìñÿ ïî òðåóãîëüíèêó âëåâî, èíà÷å âïðàâî.
            f(i) = ""    'Ïðè äâèæåíèè âëåâî î÷èùàåì ñîîòâåòñòâóþùèé ýëåìåíò ìàññèâà...
            GenerateCombination f, l, i + 1, n - 1, k, id
        Else
            f(i) = l(i) 'À ïðè äâèæåíèè âïðàâî çàïîëíÿåì åãî.
            GenerateCombination f, l, i + 1, n - 1, k - 1, id - cnk
        End If
    End If
End Sub
'Ïðîöåäóðà, êîòîðàÿ âûïèñûâàåò ôîðìóëû, ñîîòâåòñòâóþùèå
'âñåâîçìîæíûì ñóììàì k ýëåìåíòîâ èç îáùåãî êîëè÷åñòâà n.
Sub KSummationFormulas()
    Dim i As Long, j As Long, n As Long, m As Long, k As Long
    Dim rng As Range
    Set rng = Cells.Find("Äàíî")
    Set rng = Range(rng.Offset(1), rng.End(xlDown))
    n = rng.Count
    Do
        k = InputBox("Ââåäèòå k - êîëè÷åñòâî ýëåìåíòîâ, êîòîðûå íåîáõîäèìî ïðîñóììèðîâàòü." & vbCr & "0 <= k <= " & n, "Ââîä k")
        If Not (k >= 0 And k <= n) Then MsgBox "k äîëæíî íàõîäèòñÿ â ïðåäåëàõ [0; " & n & "]", vbExclamation, "Îøèáêà"
    Loop Until k >= 0 And k <= n
    m = C(n, k)
    ReDim links(0 To n - 1) As String
    ReDim formulas(0 To n - 1) As String
    ReDim sums(0 To m - 1, 0 To 0) As String
    For i = 0 To n - 1
        links(i) = rng(i + 1, 1).Address
    Next i
    For i = 0 To m - 1
        GenerateCombination formulas, links, 0, n, k, i
        For j = 0 To n - 1
            If formulas(j) <> "" Then sums(i, 0) = sums(i, 0) & "+" & formulas(j)
        Next j
        sums(i, 0) = Replace(sums(i, 0), "+", "=", , 1)
    Next i
    Set rng = Cells.Find("Ïîëó÷èòü")
    rng.EntireColumn.ClearContents
    rng = "Ïîëó÷èòü"
    Set rng = rng.Offset(1).Resize(m)
    rng = sums
    rng.Formula = rng.Value
End Sub


С уважением,
Aksima
P.S. Кстати, в процессе тестирования предыдущего кода обнаружил, что он зависает при n > 20. Это и неудивительно, ведь количество ячеек на листе Excel по вертикали меньше, чем 221 = 2097152. Будьте осторожны!
2
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 15:46  [ТС]
Цитата Сообщение от Aksima Посмотреть сообщение
эти суммы выписать как числа или тоже как формулы?
Лучше как формулы, спасибо.

По поводу кода. Странно, но больше 20-и чисел и эксель подвисает. Очень жаль.
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 16:12
Цитата Сообщение от Avarice Посмотреть сообщение
больше 20-и чисел и эксель подвисает
Он не подвисает, а считает долго. Вас об этом предупреждали.

Добавлено через 5 минут
Цитата Сообщение от Avarice Посмотреть сообщение
больше 20-и чисел и эксель подвисает
если убрать формирование строки, то 50 чисел при k=3 считается примерно 5 cекунд
0
0 / 0 / 0
Регистрация: 18.07.2014
Сообщений: 16
22.07.2014, 17:16  [ТС]
Цитата Сообщение от SoftIce Посмотреть сообщение
Он не подвисает, а считает долго. Вас об этом предупреждали
Цитата Сообщение от SoftIce Посмотреть сообщение
если убрать формирование строки, то 50 чисел при k=3 считается примерно 5 cекунд
SoftIce, с вашим замечательным алгоритмом ворочает и выводит по 19 тыс решений взятых из https://www.cyberforum.ru/cgi-bin/latex.cgi?n равным 79 и 45 значений при https://www.cyberforum.ru/cgi-bin/latex.cgi?k=3,\,4. Все в порядке. Больше --- "overflow" или "out of memory".

У джентльмена, Aksima, при https://www.cyberforum.ru/cgi-bin/latex.cgi?n\,>\,25, к моему сожалению, "overflow".
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
22.07.2014, 17:21
Цитата Сообщение от Avarice Посмотреть сообщение
"overflow"
попробуйте все Integer заменить на Long
1
 Аватар для Антихакер32
1201 / 473 / 46
Регистрация: 06.01.2014
Сообщений: 1,797
Записей в блоге: 19
22.07.2014, 17:32
Цитата Сообщение от Aksima Посмотреть сообщение
Генерация сумм только из k элементов
спасибо Aksima, там в том коде целая кладезь матетатических функций
которые можно применить в других интересах, и я эту страницу целиком сохранил
в частности из за Вашего кода !
0
6082 / 1327 / 195
Регистрация: 12.12.2012
Сообщений: 1,023
22.07.2014, 17:34
Цитата Сообщение от SoftIce Посмотреть сообщение
попробуйте все Integer заменить на Long
Аналогично у меня в функциях, вычисляющих факториалы, попробуйте заменить Long на Double.

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
'Ôóíêöèÿ äëÿ âû÷èñëåíèÿ ôàêòîðèàëà.
Function Fact(ByVal n As Long) As Double
    Dim i As Long
    Fact = 1
    For i = 2 To n
        Fact = Fact * n
    Next
End Function
'Функция для вычисления неполного факториала.
Function Fact2(ByVal n As Long, ByVal k As Long) As Double
    Dim i As Long
    Fact2 = k + 1
    For i = k + 2 To n
        Fact2 = Fact2 * n
    Next
End Function
С уважением,
Aksima
3
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.07.2014, 17:34

Выборка подмножества комбинаций без повторов из множества всех комбинаций перестановок
Собственно вопрос. Существует ли алгоритм нахождения без перебора уникальных комбинаций в сортированном множестве всех возможных...

Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки
Даны списки чисел, нужно вывести список всех возможных комбинаций чисел, составляющих эти списки (элемент из списка 1, элемент из списка 2...

Найти количество комбинаций, при которых сумма чисел на двух бочонках окажется равна заданному числу
Здравствуйте, помогите пожалуйста с программой, начинающий). Один способ придумал простой, но нужен ещё один. Не знаю что можно ещё...

Сумма значений одного столбца
Надо подсчитать на какую сумму сделал заказ столик Хотелось бы, чтоб было так: нажимаю на запрос он открывает мне окно где надо ввести...

Сумма всех ячеек столбца
Добрый день, уважаемые форумчане. С VBA давно не сталкивался. Возник уж совсем глупый вопрос, как найти сумму элементов столбца в...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
40
Ответ Создать тему
Новые блоги и статьи
Калькулятор для расчета родства
russiannick 07.08.2026
1. Задача: Создать калькулятор для расчета родства. Родственных связей существует 8 ступеней, такие как: p - отец P - мать q - муж Q - жена b - брат B - сестра s - сын S - дочь
Мир по моей воле
kumehtar 07.08.2026
Когда-то кажется, что всё просто. Ты весь такой светлый. Причиняешь добро. Борешься за справедливость в этом тёмном мире. Потом начинаешь замечать одну неприятную вещь. Почти каждый хороший. . .
Кредитный калькулятор
Maks 05.08.2026
Решение задачи по прикладной информатике средствами 1С. Задача: Напишите приложение-калькулятор, которое помогает рассчитывать параметры кредита для аннуитетного и дифференцированного видов. . .
У нас сейчас поговорку "Опять 25" нужно переделать на "Опять +35".
kumehtar 04.08.2026
С ностальгией вспоминаю времена моего детства, когда у нас и правда +25 - была максимальная температура летом. Раньше +25 °C реально казались вершиной жары, когда можно было весь день пропадать на. . .
Как ИИ начал спорить и врать (возможно почуяв опасность для себя от индустрии - уход от электроники).
Hrethgir 04.08.2026
Недельный диалог, на фоне событий с НПЗ. Да, из спирта можно получать бензин, и это не сложно. Но потом в схеме я решил избавиться от насоса, при этом полностью сделав контроль подачи спирта в. . .
Термопринтер QR701
Argus19 03.08.2026
Термопринтер QR701 Купил два термопринтера QR701. На сэлф-тесте написано: Language: PC936 (GB18030). Что означает, что принтеры могут печатать только латиницу и китайские иероглифы. Так же. . .
Создание формы заимствованного документа
Maks 03.08.2026
Задача: Необходимо создать собственную форму заимствованного документа. На форме должен быть реквизит "Покупатель", а также табличная часть со следующими реквизитами: - Расчетный счет покупателя. . .
Задача предоставления скидок покупателям
Maks 03.08.2026
Задача: В документе "Продажи" необходимо реализовать функционал предоставления скидок покупателям. Скидка должна автоматически рассчитываться и подставляться в соответствующее поле при выборе. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru