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

Вход

Регистрация

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

 

= Мир MS Excel/Длина последнего отрезка, состоящего из плюсов - Мир MS Excel

  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_, DrMini  
Длина последнего отрезка, состоящего из плюсов
Яя Дата: Четверг, 19.01.2017, 11:02 | Сообщение № 1
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Добрый день!

Только начинаю изучать VBA.

Дано:
Список неких действий и даты, в которые эти действия были совершены. Отметки о совершении действий ("+") образуют некие отрезки по горизонтали, т.к. действия происходят не каждый день, а с перерывами.
Количество столбцов в шкале дат не фиксировано и неизвестно.

Нужно:
Подсчитать количество "+" в _ПОСЛЕДНЕМ ОТРЕЗКЕ_ по каждой строке. И поставить полученное значение в столбец В.

Поскольку я только начинаю, я написала макрос пока для одной строки - строки под номером 3.
В ячейку В3 почему-то встаёт значение 0, хотя должно быть 11 :)
Возможно, я намудрила в цикле.

Вы не могли бы взглянуть? Буду крайне признательна за помощь :)
Файл прилагаю.
К сообщению приложен файл: 5982840.xlsm (25.1 Kb)
 
Ответить
СообщениеДобрый день!

Только начинаю изучать VBA.

Дано:
Список неких действий и даты, в которые эти действия были совершены. Отметки о совершении действий ("+") образуют некие отрезки по горизонтали, т.к. действия происходят не каждый день, а с перерывами.
Количество столбцов в шкале дат не фиксировано и неизвестно.

Нужно:
Подсчитать количество "+" в _ПОСЛЕДНЕМ ОТРЕЗКЕ_ по каждой строке. И поставить полученное значение в столбец В.

Поскольку я только начинаю, я написала макрос пока для одной строки - строки под номером 3.
В ячейку В3 почему-то встаёт значение 0, хотя должно быть 11 :)
Возможно, я намудрила в цикле.

Вы не могли бы взглянуть? Буду крайне признательна за помощь :)
Файл прилагаю.

Автор - Яя
Дата добавления - 19.01.2017 в 11:02
K-SerJC Дата: Четверг, 19.01.2017, 11:31 | Сообщение № 2
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
а вам обязательно макросом надо?
формулой проще такую задачу решить
Код
=СЧЁТЗ(C3:AR3)
К сообщению приложен файл: 2962428.xlsm (22.5 Kb)


Благими намерениями выстелена дорога в АД.
 
Ответить
Сообщениеа вам обязательно макросом надо?
формулой проще такую задачу решить
Код
=СЧЁТЗ(C3:AR3)

Автор - K-SerJC
Дата добавления - 19.01.2017 в 11:31
Manyasha Дата: Четверг, 19.01.2017, 11:33 | Сообщение № 3
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Яя, здравствуйте.
У Вас цикл идет по переменной j, а внутри цикла Вы проверяете ячейку Cells(3, Stolb). Stolb у Вас не меняет своего значения, а значит Вы проверяете все время одну и ту же ячейку (последнюю по строке). Нужно иправить номер столбца на j.

[vba]
Код
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select

Stolb = Selection.Cells.Count
[/vba]
Вычислить номер последнего столбца можно одной строчкой.
[vba]
Код
Stolb = Cells(1, Columns.Count).End(xlToLeft).Column
[/vba]

Если есть возможность не использовать метки, лучше обходитесь без них. В данном макросе достаточно использовать 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]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеЯя, здравствуйте.
У Вас цикл идет по переменной j, а внутри цикла Вы проверяете ячейку Cells(3, Stolb). Stolb у Вас не меняет своего значения, а значит Вы проверяете все время одну и ту же ячейку (последнюю по строке). Нужно иправить номер столбца на j.

[vba]
Код
Range("A1").Select
Range(Selection, Selection.End(xlToRight)).Select

Stolb = Selection.Cells.Count
[/vba]
Вычислить номер последнего столбца можно одной строчкой.
[vba]
Код
Stolb = Cells(1, Columns.Count).End(xlToLeft).Column
[/vba]

Если есть возможность не использовать метки, лучше обходитесь без них. В данном макросе достаточно использовать 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]

Автор - Manyasha
Дата добавления - 19.01.2017 в 11:33
Яя Дата: Четверг, 19.01.2017, 11:37 | Сообщение № 4
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Спасибо большое! Сейчас опробую :)
 
Ответить
СообщениеСпасибо большое! Сейчас опробую :)

Автор - Яя
Дата добавления - 19.01.2017 в 11:37
Яя Дата: Четверг, 19.01.2017, 11:38 | Сообщение № 5
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
K-SerJC,
НЕ проще, к сожалению.
Формула считает ВСЕ "+", а мне нужен только последний отрезок "+".
 
