Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.52/25: Рейтинг темы: голосов - 25, средняя оценка - 4.52
2 / 2 / 0
Регистрация: 29.05.2011
Сообщений: 40
1

Суммирование значений в массиве макросом

13.08.2015, 10:48. Показов 5239. Ответов 9
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здраствуйте. Помогите с такой задачкой. Есть массив повторяемых значений, где нужно убрать повторения и при этом суммировать их значения (см. файл - "Пример.xls"). Спасибо.
Вложения
Тип файла: xls Пример.xls (17.5 Кб, 67 просмотров)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.08.2015, 10:48
Ответы с готовыми решениями:

Суммирование значений в массиве
Здраствуйте. Помогите с такой задачкой. Есть массив повторяемых значений, где нужно убрать...

Суммирование элементов массива макросом
Изучаю главу по макросам у Дейтелов по древней книжке и там есть задача на подсчет суммы элементов...

Суммирование макросом ячеек из разных листов книги
подскажите как правильно написать макрос для суммировании диапазона ячеек из Лист1 и Лист2 в...

Копирование значений макросом
Добрый день, помогите решить задачу. Есть Таблица А из 6 столбцов. Требуется автоматическое запуск...

9
132 / 108 / 22
Регистрация: 23.06.2015
Сообщений: 339
14.08.2015, 22:14 2
S_e_m, добрый вечер попробуйте макрос example(все макросы в стандартном модуле) и макрос clean для тестирования:


Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 Sub example()
 Dim i&, i1&, i2&, j&, s1&
 unicum
 i1 = Range("D4").End(xlDown).Row
 i2 = Range("J" & Cells.Rows.Count).End(xlUp).Row
  For j = 4 To i2
       s1 = 0
     For i = 4 To i1
      If Range("D" & i) = Range("J" & j) Then
        s1 = s1 + Range("F" & i)
        Range("I" & j) = Range("C" & i)
        Range("H" & j) = Range("B" & i)
      End If
    Next i
    Range("K" & j) = s1
 Next j
End Sub
Visual Basic
1
2
3
4
5
Sub clean()
Dim i2&
i2 = Range("J" & Cells.Rows.Count).End(xlUp).Row
Range("H4:Q" & i2).ClearContents
End Sub
макрос уникальных значений:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Sub unicum()
Dim c As Range, i1&, i2&, m%
i1 = Range("D4").End(xlDown).Row
i2 = Range("J" & Cells.Rows.Count).End(xlUp).Row
Dim V As New Collection
On Error Resume Next
For Each c In Range("D4:D" & i1)
    V.Add c, c
Next c
On Error GoTo 0
m = 3
For Each i In V
    m = m + 1
    Range("J" & m) = i
Next i
Sort
End Sub
макрос сортировки

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Sort()
Dim m&, n&, j2&, t
i2 = Range("J" & Cells.Rows.Count).End(xlUp).Row
For m = 4 To i2
   For n = m + 1 To i2
     If Range("J" & m) > Range("J" & n) Then
     t = Range("J" & n)
     Range("J" & n) = Range("J" & m)
     Range("J" & m) = t
     End If
   Next n
Next m
End Sub
Добавлено через 23 часа 46 минут
S_e_m, можно также быстрый вариант:

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 insert7()
    Dim arr1(), i1&, i&, j&, k&, t1(1 To 4), t$, n&, x&, d, arr2()
    With Sheets("Лист1")
    i1 = .Range("D" & Cells.Rows.Count).End(xlUp).Row
        arr1 = .Range("B4:F" & i1).Value
        ReDim arr2(1 To UBound(arr1), 1 To UBound(arr1, 2))
        Set d = CreateObject("scripting.dictionary")
        For i = 1 To UBound(arr1)
            t = arr1(i, 2)
            t = arr1(i, 2) & arr1(i, 3)
            If d.exists(t) Then
                x = d.Item(t)
                arr2(x, UBound(arr2, 2)) = arr2(x, UBound(arr2, 2)) + arr1(i, UBound(arr2, 2))
            Else
                n = n + 1: d.Item(t) = n
                For j = 1 To UBound(arr2, 2): arr2(n, j) = arr1(i, j): Next
            End If
        Next
        For i = 1 To n: arr2(i, UBound(arr2, 2) - 1) = arr2(i, UBound(arr2, 2)): arr2(i, UBound(arr2, 2)) = "": Next i
        For i = 1 To n
          For j = i + 1 To n
             If arr2(i, 3) > arr2(j, 3) Then
 For k = 1 To UBound(arr2, 2) - 1: t1(k) = arr2(j, k): arr2(j, k) = arr2(i, k): arr2(i, k) = t1(k): Next
             End If
          Next
    Next
        .Range("H4").Resize(n, UBound(arr2, 2)).Value = arr2
    End With
