Дано: Список неких действий и даты, в которые эти действия были совершены. Отметки о совершении действий ("+") образуют некие отрезки по горизонтали, т.к. действия происходят не каждый день, а с перерывами. Количество столбцов в шкале дат не фиксировано и неизвестно.
Нужно: Подсчитать количество "+" в _ПОСЛЕДНЕМ ОТРЕЗКЕ_ по каждой строке. И поставить полученное значение в столбец В.
Поскольку я только начинаю, я написала макрос пока для одной строки - строки под номером 3. В ячейку В3 почему-то встаёт значение 0, хотя должно быть 11 Возможно, я намудрила в цикле.
Вы не могли бы взглянуть? Буду крайне признательна за помощь Файл прилагаю.
Добрый день!
Только начинаю изучать VBA.
Дано: Список неких действий и даты, в которые эти действия были совершены. Отметки о совершении действий ("+") образуют некие отрезки по горизонтали, т.к. действия происходят не каждый день, а с перерывами. Количество столбцов в шкале дат не фиксировано и неизвестно.
Нужно: Подсчитать количество "+" в _ПОСЛЕДНЕМ ОТРЕЗКЕ_ по каждой строке. И поставить полученное значение в столбец В.
Поскольку я только начинаю, я написала макрос пока для одной строки - строки под номером 3. В ячейку В3 почему-то встаёт значение 0, хотя должно быть 11 Возможно, я намудрила в цикле.
Вы не могли бы взглянуть? Буду крайне признательна за помощь Файл прилагаю.Яя
Яя, здравствуйте. У Вас цикл идет по переменной j, а внутри цикла Вы проверяете ячейку Cells(3, Stolb). Stolb у Вас не меняет своего значения, а значит Вы проверяете все время одну и ту же ячейку (последнюю по строке). Нужно иправить номер столбца на j.
Если есть возможность не использовать метки, лучше обходитесь без них. В данном макросе достаточно использовать Exit For
[vba]
Код
Option Explicit Sub PoslOtrezok() Dim Stolb As Long Dim Strok As Long Dim j As Long Dim Z As Integer Z = 0
' Range("A1").Select ' Range(Selection, Selection.End(xlToRight)).Select ' ' Stolb = Selection.Cells.Count Stolb = Cells(1, Columns.Count).End(xlToLeft).Column For j = Stolb To 3 Step -1 If ActiveSheet.Cells(3, j).Value <> "" Then Z = Z + 1 Else If ActiveSheet.Cells(3, j + 1).Value = "+" Then Exit For 'GoTo endd End If Next 'endd: Range("B3").Value = Z End Sub
[/vba]
Яя, здравствуйте. У Вас цикл идет по переменной j, а внутри цикла Вы проверяете ячейку Cells(3, Stolb). Stolb у Вас не меняет своего значения, а значит Вы проверяете все время одну и ту же ячейку (последнюю по строке). Нужно иправить номер столбца на j.
Если есть возможность не использовать метки, лучше обходитесь без них. В данном макросе достаточно использовать Exit For
[vba]
Код
Option Explicit Sub PoslOtrezok() Dim Stolb As Long Dim Strok As Long Dim j As Long Dim Z As Integer Z = 0
' Range("A1").Select ' Range(Selection, Selection.End(xlToRight)).Select ' ' Stolb = Selection.Cells.Count Stolb = Cells(1, Columns.Count).End(xlToLeft).Column For j = Stolb To 3 Step -1 If ActiveSheet.Cells(3, j).Value <> "" Then Z = Z + 1 Else If ActiveSheet.Cells(3, j + 1).Value = "+" Then Exit For 'GoTo endd End If Next 'endd: Range("B3").Value = Z End Sub
Яя, Логика такая: я хочу найти номер последней ячейки в строке с плюсом, затем вычесть из него номер последней пустой ячейки, после которой начинается "отрезок" с плюсами.
1. (C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет номера столбцов с плюсом (-2 пока не пишем!). МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))) - номер последнего столбца с плюсом.
2. (C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет массив, состоящий из нулей и номеров столбцов, после которых начинаются плюсы. Для 3-й строки массив будет такой:[vba]
[/vba] МАКС((C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3))) - номер столбца последней такой ячейки.
Остается только вычесть 2-е значение из 1-го.
Такой вариант работает для всех случаев, кроме тех, когда "отрезок" с плюсами всего один, и начинается он с 1-го столбца таблицы (столбец С). Пример такой строки - №20 (вернется массив из одних нулей). Поэтому, будет возвращать вместо номеров столбцов номер позиции ячейки в диапазоне C3:AR3, т.е. ячейка в столбце C - 1-я, в столбце D - 2-я и т.д. Для этого нам нужно вычесть из номера столбца 2.
Для 20-й строки во второй части все равно получим 0, но нас это устраивает, т.к. последняя ячейка с плюсом - под номером 3 (1-я часть формулы), а отрезок начинается с начала таблицы. Вычитать нам ничего не нужно.
Надеюсь, понятно объяснила))
[p.s.]Перенесла тему в раздел Вопросы по Excel, может кто-то проще формулу предложит.[/p.s.]
Яя, Логика такая: я хочу найти номер последней ячейки в строке с плюсом, затем вычесть из него номер последней пустой ячейки, после которой начинается "отрезок" с плюсами.
1. (C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет номера столбцов с плюсом (-2 пока не пишем!). МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))) - номер последнего столбца с плюсом.
2. (C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет массив, состоящий из нулей и номеров столбцов, после которых начинаются плюсы. Для 3-й строки массив будет такой:[vba]
[/vba] МАКС((C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3))) - номер столбца последней такой ячейки.
Остается только вычесть 2-е значение из 1-го.
Такой вариант работает для всех случаев, кроме тех, когда "отрезок" с плюсами всего один, и начинается он с 1-го столбца таблицы (столбец С). Пример такой строки - №20 (вернется массив из одних нулей). Поэтому, будет возвращать вместо номеров столбцов номер позиции ячейки в диапазоне C3:AR3, т.е. ячейка в столбце C - 1-я, в столбце D - 2-я и т.д. Для этого нам нужно вычесть из номера столбца 2.
Для 20-й строки во второй части все равно получим 0, но нас это устраивает, т.к. последняя ячейка с плюсом - под номером 3 (1-я часть формулы), а отрезок начинается с начала таблицы. Вычитать нам ничего не нужно.
Надеюсь, понятно объяснила))
[p.s.]Перенесла тему в раздел Вопросы по Excel, может кто-то проще формулу предложит.[/p.s.]Manyasha
Manyasha, скажите, пожалуйста, а почему, когда я смотрю, что возвращает каждая часть формулы, при внесении в ячейку, скажем, {=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))}, в ячейке с формулой получается 0? Вы пишете, что должен быть номер последнего столбца с "+". Почему я не вижу этот номер, а вижу ничего?
Manyasha, скажите, пожалуйста, а почему, когда я смотрю, что возвращает каждая часть формулы, при внесении в ячейку, скажем, {=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))}, в ячейке с формулой получается 0? Вы пишете, что должен быть номер последнего столбца с "+". Почему я не вижу этот номер, а вижу ничего? Яя
Как совершенно верно Алексей (AlexM) подсказывает, неверная отработка в строках 20 и 26. Поправить можно, например, еще одной ЕСЛИОШИБКА, но это уже не так интересно
Ну, не знаю, как насчет попроще, но немассивная зато
Как совершенно верно Алексей (AlexM) подсказывает, неверная отработка в строках 20 и 26. Поправить можно, например, еще одной ЕСЛИОШИБКА, но это уже не так интересно_Boroda_