Код формулы Excel / VBA, который будет суммировать только ячейки, содержащие только значения (пропустить все ячейки, содержащие формулы) - PullRequest
1 голос
/ 21 декабря 2010

Существует ли формула, которая будет суммировать ТОЛЬКО ячейки, содержащие значение (не ячейки с формулой)?Например, скажем, в столбце A электронной таблицы у меня есть смесь введенных значений и формул, которые возвращают значения.Если я использую формулу суммы в конце, она, естественно, суммирует все числа в выбранном массиве независимо от того, являются ли они введенными значениями или значениями, полученными в результате формулы.(Может быть, какая-то комбинация кода SUMIF и VBA ..) Если мое описание не было ясным, вот гипотетическая установка электронных таблиц, где мне понадобится эта формула:

Ответы [ 4 ]

3 голосов
/ 22 декабря 2010

Если вы используете SUBTOTAL для всех своих функций, вы можете сделать это.SUBTOTAL будет игнорировать любые другие SUBTOTAL функции в диапазоне.В А2

=SUBTOTAL(9,B1:B3)

В А3

=SUBTOTAL(1,B1:B3)

В А6

=SUBTOTAL(2,B1:B3)

В А7

=SUBTOTAL(9,A1:A6)

А7 будет 700 (чтоэто то, что я предполагаю, что вы имели в виду).Если у вас есть формулы, которые недоступны в SUBTOTAL, то они не будут работать.

1 голос
/ 22 декабря 2010

Чтобы уточнить ответ Мартина.

Невозможно узнать, содержит ли ячейка формулу, используя формулы Excel.

Вы должны определить UDF (пользовательская функция). Учебник здесь. .Из руководства:

  1. Откройте новую книгу.
  2. Войдите в VBA (нажмите Alt + F11)
  3. Вставьте новый модуль (Вставить> Модуль)
  4. Копирование и вставка примеров пользовательских функций Excel
  5. Выход из VBA (нажмите Alt + Q)
  6. Используйте функции (они появятся в диалоговом окне «Вставить функцию»,Shift + F3, в категории «Определено пользователем»)

Ваш UDF будет выглядеть примерно так:

Public Function isformula(rng As Range) As Variant()
    Dim aryIn() As Variant
    Dim a As Variant
    Dim i As Integer, j As Integer
    Dim temp() As Variant

    aryIn = rng.Value
    ReDim temp(LBound(aryIn) To UBound(aryIn), _
               LBound(aryIn, 2) To UBound(aryIn, 2))
    For i = LBound(aryIn) To UBound(aryIn)
        For j = LBound(aryIn, 2) To UBound(aryIn, 2)
            If (Left(rng(i, j).Formula, 1) = "=") Then
               temp(i, j) = True
            Else
               temp(i, j) = False
            End If
        Next j
    Next i
    isformula = temp()
End Function

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

{=SUM(IF(NOT(isformula(A1:A6)),A1:A6,0))}

Где фигурные скобки {} обозначают формулу ARRAY (вводится с помощью Ctrl-Shift-Enter)

HTH!

0 голосов
/ 21 декабря 2010

Это сработает, хотя как-то неаккуратно, и наверняка должен быть лучший путь.С небольшой дополнительной работой вы могли бы превратить это в UDF.

Sub SumNumbersOnly()
    Dim sumAllCells As Long
    Dim sumFormulaCells As Long
    Dim sumNumberCells As Long

    sumAllCells = Application.Sum(Selection)
    sumFormulaCells = Application.Sum(Selection.Cells.SpecialCells(xlCellTypeFormulas))

    sumNumberCells = sumAllCells - sumFormulaCells

    Debug.Print sumNumberCells //Returns 700 (400 + 200 + 100 as in your example)

End Sub
0 голосов
/ 21 декабря 2010

Существует свойство HasFormula , которое вы можете комбинировать с SUMIF, чтобы делать то, что вы хотите.

...