2015-09-28 2 views
0

У меня есть следующая таблица, столбец (даты), строки (идентификаторы и имена). Я пытаюсь добавить значения в каждую строку только в том случае, если в них есть семь последовательных значений. Никогда не делал никакого кодирования в vba, поэтому мне нелегко. Пытался написать формулу и код vba, но не зная синтаксиса, это было очень сложно.Excel vba вычисляет только в том случае, если 7 ячеек имеют одинаковые значения

Сканирование с C2 по AG2 , если С2> 0 и C2 = D2 = Е2 = F2 = G2 = Н2 = I2, то добавить С2 + D2 + Е2 + F2 + Н2 + I2 сохранить это значение в AL2 Повтор процесс до последнего заполненного ряда

Любое понимание этого было бы весьма полезным. Я пробовал обширный поиск на этом сайте и в google, но не смог найти ничего, что близко к тому, что я делаю, я смог узнать, как получить последний заполненный столбец (в моем случае он подходит только для AH), последний (в моем случае он доходит только до 55), для цикла. но не в состоянии объединить это.

Thx, Арчер

+0

Так что если C2: I2 не равны, то что? Посмотрите на D2: J2? Если бы был матч, он бы тоже пошел в AL2? Стоп после того, как будет найден первый пробег из 7 значений и перейдите к следующей строке? –

+1

Используйте объект [WorksheetFunction] (https://msdn.microsoft.com/en-us/library/office/ff834434.aspx) или [Метод Application.Evaluate] (https://msdn.microsoft.com/en- us/library/office/ff193019.aspx) для обработки '= if (и (count (c2: i2) = 7, average (c2: i2) = c2), sum (c2: i2)," ")'. – Jeeped

+0

Tim, наш макрос/функция будет выглядеть от C2 до последнего значения в строке, если семь последовательных ячеек будут найдены с одинаковым значением, тогда вы добавите это значение и поместите его в AL2, затем переходите к следующей строке и выполняете то же самое и и так далее, результат будет AL2, AL3, AL4, до конца, тогда я могу использовать этот столбец для дальнейших вычислений. Thx – archer

ответ

0

VBA определяемые пользователем функция

EDIT: обновление игнорировать заготовки

Function GetRun(rng, num) 
    Dim d, i As Long, c As Long, v, rv, tmp 

    d = rng.Value 
    v = Chr(0) 
    rv = "" 
    For c = 1 To UBound(d, 2) - 1 
     tmp = d(1, c) 
     'EDIT: skip blanks 
     If tmp <> v Or Len(tmp) = 0 Then 
      v = tmp 
      i = 1 
     Else 
      i = i + 1 
      If i = num Then 
       rv = v 
       Exit For 
      End If 
     End If 
    Next c 
    GetRun = rv 
End Function 

Использование:

=GetRun(C2:AG2, 7) 
+0

Tim, эта функция превосходна, хотя, когда я копирую функцию вплоть до строки 50, она не вычисляется для других строк. Извините, мне потребовалось некоторое время, в то время как я пытаюсь понять ваш код и изменить его. Извините, я не мог это исправить. Что я делаю не так? – archer

+0

Прекрасно работает для меня: см. Общий пример на https://www.dropbox.com/s/t44rhnke1ak1jot/tmpRun.xlsm?dl=0 –

+0

Тим, я вижу, что ваш набор данных работает, но мой нет, я пробовал разные вещи но все равно не будет. Поэтому я делюсь своим файлом здесь, https://www.dropbox.com/s/qocwnc0s90pea82/tmpRun.xlsm?dl=0 – archer

Смежные вопросы