Vba excel сумма значений массива

In this Article

  • Sum WorksheetFunction
  • Assigning a Sum result to a Variable
  • Sum a Range Object
  • Sum Multiple Range Objects
  • Sum Entire Column or Row
  • Sum an Array
  • Using the SumIf Function
  • Sum Formula
    • Formula Method
    • FormulaR1C1 Method

This tutorial will show you how to use the Excel Sum function in VBA

The sum function is one of the most widely used Excel functions, and probably the first one that Excel users learn to use. VBA does not actually have an equivalent – a user has to use the built-in Excel function in VBA using the WorkSheetFunction object.

Sum WorksheetFunction

The WorksheetFunction object can be used to call most of the Excel functions that are available within the Insert Function dialog box in Excel. The SUM function is one of them.

Sub TestFunction
  Range("D33") = Application.WorksheetFunction.Sum("D1:D32")
End Sub

vba sum syntax

You are able to have up to 30 arguments in the SUM function. Each of the arguments can also refer to a range of cells.

This example below will add up cells D1 to D9

Sub TestSum()   
   Range("D10") = Application.WorksheetFunction.SUM("D1:D9")
End Sub

The example below will add up a range in column D and a range in column F. If you do not type the Application object, it will be assumed.

Sub TestSum()
   Range("D25") = WorksheetFunction.SUM (Range("D1:D24"), Range("F1:F24"))
End Sub

Notice for a single range of cells you do not have to specify the word ‘Range’ in the formula in front of the cells,  it is assumed by the code. However, if you are using multiple arguments, you do need to do so.

Assigning a Sum result to a Variable

You may want to use the result of your formula elsewhere in code rather than writing it directly back to and Excel Range. If this is the case, you can assign the result to a variable to use later in your code.

Sub AssignSumVariable()
   Dim result as Double
'Assign the variable
   result = WorksheetFunction.SUM(Range("G2:G7"), Range("H2:H7"))
'Show the result
  MsgBox "The total of the ranges is " &  result
End Sub

vba sum result

Sum a Range Object

You can assign a group of cells to the Range object, and then use that Range object with the WorksheetFunction object.

Sub TestSumRange()
   Dim rng As Range
'assign the range of cells
   Set rng = Range("D2:E10")
'use the range in the  formula
   Range("E11") = WorksheetFunction.SUM(rng)
'release the range object
  Set rng = Nothing
End Sub

Sum Multiple Range Objects

Similarly, you can sum multiple Range Objects.

Sub TestSumMultipleRanges() 
   Dim rngA As Range 
   Dim rngB as Range
'assign the range of cells 
   Set rngA = Range("D2:D10") 
   Set rngB = Range("E2:E10")   
'use the range in the formula 
Range("E11") = WorksheetFunction.SUM(rngA, rngB)
 'release the range object
  Set rngA = Nothing 
  Set rngB = Nothing
End Sub

Sum Entire Column or Row

You can also use the Sum function to add up an entire column or an entire row

This procedure below will add up all the numeric cells in column D.

