Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Арифметические действия по условию в строке - Мир MS Excel

Регистрация · Логин: · Пароль: · · Забыли пароль?
  • Страница 1 из 1
  • 1
Модератор форума: _Boroda_, Manyasha, SLAVICK, китин  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Арифметические действия по условию в строке (Макросы/Sub)
Арифметические действия по условию в строке
Raid Дата: Вторник, 08.01.2019, 00:43 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 365
Помогите, пожалуйста. Есть такая задача:
Имеем массив данных (допустим 10х10 ячеек). В этой таблице нечетный столбец может быть либо пустым, либо с числовым значением). Четный столбец - числовые значения

Необходимо проссумировать все значения четных стобцов строки, перед которыми (нечетный столбец) не пустая клетка.

Как то, думается, можно сделать через циклы и условия с переменной, но это очень и очень и очень громоздко....
Я так понимаю, есть для этого функция Find, но поиск в инетнете для меня не прояснил, как ею пользоваться....

Спасибо заранее за ответ...
 
Ответить
СообщениеПомогите, пожалуйста. Есть такая задача:
Имеем массив данных (допустим 10х10 ячеек). В этой таблице нечетный столбец может быть либо пустым, либо с числовым значением). Четный столбец - числовые значения

Необходимо проссумировать все значения четных стобцов строки, перед которыми (нечетный столбец) не пустая клетка.

Как то, думается, можно сделать через циклы и условия с переменной, но это очень и очень и очень громоздко....
Я так понимаю, есть для этого функция Find, но поиск в инетнете для меня не прояснил, как ею пользоваться....

Спасибо заранее за ответ...

Автор - Raid
Дата добавления - 08.01.2019 в 00:43
Gustav Дата: Вторник, 08.01.2019, 01:53 | Сообщение № 2
Группа: Друзья
Ранг: Старожил
Сообщений: 1648
Репутация: 671 ±
Замечаний: 0% ±

начинал с Excel 4.0...
Если правильно понял, то для одной строки (первой) для 10 первых ячеек A1:J1 можно написать в 11-й ячейке K1 такую незатейливую формулу:
Код
=НЕ(ЕПУСТО(A1))*B1+НЕ(ЕПУСТО(C1))*D1+НЕ(ЕПУСТО(E1))*F1+НЕ(ЕПУСТО(G1))*H1+НЕ(ЕПУСТО(I1))*J1

Если понял неправильно - давайте пример в студию!


Мой tip box - яд 41001663842605
 
Ответить
СообщениеЕсли правильно понял, то для одной строки (первой) для 10 первых ячеек A1:J1 можно написать в 11-й ячейке K1 такую незатейливую формулу:
Код
=НЕ(ЕПУСТО(A1))*B1+НЕ(ЕПУСТО(C1))*D1+НЕ(ЕПУСТО(E1))*F1+НЕ(ЕПУСТО(G1))*H1+НЕ(ЕПУСТО(I1))*J1

Если понял неправильно - давайте пример в студию!

Автор - Gustav
Дата добавления - 08.01.2019 в 01:53
Raid Дата: Вторник, 08.01.2019, 09:27 | Сообщение № 3
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 365
Gustav, Очень бы хотелось это через VBA сделать...
Я так понимаю, что с помощью VBA можно извратиться и ставить в ячейку результата формулу, по которой будет идти подсчет, но уж очень хочется через макрос все сделать...
Вот пример:
К сообщению приложен файл: 4653544.xlsx(10.1 Kb)
 
Ответить
СообщениеGustav, Очень бы хотелось это через VBA сделать...
Я так понимаю, что с помощью VBA можно извратиться и ставить в ячейку результата формулу, по которой будет идти подсчет, но уж очень хочется через макрос все сделать...
Вот пример:

Автор - Raid
Дата добавления - 08.01.2019 в 09:27
Gustav Дата: Вторник, 08.01.2019, 14:41 | Сообщение № 4
Группа: Друзья
Ранг: Старожил
Сообщений: 1648
Репутация: 671 ±
Замечаний: 0% ±

начинал с Excel 4.0...
Ну тогда как-то так:
[vba]
Код
Sub rrr()
    Dim rng As Range
    Dim rngOut As Range
    Dim arr() As Double
    Dim r As Long
    Dim c As Long
    
    Set rng = Range("A2:N14")       'задать свой исходный диапазон
    Set rngOut = Range("Q2:Q14")    'задать свой диапазон вывода результата
    
    ReDim arr(1 To rng.Rows.Count, 1 To 1)
    For r = 1 To rng.Rows.Count
        arr(r, 1) = 0
        For c = 2 To rng.Columns.Count Step 2
            If Not IsEmpty(rng.Cells(r, c).Offset(, -1)) Then
                arr(r, 1) = arr(r, 1) + rng.Cells(r, c).Value
            End If
        Next c
    Next r
    
    rngOut.Value = arr
