Страницы: 1
RSS
Worksheet_Calculate + накопительные ячейки, макрос
 
Господа товарищи профессионалы, доброе время суток.
Я только начал учиться работать в excel, потому не ругайте сильно.
Проблема у меня такая: необходимо сделать файл учёта сдачи/выдачи оборудования с выводом состояния в базе (сдал или получил человек).
На листе 1 база данных: столбец "А"- iD оборудования (которое и является основным действующим лицом); столбец "В" - ФИО, за кем закреплено оборудование; столбец "С" не играет роли; столбец "Е" я сделал простым счётчиком (СЧЁТЕСЛИ), т.е. считанный iD совпал - 1, нет совпадений - 0. А вот в столбец "F" мне необходимо сделать накопительный счётчик от "Е". Т.е. $F=$F+E (1 или 0) и значения F не должны обнуляться.
Лист2 это лист текущих данных: столбец "А" - вводятся данные со считывателя эмуляцией клавиатурного ввода; столбец "В" - вывод ФИО из базы (лист1); "D" - вывод состояния из лист1 "F".
А проблема в том, что макрос c Worksheet_Change не реагирует на изменения в ячейках лист1 "Е", т.к. там просто пересчёт формулой, сами данные вводятся только на лист2 "А". C Worksheet_Calculate я вообще запутался, т.к. он не имеет диапазонов....
Пожалуйста, помогите победить эту задачу, т.к. сам я туп и с каждым днём всё дальше лезу в дерябли.
Пробный пример во вложении (пришлось в архив сунуть, т.к. *.xlsm некорректный файл почему-то).
Заранее огромное всем спасибо.
 
Slawjan, опишите человеческим языком (без адресов ячеек/строк/столбцов, без формул и макросов), что Вы из чего хотите получить и по какому алгоритму? (пока я смутно понимаю суть задачи)

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
JayBhagavan,
Есть "база", в которой за каждым человеком закреплено оборудование со своим iD (это лист1).
На лист 2 считывается iD оборудования, выводится из базы ФИО и оттуда же выводится статус оборудования (сдан/выдан).
Это общее.
Сейчас мне необходимо решить задачу на листе1: при изменении в столбце "Е" ,в определённой ячейке, результата пересчёта формулы (0 или 1), в соседнюю справа ячейку к имеющемуся числу прибавить этот "0" или "1".
Вроде вот
 
Цитата
JayBhagavan написал: опишите человеческим языком (без адресов ячеек/строк/столбцов, без формул и макросов),
Цитата
Slawjan написал: Сейчас мне необходимо решить задачу на листе1: при изменении в столбце "Е" ,в определённой ячейке, результата пересчёта формулы (0 или 1), в соседнюю справа ячейку к имеющемуся числу прибавить этот "0" или "1".
Опять 25.
Во-первых, я пытаюсь понять суть задачи, чтобы Вы сформировали название темы соответствующее правилам формулы форума. (до исправления названия модераторами, помощь не рекомендуется оказывать, т.е. предоставлять решение макросами и/или формулами)
Во-вторых, надо понять что это за счётчик, какова его суть и для чего предназначен?
Изменено: JayBhagavan - 28.10.2018 07:07:44

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Попробую конкретнее:
Только лист1.
Если в какой-то ячейке из столбца "Е" происходит пересчёт формулой, то результат должен прибавиться только в соседнюю ячейку справа, к тому, что там уже есть.
И сумма в ячейках "F" сбрасываться не должна (т.е. постоянный накопительный счётчик количества срабатываний)
Изменено: Slawjan - 28.10.2018 07:31:53
 
Цитата
JayBhagavan написал: что это за счётчик, какова его суть и для чего предназначен?

Формула массива (ФМ) вводится Ctrl+Shift+Enter
Memento mori
 
Цитата
JayBhagavan написал:
надо понять что это за счётчик, какова его суть и для чего предназначен
Мне нужен подсчёт количества "считываний" iD каждого прибора (при выдаче, при сдаче прибора).
 
Здравствуйте. Может эта формула в столбец F подойдёт?
Код
=СУММЕСЛИ($A$1:A1;A1;$E$1:E1)
 
Добрый день. Спасибо, но к сожалению нет. Идеальная формула была бы F1=F1+E1, но такого не бывает))) Плюс формулы работают только "онлайн" и не сохраняют данные. Макрос позволяет "вбить" в ячейку данные, которые там и останутся при закрытии/открытии файла.....
 