Sub TestSum()    
   Range("F1") = WorksheetFunction.SUM(Range("D:D")
End Sub

While this procedure below will add up all the numeric cells in Row 9.

Sub TestSum()     
   Range("F2") = WorksheetFunction.SUM(Range("9:9") 
End Sub

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Sum an Array

You can also use the WorksheetFunction.Sum to add up values in an array.

Sub TestArray()
   Dim intA(1 To 5) As Integer
   Dim SumArray As Integer
'populate the array
   intA(1) = 15
   intA(2) = 20
   intA(3) = 25
   intA(4) = 30
   intA(5) = 40
'add up the array and show the result
   MsgBox WorksheetFunction.SUM(intA)
End Sub

Using the SumIf Function

Another worksheet function that can be used is the SUMIF function.

Sub TestSumIf()
Range("D11") = WorksheetFunction.SUMIF(Range("C2:C10"), 150, Range("D2:D10"))
End Sub

The procedure above will only add up the cells in Range(D2:D10) if the corresponding cell in column C = 150.

vba sumif value

Sum Formula

When you use the WorksheetFunction.SUM to add a sum to a range in your worksheet, a static sum is returned, not a flexible formula. This means that when your figures in Excel change, the value that has been returned by the WorksheetFunction will not change.

vba sum static

In the example above, the procedure TestSum has added up Range(D2:D10) and the result has been put in D11. As you can see in the formula bar, this result is a figure and not a formula.

If any of the values change therefore in the Range(D2:D10), the result in D11 will NOT change.

Instead of using the WorksheetFunction.SUM, you can use VBA to apply a Sum Function to a cell using the Formula or FormulaR1C1 methods.

VBA Programming | Code Generator does work for you!

Formula Method

The formula method allows you to point specifically to a range of cells eg: D2:D10 as shown below.

Sub TestSumFormula
  Range("D11").Formula = "=SUM(D2:D10)"
End Sub

vba sum formula 1

FormulaR1C1 Method

The FromulaR1C1 method is more flexible in that it does not restrict you to a set range of cells. The example below will give us the same answer as the one above.

Sub TestSumFormula()
   Range("D11").FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)"
End Sub

vba sum formula

However, to make the formula more flexible, we could amend the code to look like this:

Sub TestSumFormula() 
   ActiveCell.FormulaR1C1 = "=SUM(R[-9]C:R[-1]C)" 
End Sub

Wherever you are in your worksheet, the formula will then add up the 8 cells directly above it and place the answer into your ActiveCell. The Range inside the SUM function has to be referred to using the Row (R) and Column (C) syntax.

Both these methods enable you to use Dynamic Excel formulas within VBA.

There will now be a formula in D11 instead of a value.

I want to do a sumif from an array but i am not sure how to reference a full column in an array. For instance i have the following data in excel (in columns A and B) and code that works fine,

RR TT
1 J
2 K
3 J
4 K
5 J
5 K
6 J
7 K
8 J
9 K

 Sub test() 
 Dim s As Range 
 Dim s2 As Range
 Set s = Range("A2:A11") 
 Set s2 = Range("B2:B11")
 e = WorksheetFunction.SumIfs(s, s2, "J")
 MsgBox e 
 End Sub

This sums the RR column where the TT column equals «J» and the answer is 23. But in the code i assign each column to a seperate Range in VBA. I would like to assign both columns to an array and do the sumifs from the array. The first part of the code would then look as follows,

Dim s() As Variant
ReDim s(1 To 10, 1 To 2)
s = Range("A2:B11")

How do i then reference the columns of the array in the sumifs function? (the first two entries in the sumifs function)

e = WorksheetFunction.SumIfs(?, ?, "J")

I will at the end work with a much bigger dataset and if it is possible i would like not create a ton of seperate Ranges but just one array.

  • If you would like to post, please check out the MrExcel Message Board FAQ and register here. If you forgot your password, you can reset your password.

  • Thread starter

    Lokai

  • Start date

    Mar 29, 2004

  • #1

What is the best way to sum values in an array()?
I can get a more complicated NPV like this x=npv(.1/12,arrayX()) but can I do a simple sum without looping thru the array?

Select a hidden cell

Somehide hide payroll data in column G? Press F5. Type G1. Enter. Look in formula bar while you arrow down through G.

DRJ

DRJ

MrExcel MVP


  • #2

So you have an array called MyArray then

Application.WorksheetFunction.Sum(MyArray) will sum the array.

  • #3

Hi Lokai,

Simply use the Excel SUM() worksheet function, e.g.:

Xsum = WorksheetFunction.Sum(arrayX)

  • #4

Thank you both, I didn’t realize that a worksheet function would work on a VBA generated array. Blinded by the not so obvious. :)

DRJ

DRJ

MrExcel MVP


Threads
1,192,600
Messages
5,993,436
Members
440,486
Latest member
SS Rookie

Содержание

  • Итоговый рабочий лист
  • Присвоение результата суммы переменной
  • Суммировать объект диапазона
  • Суммировать несколько объектов диапазона
  • Суммировать весь столбец или строку
  • Суммировать массив
  • Использование функции SumIf
  • Формула суммы