Ответить
СообщениеK-SerJC,
НЕ проще, к сожалению.
Формула считает ВСЕ "+", а мне нужен только последний отрезок "+".

Автор - Яя
Дата добавления - 19.01.2017 в 11:38
Яя Дата: Четверг, 19.01.2017, 11:42 | Сообщение № 6
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha,
работает отлично, огромное Вам спасибо! hands
я так и знала, что косяк какой-то элементарный :D
 
Ответить
СообщениеManyasha,
работает отлично, огромное Вам спасибо! hands
я так и знала, что косяк какой-то элементарный :D

Автор - Яя
Дата добавления - 19.01.2017 в 11:42
K-SerJC Дата: Четверг, 19.01.2017, 11:43 | Сообщение № 7
Группа: Проверенные
Ранг: Обитатель
Сообщений: 487
Репутация: 86 ±
Замечаний: 0% ±

Excel 2013
на vba пользовательской функцией

вот так работает
считает как формула последний заполненый отрезок, в таблице
начинает с последней заполненной ячейки в первой строке
К сообщению приложен файл: 6107086.xlsm (24.6 Kb)


Благими намерениями выстелена дорога в АД.

Сообщение отредактировал K-SerJC - Четверг, 19.01.2017, 11:50
 
Ответить
Сообщениена vba пользовательской функцией

вот так работает
считает как формула последний заполненый отрезок, в таблице
начинает с последней заполненной ячейки в первой строке

Автор - K-SerJC
Дата добавления - 19.01.2017 в 11:43
Яя Дата: Четверг, 19.01.2017, 11:48 | Сообщение № 8
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
K-SerJC,
про пользовательскую функцию я тоже думала))
очень полезно, спасибо Вам victory
 
Ответить
СообщениеK-SerJC,
про пользовательскую функцию я тоже думала))
очень полезно, спасибо Вам victory

Автор - Яя
Дата добавления - 19.01.2017 в 11:48
Manyasha Дата: Четверг, 19.01.2017, 12:04 | Сообщение № 9
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Вариант с формулой:
Код
=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)-2))-МАКС((C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)-2))

формула массива, вводить через ctrl+shift+enter
К сообщению приложен файл: 5982840-2.xlsm (25.9 Kb)


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеВариант с формулой:
Код
=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)-2))-МАКС((C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)-2))

формула массива, вводить через ctrl+shift+enter

Автор - Manyasha
Дата добавления - 19.01.2017 в 12:04
Яя Дата: Четверг, 19.01.2017, 12:17 | Сообщение № 10
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha,
спасибо :)

правда, я формулу не поняла вообще.
как она работает?
умножает значение ячейки на номер столбца минус 2 - почему?


Сообщение отредактировал Яя - Четверг, 19.01.2017, 12:20
 
Ответить
СообщениеManyasha,
спасибо :)

правда, я формулу не поняла вообще.
как она работает?
умножает значение ячейки на номер столбца минус 2 - почему?

Автор - Яя
Дата добавления - 19.01.2017 в 12:17
Manyasha Дата: Четверг, 19.01.2017, 14:33 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Яя,
Логика такая: я хочу найти номер последней ячейки в строке с плюсом, затем вычесть из него номер последней пустой ячейки, после которой начинается "отрезок" с плюсами.

1. (C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет номера столбцов с плюсом (-2 пока не пишем!).
МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))) - номер последнего столбца с плюсом.

2. (C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет массив, состоящий из нулей и номеров столбцов, после которых начинаются плюсы. Для 3-й строки массив будет такой:[vba]
Код
{3;0;0;0;0;0;0;0;0;12;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
[/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.]


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеЯя,
Логика такая: я хочу найти номер последней ячейки в строке с плюсом, затем вычесть из него номер последней пустой ячейки, после которой начинается "отрезок" с плюсами.

1. (C3:AR3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет номера столбцов с плюсом (-2 пока не пишем!).
МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))) - номер последнего столбца с плюсом.

2. (C3:AR3="")*(D3:AS3="+")*(СТОЛБЕЦ(C3:AR3)) - вернет массив, состоящий из нулей и номеров столбцов, после которых начинаются плюсы. Для 3-й строки массив будет такой:[vba]
Код
{3;0;0;0;0;0;0;0;0;12;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0;0}
[/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
Дата добавления - 19.01.2017 в 14:33
Яя Дата: Четверг, 19.01.2017, 14:48 | Сообщение № 12
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, не надо проще :D
Мне надо, чтобы я поняла Вашу формулу и научилась так же делать girl_smile
 
Ответить
СообщениеManyasha, не надо проще :D
Мне надо, чтобы я поняла Вашу формулу и научилась так же делать girl_smile

Автор - Яя
Дата добавления - 19.01.2017 в 14:48
Яя Дата: Четверг, 19.01.2017, 15:00 | Сообщение № 13
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, скажите, пожалуйста, а почему, когда я смотрю, что возвращает каждая часть формулы, при внесении в ячейку, скажем, {=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))}, в ячейке с формулой получается 0?
Вы пишете, что должен быть номер последнего столбца с "+". Почему я не вижу этот номер, а вижу ничего? :)
 