End Sub
[/vba]
Исходный диапазон и диапазон результата вводятся прямо в коде (поскольку иного не оговорено заданием). На контроль чётного кол-ва столбцов в исходном диапазоне не заморачивался, контролируйте сами визуально. Да, и в примере у Вас дана только одна правильная сумма, как раз проверите с помощью этого макроса :)


Мой tip box - яд 41001663842605
 
Ответить
СообщениеНу тогда как-то так:
[vba]
Код
Sub rrr()
    Dim rng As Range
    Dim rngOut As Range
    Dim arr() As Double
    Dim r As Long
    Dim c As Long
    
    Set rng = Range("A2:N14")       'задать свой исходный диапазон
    Set rngOut = Range("Q2:Q14")    'задать свой диапазон вывода результата
    
    ReDim arr(1 To rng.Rows.Count, 1 To 1)
    For r = 1 To rng.Rows.Count
        arr(r, 1) = 0
        For c = 2 To rng.Columns.Count Step 2
            If Not IsEmpty(rng.Cells(r, c).Offset(, -1)) Then
                arr(r, 1) = arr(r, 1) + rng.Cells(r, c).Value
            End If
        Next c
    Next r
    
    rngOut.Value = arr
End Sub
[/vba]
Исходный диапазон и диапазон результата вводятся прямо в коде (поскольку иного не оговорено заданием). На контроль чётного кол-ва столбцов в исходном диапазоне не заморачивался, контролируйте сами визуально. Да, и в примере у Вас дана только одна правильная сумма, как раз проверите с помощью этого макроса :)

Автор - Gustav
Дата добавления - 08.01.2019 в 14:41
Raid Дата: Вторник, 08.01.2019, 18:21 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 26
Репутация: 0 ±
Замечаний: 0% ±

Excel 365
Супер, все работает.
Не совсем пойму, что делает строка
ReDim arr(1 To rng.Rows.Count, 1 To 1)

и зачем
arr(r, 1) = 0
rngOut.Value = arr

Спасибо большо
 
Ответить
СообщениеСупер, все работает.
Не совсем пойму, что делает строка
ReDim arr(1 To rng.Rows.Count, 1 To 1)

и зачем
arr(r, 1) = 0
rngOut.Value = arr

Спасибо большо

Автор - Raid
Дата добавления - 08.01.2019 в 18:21
vikttur Дата: Вторник, 08.01.2019, 19:55 | Сообщение № 6
Группа: Друзья
Ранг: Участник клуба
Сообщений: 2921
Репутация: 525 ±
Замечаний: 0% ±

ReDim - определение размерности массива arr: по вертикали от 1 до rng.Rows.Count, по горизонтали - 1

arr(r, 1) = 0 - в массив записывается ноль. В цикле For c... элемент массива может быть перезаписан. Можно было сделать по-другому - после отработки внутреннего цикла (после строки Next c):
[vba]
Код
If arr(r, 1) = Empty Then arr(r, 1) = 0
[/vba]
Это если нулевые значения нужны в выгрузке на лист. Если нет, ноль можно не записывать.

rngOut - переменная, которая представляет диапазон (в начале процедуры присвоение Set). На лист в диапазон Range("Q2:Q14") выгружаются данные из массива arr


Сообщение отредактировал vikttur - Вторник, 08.01.2019, 20:03
 
Ответить
СообщениеReDim - определение размерности массива arr: по вертикали от 1 до rng.Rows.Count, по горизонтали - 1

arr(r, 1) = 0 - в массив записывается ноль. В цикле For c... элемент массива может быть перезаписан. Можно было сделать по-другому - после отработки внутреннего цикла (после строки Next c):
[vba]
Код
If arr(r, 1) = Empty Then arr(r, 1) = 0
[/vba]
Это если нулевые значения нужны в выгрузке на лист. Если нет, ноль можно не записывать.

rngOut - переменная, которая представляет диапазон (в начале процедуры присвоение Set). На лист в диапазон Range("Q2:Q14") выгружаются данные из массива arr

Автор - vikttur
Дата добавления - 08.01.2019 в 19:55
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Арифметические действия по условию в строке (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс цитирования
© 2010-2019 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!