Из этого туториала Вы узнаете, как использовать функцию Excel Sum в VBA.

Функция суммы — одна из наиболее широко используемых функций Excel и, вероятно, первая, которую пользователи Excel научились использовать. VBA фактически не имеет эквивалента — пользователь должен использовать встроенную функцию Excel в VBA, используя Рабочий лист объект.

Итоговый рабочий лист

Объект WorksheetFunction можно использовать для вызова большинства функций Excel, доступных в диалоговом окне «Вставить функцию» в Excel. Функция СУММ — одна из них.

123 Sub TestFunctionДиапазон («D33») = Application.WorksheetFunction.Sum («D1: D32»)Конец подписки

В функции СУММ может быть до 30 аргументов. Каждый из аргументов также может относиться к диапазону ячеек.

В этом примере ниже добавляются ячейки с D1 по D9.

123 Sub TestSum ()Диапазон («D10») = Application.WorksheetFunction.SUM («D1: D9»)Конец подписки

В приведенном ниже примере добавляется диапазон в столбце D и диапазон в столбце F. Если вы не введете объект Application, он будет принят.

123 Sub TestSum ()Диапазон («D25») = WorksheetFunction.SUM (Диапазон («D1: D24»), Диапазон («F1: F24»))Конец подписки

Обратите внимание, что для одного диапазона ячеек вам не нужно указывать слово «Диапазон» в формуле перед ячейками, это предполагается кодом. Однако, если вы используете несколько аргументов, вам нужно это сделать.

Присвоение результата суммы переменной

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

1234567 Sub AssignSumVariable ()Тусклый результат как двойной’Назначьте переменнуюрезультат = WorksheetFunction.SUM (Диапазон («G2: G7»), Диапазон («H2: H7»))’Показать результатMsgBox «Всего диапазонов» & результатКонец подписки

Суммировать объект диапазона

Вы можете назначить группу ячеек объекту Range, а затем использовать этот объект Range с Рабочий лист объект.

123456789 Sub TestSumRange ()Dim rng As Range’назначить диапазон ячеекУстановить rng = Range («D2: E10»)’используйте диапазон в формулеДиапазон («E11») = WorksheetFunction.SUM (rng)’отпустить объект диапазонаУстановить rng = ничегоКонец подписки

Суммировать несколько объектов диапазона

Точно так же вы можете суммировать несколько объектов диапазона.

123456789101112 Sub TestSumMultipleRanges ()Dim rngA As ДиапазонDim rngB as Range’назначить диапазон ячеекУстановите rngA = Range («D2: D10»)Установите rngB = Range («E2: E10»)’используйте диапазон в формулеДиапазон («E11») = WorksheetFunction.SUM (rngA, rngB)’отпустить объект диапазонаУстановите rngA = NothingУстановить rngB = НичегоКонец подписки

Суммировать весь столбец или строку

Вы также можете использовать функцию Sum, чтобы сложить весь столбец или всю строку

Эта процедура ниже суммирует все числовые ячейки в столбце D.