Ответить
СообщениеManyasha, скажите, пожалуйста, а почему, когда я смотрю, что возвращает каждая часть формулы, при внесении в ячейку, скажем, {=МАКС((C3:AR3="+")*(СТОЛБЕЦ(C3:AR3))}, в ячейке с формулой получается 0?
Вы пишете, что должен быть номер последнего столбца с "+". Почему я не вижу этот номер, а вижу ничего? :)

Автор - Яя
Дата добавления - 19.01.2017 в 15:00
Manyasha Дата: Четверг, 19.01.2017, 15:53 | Сообщение № 14
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 902 ±
Замечаний: 0% ±

Excel 2010, 2016
Яя, это тоже формула массива
вводить через ctrl+shift+enter


Еще почитайте это: Как разобраться в работе сложной формулы?


ЯД: 410013299366744 WM: R193491431804
 
Ответить
СообщениеЯя, это тоже формула массива
вводить через ctrl+shift+enter


Еще почитайте это: Как разобраться в работе сложной формулы?

Автор - Manyasha
Дата добавления - 19.01.2017 в 15:53
Яя Дата: Четверг, 19.01.2017, 15:56 | Сообщение № 15
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, да, я знаю, что это формула массива, я её так и ввожу :) Как надо.
Но в ячейке всё равно 0.

Ушла читать ссылку :)
 
Ответить
СообщениеManyasha, да, я знаю, что это формула массива, я её так и ввожу :) Как надо.
Но в ячейке всё равно 0.

Ушла читать ссылку :)

Автор - Яя
Дата добавления - 19.01.2017 в 15:56
Яя Дата: Четверг, 19.01.2017, 16:03 | Сообщение № 16
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
Manyasha, поняла. в чём дело, СПАСИБО! flowers
 
Ответить
СообщениеManyasha, поняла. в чём дело, СПАСИБО! flowers

Автор - Яя
Дата добавления - 19.01.2017 в 16:03
_Boroda_ Дата: Четверг, 19.01.2017, 16:05 | Сообщение № 17
Группа: Админы
Ранг: Местный житель
Сообщений: 16886
Репутация: 6599 ±
Замечаний: ±

2003; 2007; 2010; 2013 RUS
Ну, не знаю, как насчет попроще, но немассивная зато
Код
=ЕСЛИОШИБКА(ПРОСМОТР(;-1/(C3:AR3="+");C$2:AR$2)-ПРОСМОТР(;1/(C3:AR3-(C$2:AR$2<ПРОСМОТР(;-1/(C3:AR3="+");C$2:AR$2)));C$2:AR$2);"")


Как совершенно верно Алексей (AlexM) подсказывает, неверная отработка в строках 20 и 26. Поправить можно, например, еще одной ЕСЛИОШИБКА, но это уже не так интересно
К сообщению приложен файл: 5982840-2_1.xlsm (23.3 Kb)


Скажи мне, кудесник, любимец ба’гов...
Платная помощь:
Boroda_Excel@mail.ru
Яндекс-деньги: 41001632713405 | Webmoney: R289877159277; Z102172301748; E177867141995


Сообщение отредактировал _Boroda_ - Четверг, 19.01.2017, 20:26
 
Ответить
СообщениеНу, не знаю, как насчет попроще, но немассивная зато
Код
=ЕСЛИОШИБКА(ПРОСМОТР(;-1/(C3:AR3="+");C$2:AR$2)-ПРОСМОТР(;1/(C3:AR3-(C$2:AR$2<ПРОСМОТР(;-1/(C3:AR3="+");C$2:AR$2)));C$2:AR$2);"")


Как совершенно верно Алексей (AlexM) подсказывает, неверная отработка в строках 20 и 26. Поправить можно, например, еще одной ЕСЛИОШИБКА, но это уже не так интересно

Автор - _Boroda_
Дата добавления - 19.01.2017 в 16:05
Яя Дата: Четверг, 19.01.2017, 16:07 | Сообщение № 18
Группа: Пользователи
Ранг: Новичок
Сообщений: 25
Репутация: 0 ±
Замечаний: 0% ±

Excel 2010
_Boroda_,
ух.... нравится мне здесь общаться :)
столько вариантов, столько информации....
Спасибо :) Я очень благодарна.
 
Ответить
Сообщение_Boroda_,
ух.... нравится мне здесь общаться :)
столько вариантов, столько информации....
Спасибо :) Я очень благодарна.

Автор - Яя
Дата добавления - 19.01.2017 в 16:07
  • Страница 1 из 1
  • 1
Поиск:

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