End Sub
1
2 / 2 / 0
Регистрация: 29.05.2011
Сообщений: 40
15.08.2015, 09:35  [ТС] 3
Svsh2015, Большущее спасибо....
0
2 / 2 / 0
Регистрация: 29.05.2011
Сообщений: 40
15.11.2015, 19:01  [ТС] 4
Мне понадибось добавить ещё одну колонку суммы в таблице. Разобраться в коде я так и не смог. Прошу помощи дописать код.

За основу я взял последний код в теме . Спасибо

VB.NET
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
Private Sub Summ1()
    Dim arr1(), i1&, i&, j&, k&, t1(1 To 4), t$, n&, x&, d, arr2()
    With Sheets(1)
    i1 = .Range("B" & Cells.Rows.Count).End(xlUp).Row
        arr1 = .Range("A2:E" & i1).Value
        ReDim arr2(1 To UBound(arr1), 1 To UBound(arr1, 2))
        Set d = CreateObject("scripting.dictionary")
        For i = 1 To UBound(arr1)
            t = arr1(i, 2)
            t = arr1(i, 2) & arr1(i, 3)
            If d.exists(t) Then
                x = d.Item(t)
                arr2(x, UBound(arr2, 2)) = arr2(x, UBound(arr2, 2)) + arr1(i, UBound(arr2, 2))
            Else
                n = n + 1: d.Item(t) = n
                For j = 1 To UBound(arr2, 2): arr2(n, j) = arr1(i, j): Next
            End If
        Next
        For i = 1 To n: arr2(i, UBound(arr2, 2) - 1) = arr2(i, UBound(arr2, 2)): arr2(i, UBound(arr2, 2)) = "": Next i
        For i = 1 To n
          For j = i + 1 To n
             If arr2(i, 3) > arr2(j, 3) Then
 For k = 1 To UBound(arr2, 2) - 1: t1(k) = arr2(j, k): arr2(j, k) = arr2(i, k): arr2(i, k) = t1(k): Next
             End If
          Next
    Next
        .Range("H2").Resize(n, UBound(arr2, 2)).Value = arr2
    End With
End Sub
Вложения
Тип файла: xls Пример.xls (26.0 Кб, 30 просмотров)
0
2 / 2 / 0
Регистрация: 29.05.2011
Сообщений: 40
17.11.2015, 22:03  [ТС] 5
Очень прошу помощи. Мне нужно срочно!!!!!!!
0
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
17.11.2015, 23:06 6
В таком думаю разобраться проще:
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
Sub tt()
    Dim a(), t$, i&, ii&, x&
 
    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = [a1].CurrentRegion.Value
        a(1, 4) = a(1, 5)
        a(1, 5) = a(1, 6)
        ii = 1
        For i = 2 To UBound(a)
            t = a(i, 1) & "| " & a(i, 2) & "|" & a(i, 3)
            If Not .exists(t) Then
                ii = ii + 1: .Item(t) = ii
                For x = 1 To 3: a(ii, x) = a(i, x): Next
                a(ii, 4) = a(i, 5)
                a(ii, 5) = a(i, 6)
            Else
                x = .Item(t)
                a(x, 4) = a(x, 4) + a(i, 5)
                a(x, 5) = a(x, 5) + a(i, 6)
            End If
        Next
 
        Range("N1").Resize(.Count + 1, UBound(a, 2) - 1).Value = a
    End With
 
End Sub
Добавлено через 5 минут
Или чуть иначе - изменил выгрузку, нет привязки к словарю:
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
Option Explicit
 