123 Sub TestSum ()Диапазон («F1») = WorksheetFunction.SUM (Диапазон («D: D»)Конец подписки

В то время как эта процедура ниже суммирует все числовые ячейки в строке 9.

123 Sub TestSum ()Диапазон («F2») = WorksheetFunction.SUM (Диапазон («9: 9»)Конец подписки

Суммировать массив

Вы также можете использовать WorksheetFunction.Sum для суммирования значений в массиве.

123456789101112 Sub TestArray ()Dim intA (от 1 до 5) как целое числоDim SumArray как целое число’заполнить массивintA (1) = 15intA (2) = 20intA (3) = 25intA (4) = 30intA (5) = 40’сложите массив и покажите результатMsgBox WorksheetFunction.SUM (intA)Конец подписки

Использование функции SumIf

Еще одна функция рабочего листа, которую можно использовать, — это функция СУММЕСЛИ.

123 Sub TestSumIf ()Диапазон («D11») = WorksheetFunction.SUMIF (Диапазон («C2: C10»), 150, Диапазон («D2: D10»))Конец подписки

Приведенная выше процедура суммирует только ячейки в диапазоне (D2: D10), если соответствующая ячейка в столбце C = 150.

Формула суммы

Когда вы используете Рабочий лист Функция. СУММ чтобы добавить сумму к диапазону на листе, возвращается статическая сумма, а не гибкая формула. Это означает, что при изменении ваших цифр в Excel значение, возвращаемое Рабочий лист не изменится.

В приведенном выше примере процедура TestSum суммировала диапазон (D2: D10), и результат был помещен в D11. Как вы можете видеть в строке формул, это число, а не формула.

Если любое из значений изменится в диапазоне (D2: D10), результат в D11 будет НЕТ изменение.

Вместо использования Рабочий лист Функция. СУММ, вы можете использовать VBA для применения функции суммы к ячейке с помощью Формула или Формула R1C1 методы.

Формула Метод

Метод формулы позволяет указать конкретный диапазон ячеек, например: D2: D10, как показано ниже.

123 Sub TestSumFormulaДиапазон («D11»). Формула = «= СУММ (D2: D10)»Конец подписки

Метод FormulaR1C1

Метод FromulaR1C1 более гибкий, поскольку он не ограничивает вас заданным диапазоном ячеек. Пример ниже даст нам тот же ответ, что и приведенный выше.

123 Sub TestSumFormula ()Диапазон («D11»). FormulaR1C1 = «= СУММ (R [-9] C: R [-1] C)»Конец подписки

Однако, чтобы сделать формулу более гибкой, мы могли бы изменить код, чтобы он выглядел так:

123 Sub TestSumFormula ()ActiveCell.FormulaR1C1 = «= СУММ (R [-9] C: R [-1] C)»Конец подписки

Где бы вы ни находились на своем листе, формула складывает 8 ячеек прямо над ней и помещает ответ в вашу ActiveCell. На диапазон внутри функции SUM следует ссылаться с использованием синтаксиса Row (R) и Column (C).

Оба эти метода позволяют использовать динамические формулы Excel в VBA.

Теперь вместо значения в D11 будет формула.

Вы поможете развитию сайта, поделившись страницей с друзьями

2 / 2 / 0

Регистрация: 29.05.2011

Сообщений: 40

1

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

13.08.2015, 10:48. Показов 4762. Ответов 9


Студворк — интернет-сервис помощи студентам

Здраствуйте. Помогите с такой задачкой. Есть массив повторяемых значений, где нужно убрать повторения и при этом суммировать их значения (см. файл — «Пример.xls»). Спасибо.



0



Svsh2015

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



S_e_m

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



Hugo121

6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

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



Svsh2015

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 Кб, 44 просмотров)



1



6875 / 2807 / 533

Регистрация: 19.10.2012

Сообщений: 8,562

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



Вычисление суммы числовых аргументов или значений диапазона ячеек с помощью кода VBA Excel. Метод WorksheetFunction.Sum – синтаксис, примеры.

Метод Sum объекта WorksheetFunction возвращает сумму значений своих аргументов. Аргументы могут быть числами, переменными и выражениями, возвращающими числовые значения.

Синтаксис метода WorksheetFunction.Sum:

WorksheetFunction.Sum(Arg1, Arg2, Arg3, ..., Arg30)

  • Arg – аргумент, который может быть числом, переменной, выражением. Тип данных — Variant. Максимальное количество аргументов – 30.
  • Метод WorksheetFunction.Sum возвращает значение типа Double.

Значение функции рабочего листа Sum может быть присвоено:

  • переменной числового типа Double или универсального типа Variant (при использовании числовых переменных других типов возможны недопустимые округления значений, возвращаемых методом WorksheetFunction.Sum);
  • выражению, возвращающему диапазон ячеек (точнее, возвращающему свойство Value диапазона, которое является свойством по умолчанию и его в выражениях можно не указывать);
  • другой функции в качестве аргумента.

Примеры вычисления сумм в коде VBA

Пример 1

Присвоение значений, вычисленных методом WorksheetFunction.Sum, переменной:

Sub Primer1()

Dim a As Integer

  a = WorksheetFunction.Sum(5.5, 25, 8, 28)

MsgBox a

  a = WorksheetFunction.Sum(4.5, 25, 8, 28)

MsgBox a

End Sub

Наверно, вы удивитесь, но информационное окно MsgBox дважды покажет одно и то же число 10. Почему так происходит?

Дело в том, что переменная a объявлена как целочисленная (Integer). Дробные числа, возвращенные функцией рабочего листа Sum, были округлены, а в VBA Excel применяется бухгалтерское округление, которое отличается от общепринятого.

При бухгалтерском округлении 10.5 и 9.5 округляются до 10. Будьте внимательны при выборе типа переменной.

Пример 2

Вычисление суммы значений диапазона ячеек, расположенного на текущем листе:

Sub Primer2()

‘Итог в 6 ячейке столбца «A»

Cells(6, 1) = WorksheetFunction.Sum(Cells(1, 1), Cells(2, 1), _

Cells(3, 1), Cells(4, 1), Cells(5, 1))

‘Итог в 6 ячейке столбца «B»

Range(«B6») = WorksheetFunction.Sum(Range(Cells(1, 2), Cells(5, 2)))

‘Итог в 6 ячейке столбца «C»

Range(«B6»).Offset(, 1) = WorksheetFunction.Sum(Range(«C1:C5»))

‘Присвоение суммы диапазону ячеек

Range(«A8:C10») = WorksheetFunction.Sum(Range(«A1:C5»))

End Sub

Если хотите проверить работу кода в своем редакторе VBA, заполните на рабочем листе Excel диапазон A1:C5 любыми числами.

Самая удобная формулировка по моему мнению:

Cells(10, 6) = WorksheetFunction.Sum(Range(Cells(2, 6), Cells(9, 6))) ,

где вместо номеров строк и столбцов можно использовать переменные.

Пример 3

Вычисление суммы значений диапазона ячеек, расположенного на другом листе:

Sub Primer3()

Лист1.Cells(3, 10) = WorksheetFunction.Sum(Range(Лист2.Cells(2, 5), Лист2.Cells(100, 5)))

End Sub

Пример 4

Самый простой пример, где метод WorksheetFunction.Sum используется в качестве аргумента другой функции:

Sub Primer4()

MsgBox WorksheetFunction.Sum(24, 5, 8 * 2)

End Sub

В данном случае значение функции рабочего листа Sum является аргументом функции MsgBox.


Возможно, вам интересно, откуда я взял, что функция рабочего листа (WorksheetFunction) является объектом, а сумма (Sum) ее методом? Из справки Microsoft.

Смотрите также статьи о методах WorksheetFunction.SumIf (суммирование с одним условием) и WorksheetFunction.SumIfs (суммирование с несколькими условиями).


Добрый день! Впервые столкнулась с проблемой массивов.
написала код, все работало. Все было отлично, скопировала код, после перестало все работать, сумма элементов массива выдает всегда ноль, может кто знает в чем проблема, при том что на этом коде все считалось. По заданию дан  массив В(10) нужно найти сумму и количество отрицательных элементов. Нигде не могу найти ответ. Файл с кодом в приложении.

Код
Sub test()
    Dim i As Integer, sum As Integer, o As Integer, ch As Integer
     Dim B() As Integer
    summ = 0
    o = 0
      
   n = InputBox("n=")
    ReDim B(n)
    
    
    For i = 0 To n
    If B(i) < 0 Then
    o = o + 1
    sum = sum + B(i)
    End If
    
Next i
'ch = sum / o

 MsgBox "Êîëè÷åñòâî îòðèöàòåëüíûõ ýëåìåíòîâ â ìàññèâå: " & o & vbNewLine & "Èõ ñóììà ðàâíà=" & sum
 'ch = Format(ch, "###0.0")
'MsgBox "×àñòíîå =" & ch
  
 
End Sub

Понравилась статья? Поделить с друзьями:
  • Vba excel сумма диапазона в vba
  • Vba excel структура данных
  • Vba excel строку в цифру
  • Vba excel строковые операции
  • Vba excel строки в фильтре