Ладно, по-другому:
как мне переписать этот код, чтоб он брал результат из ячейки с формулой при её пересчёте?:
Код
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
      With Target
         If Not Intersect(Target, Range("E1:E163")) Is Nothing Then
            If IsNumeric(Target.Value) Then
               Application.EnableEvents = False
               Target.Offset(0, 1).Value = Target.Offset(0, 1).Value + Target.Value
               Application.EnableEvents = True
            End If
         End If
      End With
End Sub
 
Цитата
Slawjan написал:
Идеальная формула была бы F1=F1+E1, но такого не бывает)))
бывает, примеров куча, первый попавшийся. Только нужно понимать для чего это делается и как это работает.
Изменено: bedvit - 28.10.2018 08:51:56
«Бритва Оккама» или «Принцип Калашникова»?
 
Последний более-менее рабочий макрос, что смог "наваять":
Код
Private Sub Worksheet_Calculate()
      Dim Sh As Range
         For Each Sh In Range("E1:E163").Cells
         If Not Intersect(Sh, Range("E1:E163")) Is Nothing Then
            If IsNumeric(Sh.Value) Then
               Application.EnableEvents = False
               Sh.Offset(0, 1).Value = Sh.Offset(0, 1).Value + Sh.Value
               Application.EnableEvents = True
            End If
         End If
         Next
End Sub
Но проблема в том, что он обрабатывает не только ту ячейку, которая была изменена последней, а и остальные.......
 
Цитата
Slawjan написал:
лезу в дерябли
не надо туда :-)
Вам надо при каждом пересчете листа
1 проверять изменились ли значение в вашем диапазоне E1:E163 сравнивая с ранее сохраненными значениям в укромном месте.
2 если изменилось, то проделывать ваше сложение и записать новый набор значений на следующего сравнения.
3 если нет ,то ничего не делаем.
По вопросам из тем форума, личку не читаю.
 
По вашему описанию, если код прописан на Sheet2, макрос можно записать так
Код
Sheets("Sheet1").Range("F" & Target.Row-2).Value = Sheets("Sheet1").Range("F" & Target.Row-2).Value + Sheets("Sheet1").Range("E" & Target.Row-2).Value

Но у вас либо ошибка, либо вы задумали для меня не понятное. Формула в Sheet1 "E1"=Sheet2 "Z3" не учитывая ID в столбце А, почему? Получается что в столбце Е Sheet1, счет не связан с данными на листе Sheet1, все данные берутся с другого листа. Это и не понятно.

Цитата
JayBhagavan написал:
что Вы из чего хотите получить и по какому алгоритму?

Изменено: gling - 28.10.2018 09:26:31
 
Прошу прощения, в файле много лишнего было. Не поудалял полностью все "попытки". Во вложении "подчищенный" файл.
P.S. Ещё дело в том, что в конце дня данные с листа2 распечатываются и все считанные iD удаляются. Но это не должно влиять на накопительный счётчик на листе1.
А Формула в Sheet1 "E1"=Sheet2 "Z3" не учитывая ID в столбце А, т.к. в Sheet2 "Z3" она учитывается. Ну, по-другому вывернуть не смог, чтоб без этого Sheet2 "Z3" обойтись.
Изменено: Slawjan - 28.10.2018 09:51:11
 
Цитата
gling написал:
Sheets("Sheet1").Range("F" & Target.Row-2).Value =
А Worksheet.Calculate же не работает с Target? А если Worksheet.Change использовать, то он не работает с ячейками, содержащими формулы....
 
Slawjan, #13 вы читали или нет?
По вопросам из тем форума, личку не читаю.
 
БМВ, читал)))) Пытаюсь сформулировать теперь и порпобовать
 
Вариант в файле, но не понятно может ли быть два одинаковых ID на листе 2? Если да то что то будет не так, потому что формула в столбце Е учитывает только наличие ID на листе2
Изменено: gling - 28.10.2018 10:53:05
 
Цитата
gling написал:
Вариант в файле
Ну,  блин, всё гениальное оказывается просто))))) А я прилип к этому "ЕСЛИ" в Sheet1 "D" и всё больше на этом зацикливался.... А то, что можно же по другой позиции найти и потом счёт к этому привязать....
Спасибо Вам огромнейшее человеческое!
Буду стараться учиться))
 
А теперь модераторы ждут от провинившихся название темы.

Предложение автора:
Цитата
Как сделать с помощью макроса накопительные ячейки с поиском и выводом значений из ячеек с формулами по типу Target?
Но это что-то закрученное и непонятное.
Страницы: 1
Наверх