Здравствуйте, уважаемые! Прошу Вас помочь словом/делом. Есть: длинная горизонтальная таблица, почти в каждой ячейке которой формулы. Эта таблица и есть ЦЕЛЕВОЙ ДИАПАЗОН (назову её так). В примере строки [5-8]. Над нею строка дат (в примере прямая нумерация: строка 3). В примере ячейка I1 "несет" контрольное значение (дата "сегодня"). Требуется: Если значение некой ячейки со строки 3 = значению контрольной ячейки I1 -> функции ячеек предыдущего столбика из Целевого Диапазона переписать на их значения. Т.е. в примере: F3 = $I$1 -> в диаразоне [E5:E8] формулы заменить значениями. Подразумевается, что "вчера" значение I1 было равно 4, "позавчера" = 3. Таким образом получается, что все предыдущие (относительно I1) ячейки Целевого Диапазона уже перезаписаны их значениями, а [F5:I8] - содержат формулы и пока считают.
Учусь VBA (недавно начал). Пытался накорябать польз.функцию и вызывать её при выполнении условия (строка 12 примера). Не-а.))
Код
Public Function МояЗаменяка(rng As Range)
Dim cell As Range
Selection.Interior.ColorIndex = 6
For Each cell In rng
cell.Formula = cell.Value
Next cell
' МояЗаменяка = "заменил"
End Function
В какой момент должен запускаться макрос? Когда пользователь изменяет данные в "I1"? Или когда пользователь изменяет данные в строке 3? Или в каком-то другом случае?
Макрос находится в модуле книги и запускается при открытии книги. Если при открытии книги вверху есть желтая панель для разрешения макросов, то нужно разрешить макросы.
Не понял Вас. Вы разобрались, для чего нужен код или нет? Вместо "I1" какую ячейку смотреть? Или ячейка меняется: сегодня одна, завтра другая? Если да, то по какому принципу меняется ячейка в строке 1?
Или ячейка меняется: сегодня одна, завтра другая? Если да, то по какому принципу меняется ячейка в строке 1?
Сегодня одна, завтра - другая. Принцип (см. строку формул на картинке выше): когда я завтра открою этот файл будет 11.12.2017, что буде соответствовать 201712 в строке 2, и числу 11 в ячейке YG3. Треугольничек завтра будет в YG1 (согласно условия: ЕСЛИ СЕГОДНЯ = дате из таблицы, ТО рисовать треугольничек (дата формируется в удобоваримый для Excel вид в строках 4 и 5)).
Итак. Мне нужно по значению ячейки "сегодня" (YF1) перезаписать значениями диапазон [YE4:YE127]. Завтра "сегодня" будет в (YG1) и перезаписывать будем уже диапазон [YF4:YF127].
Макрос не смотрит данные в строке 1, а смотрит текущую дату с помощью функции "Date". Посмотрите комментарий в макросе.
Код
Private Sub Workbook_Open()
Dim shRes As Worksheet, dateToday As Date
Dim arr(), lc As Long, j As Long
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Set shRes = Worksheets("Лист2")
lc = shRes.Cells(5, shRes.Columns.Count).End(xlToLeft).Column
arr() = shRes.Range("A5").Resize(, lc).Value
dateToday = Date
For j = 1 To lc
If arr(1, j) = dateToday Then
'Здесь вместо строк "5:8" укажите нужные строки, в которых нужно заменить формулы на значения.
With shRes.Rows("5:8").Columns(j - 1)
.Value = .Value
End With
Exit For
End If
Next j
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
End Sub
Аха. Наверное лисица не может. Спасибо Вам! С Вашего позволения, Я с ответом повременю до завтра. Внедрю в рабочий файл, посмотрю как работает, и ОБЯЗАТЕЛЬНО отпишусь.
Млин Я второй день череплю, а толку нет. За 2 часа понять "чего он хочет" и выдать... Преклоняюсь!
Да не сочтите за наглость моё стремление к совершенству...
2 момента... 1. Большая часть строк Целевого Диапазона (содержащая формулы) заблокирована - дабы случайно не "зацепить" формул. Когда лист под защитой - при запуске файла идет ошибка, макрос не может корректно отработать. Можно ли в програмно разблокировать ячейку -> перезаписать -> снова заблокировать. Ну или как-то иначе поступить. При установке защиты листа галочками разрешаю: - выделение незаблокированных ячеек - форматирование ячеек - изменение объектов Всё остальное - низя.
2. Из практики: файл запускается ежедневно. Но иногда бывает дня 2...4 пропуска. Как можно расширить диапазон выполнения перезаписи с одной колонки на колонок 5 - этого с лихвой достаточно.
Юрий М, Вы третий... "решение" в посте#8 было дано Karataev. В посте#13 на приложенных скринах показано, что при определенных условиях оно не работает. При личном обращении (в пределах форума) к автору решения Karataev, был получен ответ, в котором данная задача считается БОЛЬШОЙ и решаться он будет либо за денежное вознаграждение, либо мою МЕГАзадачу бить на куски, а впоследствии собирать воедино.
А теперь по-Русски! Это большая задача?! За это сегодня программист деньги берет? А форум - это... площадка для рекламы своих навыков и привлечения клиентов. Я конечно понимаю, капитализм, и т.д., но... Цель форума? И... теперь Вам ясен смысл поста#14? Собственно ответ: пост#14 был адресован to Karataev
Код, предложенный Каратаевым, рабочий: Вы сами об этом писали в #12. А то, что Вы перед этим ни слова не сказали про защиту листа (решается элементарно) - Ваша вина. И говорить, что "Приведённый выше код, решением не является" - неправильно! Про "саморекламу": человек потратил своё время на помощь Вам - это самореклама? Следуя Вашей логике, все, кто здесь выкладывает решения, помогая гостям, занимаются саморекламой? Ваш #14 - чистой воды хамство. Или это у Вас такой стиль выражения благодарности? Про цель форума: помогать тем, у кого что-то не получается. А в данном случае Каратаев всё сделал за Вас. Всё! Это помощь? Про ошибку обращения сюда: в Сети полно форумов по Excel - Вас здесь никто не держит. Да и не нужны нам тут такие хамовитые и наглые посетители. Сомневаюсь, что кто-то захочет Вам ПОМОГАТЬ при таком отношении к помогающим. Про "Мельчает нынче Программист": учитесь программировать, помогайте потом другим и не "мельчайте". И последнее: считаю, что Вы нарушили п. 3.4 наших Правил. Реагирую соответственно - бан!