Sub tt()
    Dim a(), t$, i&, ii&, x&
 
    With CreateObject("scripting.dictionary"): .comparemode = 1
        a = [a1].CurrentRegion.Value
        ii = 1: a(ii, 4) = a(1, 5): a(ii, 5) = a(1, 6)
        For i = 2 To UBound(a)
            t = a(i, 1) & "| " & a(i, 2) & "|" & a(i, 3)
            If Not .exists(t) Then
                ii = ii + 1: .Item(t) = ii
                For x = 1 To 3: a(ii, x) = a(i, x): Next
                a(ii, 4) = a(i, 5): a(ii, 5) = a(i, 6)
            Else
                x = .Item(t)
                a(x, 4) = a(x, 4) + a(i, 5): a(x, 5) = a(x, 5) + a(i, 6)
            End If
        Next
    End With
 
    Range("N1").Resize(ii, UBound(a, 2) - 1).Value = a
 
End Sub
1
2 / 2 / 0
Регистрация: 29.05.2011
Сообщений: 40
17.11.2015, 23:36  [ТС] 7
Спасибо большое.
0
132 / 108 / 22
Регистрация: 23.06.2015
Сообщений: 339
18.11.2015, 03:00 8
доброго времени суток,только прочитал Ваш вопрос,можно еще такой вариант макроса,
кнопка yyy в файл-примере.
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
Sub yyy()
    Dim z(), i&, j&, m&, k&, i1&
    Application.ScreenUpdating = False
    i1 = Sheets("Лист1").Range("A" & Cells.Rows.Count).End(xlUp).Row
    z = Sheets("Лист1").Range("A2:F" & i1).Value
    With CreateObject("scripting.dictionary"): .comparemode = 1
        For i = 1 To UBound(z)
            If .exists(z(i, 2)) = False Then
                m = m + 1: .Item(z(i, 2)) = m: For j = 1 To UBound(z, 2): z(m, j) = z(i, j): Next
            Else
            For k = 4 To UBound(z, 2): z(.Item(z(i, 2)), k) = z(.Item(z(i, 2)), k) + z(i, k): Next
            End If
        Next
    Sheets("Лист1").Range("G2").Resize(.Count, UBound(z, 2)) = z
   End With
  With Sheets("Лист1")
      .Columns("J").Delete Shift:=xlToLeft
      .Range("G1:I1").Value = .Range("A1:C1").Value
      .Range("J1:K1").Value = .Range("E1:F1").Value
      .Columns("G:K").AutoFit
End With
 Application.ScreenUpdating = True
End Sub
Вложения
Тип файла: xls example_18_11_2015_cbr.xls (46.5 Кб, 47 просмотров)
1
6944 / 2849 / 548
Регистрация: 19.10.2012
Сообщений: 8,721
18.11.2015, 18:49 9
От моего варианта отличие в том, что я сразу собираю массив без дат, и сразу с заголовком
Но может быть значимо ещё такое отличие - у меня ключ собран из трёх полей, а не из одного.
0
132 / 108 / 22
Регистрация: 23.06.2015
Сообщений: 339
18.11.2015, 20:44 10
добрый вечер,в новом файл-примере,создатель темы не указал,в каком виде надо представить данные,например,в предыдущем файл примере в #1 ему требовалась сортировка,что и делал в том числе макрос incert7,а изменить суммирование в одном столбце(incert7) на суммирование в двух столбцах очень просто(добавить одну строчку),не понятно в чем трудность у создателя темы,кстати,
уважаемый, Hugo121,мы с Вами уже встречались на другом форуме,Вы также немного модернизировали мой макрос incert1,благодарю Вас за все уточнения.
0
18.11.2015, 20:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
18.11.2015, 20:44
Помогаю со студенческими работами здесь

Дублирование значений ячеек макросом
Помогите , в ручную делать уже нет времени... :( Таблица EXCEL, в ней 2 колонки. Заданы параметры...

Проверка значений столбца на уникальность макросом
Доброго времени суток. Подскажите как сделать проверку столбца на уникальность. Имеем 810 столбцов...

Как считать сумму одинаковых значений макросом
Добрый день! подскажите пожалуйста... как посчитать сумму по одной накладной? тоесть сложить...

Поиск, сравнение и замена дублирующих значений макросом
Здравствуйте, ув. форумчане! Столкнулся со следующей проблемой. Есть таблица из 6000 строк, в...


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

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru