Здравствуйте, уважаемые! Прошу Вас помочь словом/делом.
Есть: длинная горизонтальная таблица, почти в каждой ячейке которой формулы. Эта таблица и есть ЦЕЛЕВОЙ ДИАПАЗОН (назову её так) строки [1-31].
Строка 1 "несёт" контрольное значение (дату "сегодня"), формула ежедневно "перемещает" треугольник вправо.
Строки [2...5] - строки дат (строки 2 и 3 - вид, удобный для пользователя - виден и заблокирован, строка 5 - вид, "удобный" для Excel - скрыт от пользователя).
В Целевом Диапазоне более половины строк несут формулы. Они заблокированы чтобы случайно не "зацепить" формул. Часть этих строк - служебные расчеты - вообще скрыты от пользователя. При установке ЗАЩИТЫ ЛИСТА галочками разрешаю: - выделение незаблокированных ячеек - форматирование ячеек - изменение объектов Всё остальные галочки сняты.
Из практики: файл запускается ежедневно. Но иногда бывает 2...4 дня пропуска. ------ ------ Требуется: ------ 1. формулы ячеек Целевого Диапазона [M1 : ##31] заменить на их значения. Правая граница диапазона - от "вчера" включительно и влево до колонки M по строкам 1...31.
Т.е. если Я запускаю книгу сегодня, то треугольничек (маркер "сегодня") будет на ячейке CG1 напротив 12.12.2017 в ячейке CG5 (промежуточные CG2:CG4 не описываю как не имеющие важность для задачи). При этом нужно чтобы [M1:CF31] был автоматически переписан с формул на их значения. При запуске файла завтра треугольничек уже будет в ячейке CH1, и диапазон перезаписи уже изменится на [M1:CG31]. Разумеется можно не перезаписывать каждый день весь диапазон, а перезаписывать только вчерашний (т.е. если для "сегодня" = 12.12.2017 - то перезаписать только вчерашний [CF1:CF31]), но т.к. возможны пропуски в открытии файла до недели, то тогда лучше брать с запасом 5...7 дней "во вчера", т.е [BZ1:CF31]. ------ 2. Также отталкиваясь от даты "сегодня" в прошлое и будущее, автоматически прятать (скрывать) колонки (от [M включительно) со "старостью" более допустим 2х месяцев "назад" (влево), и "вперед" (вправо) колонки более пусть 1 месяца и до конца таблицы.
Т.е. на "сегодня" останется отображаемым (слева - направо): колонки ["A"..."L"] : отображаются всегда колонки ["M":"W"(... 2 месяца влево от "сегодня")] : ежедневно автоматически скрываются. колонки ["X"..."DK"] : отображаются на день "сегодня" = 12.12.2017. колонки ["DL":"конца таблицы"] : автоматически скрыты. ------ ------ Еще раз прошу Вас обратить внимание на особенности: - защищенного листа; - эпизодические пропуски в запусках файла 2...4 дня (т.е. ширина ежедневного диапазона проверки скрыта/не скрыта колонка в диапазоне [L...2 мес.от "сегодня"]); - во многих ячейках Целевого Диапазона, куда пользователь вводит определенные метки, имеются примечания - их нельзя потерять. ------ ------ VBA я только начал изучать - по мере наличия времени, такое я в ближайшие месяцы не потяну. А вот наглядный и актуальный пример для обучения будет прекрасным. Спасибо, что уделили внимание.
Здравствуйте, уважаемые! Прошу Вас помочь словом/делом.
Есть: длинная горизонтальная таблица, почти в каждой ячейке которой формулы. Эта таблица и есть ЦЕЛЕВОЙ ДИАПАЗОН (назову её так) строки [1-31].
Строка 1 "несёт" контрольное значение (дату "сегодня"), формула ежедневно "перемещает" треугольник вправо.
Строки [2...5] - строки дат (строки 2 и 3 - вид, удобный для пользователя - виден и заблокирован, строка 5 - вид, "удобный" для Excel - скрыт от пользователя).
В Целевом Диапазоне более половины строк несут формулы. Они заблокированы чтобы случайно не "зацепить" формул. Часть этих строк - служебные расчеты - вообще скрыты от пользователя. При установке ЗАЩИТЫ ЛИСТА галочками разрешаю: - выделение незаблокированных ячеек - форматирование ячеек - изменение объектов Всё остальные галочки сняты.
Из практики: файл запускается ежедневно. Но иногда бывает 2...4 дня пропуска. ------ ------ Требуется: ------ 1. формулы ячеек Целевого Диапазона [M1 : ##31] заменить на их значения. Правая граница диапазона - от "вчера" включительно и влево до колонки M по строкам 1...31.
Т.е. если Я запускаю книгу сегодня, то треугольничек (маркер "сегодня") будет на ячейке CG1 напротив 12.12.2017 в ячейке CG5 (промежуточные CG2:CG4 не описываю как не имеющие важность для задачи). При этом нужно чтобы [M1:CF31] был автоматически переписан с формул на их значения. При запуске файла завтра треугольничек уже будет в ячейке CH1, и диапазон перезаписи уже изменится на [M1:CG31]. Разумеется можно не перезаписывать каждый день весь диапазон, а перезаписывать только вчерашний (т.е. если для "сегодня" = 12.12.2017 - то перезаписать только вчерашний [CF1:CF31]), но т.к. возможны пропуски в открытии файла до недели, то тогда лучше брать с запасом 5...7 дней "во вчера", т.е [BZ1:CF31]. ------ 2. Также отталкиваясь от даты "сегодня" в прошлое и будущее, автоматически прятать (скрывать) колонки (от [M включительно) со "старостью" более допустим 2х месяцев "назад" (влево), и "вперед" (вправо) колонки более пусть 1 месяца и до конца таблицы.
Т.е. на "сегодня" останется отображаемым (слева - направо): колонки ["A"..."L"] : отображаются всегда колонки ["M":"W"(... 2 месяца влево от "сегодня")] : ежедневно автоматически скрываются. колонки ["X"..."DK"] : отображаются на день "сегодня" = 12.12.2017. колонки ["DL":"конца таблицы"] : автоматически скрыты. ------ ------ Еще раз прошу Вас обратить внимание на особенности: - защищенного листа; - эпизодические пропуски в запусках файла 2...4 дня (т.е. ширина ежедневного диапазона проверки скрыта/не скрыта колонка в диапазоне [L...2 мес.от "сегодня"]); - во многих ячейках Целевого Диапазона, куда пользователь вводит определенные метки, имеются примечания - их нельзя потерять. ------ ------ VBA я только начал изучать - по мере наличия времени, такое я в ближайшие месяцы не потяну. А вот наглядный и актуальный пример для обучения будет прекрасным. Спасибо, что уделили внимание.Ale_ko
sboy, количество и объём хотелок определяется не "помогающими этим", да и Я не говорил, что моё участие будет нулевым. Возможно, и скорее всего, достаточно было подсказать направления изучений... Ладно. Ошибся Я. Не нужно было мне сюда обращаться... Да, и ошибся Я с тем, что "такое я в ближайшие месяцы не потяну".
Всем обращающимся сюда, и на другие ресурсы за ПОМОЩЬЮ! Я качнул 4 книжки по VBA и изучая их (выискивая то, что "возможно бы подошло"), дополнительно погуглил, и в течение трёх дней нарисовал код. САМ! Это не так сложно, как кажется поначалу! Нет, конечно же Я не стану лукавить, опыт программирования у меня есть, но давно это было, и ООП языки тогда только "начинались"... Но, тем не менее, это не сложно! Читайте, разбирайтесь. Напишите единожды, будете после писать с лёгкостью. Люди, а "этим" НЕ платите. А Вам, Программисты! Ой, нет, не так: "программисты" - это не тот труд, за который деньги берут! Стыдно! Мельчает нынче ПРОГРАММИСТ... Это не 6000 строк кода (не "китайского") за ночь, заставляющего программу делать то, на что она не способна по определению. Не хочу продолжать!
sboy, количество и объём хотелок определяется не "помогающими этим", да и Я не говорил, что моё участие будет нулевым. Возможно, и скорее всего, достаточно было подсказать направления изучений... Ладно. Ошибся Я. Не нужно было мне сюда обращаться... Да, и ошибся Я с тем, что "такое я в ближайшие месяцы не потяну".
Всем обращающимся сюда, и на другие ресурсы за ПОМОЩЬЮ! Я качнул 4 книжки по VBA и изучая их (выискивая то, что "возможно бы подошло"), дополнительно погуглил, и в течение трёх дней нарисовал код. САМ! Это не так сложно, как кажется поначалу! Нет, конечно же Я не стану лукавить, опыт программирования у меня есть, но давно это было, и ООП языки тогда только "начинались"... Но, тем не менее, это не сложно! Читайте, разбирайтесь. Напишите единожды, будете после писать с лёгкостью. Люди, а "этим" НЕ платите. А Вам, Программисты! Ой, нет, не так: "программисты" - это не тот труд, за который деньги берут! Стыдно! Мельчает нынче ПРОГРАММИСТ... Это не 6000 строк кода (не "китайского") за ночь, заставляющего программу делать то, на что она не способна по определению. Не хочу продолжать!Ale_ko
Ну и... тем, кому нужна будет схожая задача, выкидываю код: "Эта книга" [vba]
Код
Private Sub Workbook_Open() '****** запускаем КОД при открытии Книги ******' '_____________ определение ЗАЩИТЫ ЛИСТА с разрешением работы КОДУ _____________' Sheets("процесс").Protect DrawingObjects:=False, Contents:=True, Scenarios:= _ True, AllowFormattingCells:=True, UserInterfaceOnly:=True '_____________ действия КОДА на листе _____________' FtoV = -6 'глубина перезаписи, дней (вниз+ вправо+, тут влево-) WtoLeft = 60 'ОКНО левее СЕГОДНЯ WtoRight = 20 'ОКНО правее СЕГОДНЯ '_____________' Dim dateToday dateToday = Date Dim cell As Range Application.ScreenUpdating = False 'отключаем обновление экрана для ускорения For Each cell In Worksheets("процесс").UsedRange.Rows(5).Cells 'проходим по всем ячейкам строки 5 If cell.Value = dateToday Then 'если в значение в ячейке = ДатаСегодня -> '_____________ перезапись функций их значениями в ползущем диапазоне ячеек _____________' Range(cell.Offset(-1, -3), cell.Offset(123, FtoV)).Formula = Range(cell.Offset(-1, -3), cell.Offset(123, FtoV)).Value 'одновременно задаём сещениями диапазон в стороках [4...128] и перезаписываем формулы их значениями '_____________ ОКНО _____________' adrCOLUMN = cell.Column 'получаю адрес в R1C1 колонки, где даты равны iColumnX = Worksheets("процесс").UsedRange.Column + Worksheets("процесс").UsedRange.Columns.Count - 1 'тут посчитали количество используемых (UsedRange) 'ячеек вообще - как ПРАВАЯ граница For i = 13 To iColumnX 'от ЛЕВОЙ до ПРАВОЙ границы If i < (adrCOLUMN - WtoLeft) Or i > (adrCOLUMN + WtoRight) Then Cells(i).EntireColumn.Hidden = True 'то скрыть i-колонку End If If i > adrCOLUMN And i <= (adrCOLUMN + WtoRight) Then Cells(i).EntireColumn.Hidden = False 'показываем колонку [i...Пр.Граница] End If Next '_____________ ОКНО _____________' End If Next cell Application.ScreenUpdating = True 'включаем обновление экрана Worksheets("процесс").Cells(7, adrCOLUMN).Select End Sub
[/vba]
Ну и... тем, кому нужна будет схожая задача, выкидываю код: "Эта книга" [vba]
Код
Private Sub Workbook_Open() '****** запускаем КОД при открытии Книги ******' '_____________ определение ЗАЩИТЫ ЛИСТА с разрешением работы КОДУ _____________' Sheets("процесс").Protect DrawingObjects:=False, Contents:=True, Scenarios:= _ True, AllowFormattingCells:=True, UserInterfaceOnly:=True '_____________ действия КОДА на листе _____________' FtoV = -6 'глубина перезаписи, дней (вниз+ вправо+, тут влево-) WtoLeft = 60 'ОКНО левее СЕГОДНЯ WtoRight = 20 'ОКНО правее СЕГОДНЯ '_____________' Dim dateToday dateToday = Date Dim cell As Range Application.ScreenUpdating = False 'отключаем обновление экрана для ускорения For Each cell In Worksheets("процесс").UsedRange.Rows(5).Cells 'проходим по всем ячейкам строки 5 If cell.Value = dateToday Then 'если в значение в ячейке = ДатаСегодня -> '_____________ перезапись функций их значениями в ползущем диапазоне ячеек _____________' Range(cell.Offset(-1, -3), cell.Offset(123, FtoV)).Formula = Range(cell.Offset(-1, -3), cell.Offset(123, FtoV)).Value 'одновременно задаём сещениями диапазон в стороках [4...128] и перезаписываем формулы их значениями '_____________ ОКНО _____________' adrCOLUMN = cell.Column 'получаю адрес в R1C1 колонки, где даты равны iColumnX = Worksheets("процесс").UsedRange.Column + Worksheets("процесс").UsedRange.Columns.Count - 1 'тут посчитали количество используемых (UsedRange) 'ячеек вообще - как ПРАВАЯ граница For i = 13 To iColumnX 'от ЛЕВОЙ до ПРАВОЙ границы If i < (adrCOLUMN - WtoLeft) Or i > (adrCOLUMN + WtoRight) Then Cells(i).EntireColumn.Hidden = True 'то скрыть i-колонку End If If i > adrCOLUMN And i <= (adrCOLUMN + WtoRight) Then Cells(i).EntireColumn.Hidden = False 'показываем колонку [i...Пр.Граница] End If Next '_____________ ОКНО _____________' End If Next cell Application.ScreenUpdating = True 'включаем обновление экрана Worksheets("процесс").Cells(7, adrCOLUMN).Select End Sub
Sub HideRows() Dim cell As Range Application.ScreenUpdating = False 'отключаем обновление экрана для ускорения For Each cell In ActiveSheet.UsedRange.Columns(1).Cells 'проходим по всем ячейкам первого столбца If cell.Value = "x" Then cell.EntireRow.Hidden = True 'если в ячейке x - скрываем строку Next Application.ScreenUpdating = True 'включаем обновление экрана End Sub Sub ShowRows() Rows.Hidden = False 'отменяем все скрытия строк End Sub Sub ShowColumns() Columns.Hidden = False 'отменяем все скрытия строк End Sub
[/vba]
Модуль1 [vba]
Код
Sub HideRows() Dim cell As Range Application.ScreenUpdating = False 'отключаем обновление экрана для ускорения For Each cell In ActiveSheet.UsedRange.Columns(1).Cells 'проходим по всем ячейкам первого столбца If cell.Value = "x" Then cell.EntireRow.Hidden = True 'если в ячейке x - скрываем строку Next Application.ScreenUpdating = True 'включаем обновление экрана End Sub Sub ShowRows() Rows.Hidden = False 'отменяем все скрытия строк End Sub Sub ShowColumns() Columns.Hidden = False 'отменяем все скрытия строк End Sub
Sub кнопка_СЕГОДНЯ() Dim dateToday dateToday = Date 'dateToday contains the current system date. Dim cell As Range For Each cell In Worksheets("процесс").UsedRange.Rows(5).Cells 'проходим по всем ячейкам строки 5 If cell.Value = dateToday Then 'если в значение в ячейке = ДатаСегодня -> adrCOLUMN = cell.Column 'получаю адрес в R1C1 колонки, где даты равны End If Next cell Worksheets("процесс").Cells(7, adrCOLUMN).Select End Sub
[/vba]
Модуль2 ("бонус" - кнопка СЕГОДНЯ) [vba]
Код
Sub кнопка_СЕГОДНЯ() Dim dateToday dateToday = Date 'dateToday contains the current system date. Dim cell As Range For Each cell In Worksheets("процесс").UsedRange.Rows(5).Cells 'проходим по всем ячейкам строки 5 If cell.Value = dateToday Then 'если в значение в ячейке = ДатаСегодня -> adrCOLUMN = cell.Column 'получаю адрес в R1C1 колонки, где даты равны End If Next cell Worksheets("процесс").Cells(7, adrCOLUMN).Select End Sub
Ale_ko, не совсем понятны Ваши, не знаю как сказать, обиды или претензии. Есть Правила форума, в которых однозначно сказано: один вопрос - одна тема. Если бы вняли совету из поста 4 и разбили задачу на отдельные вопросы, то и помощь получили бы быстрее. Просто на этом форуме не принято помогать нарушителям Правил. А за то, что поделились решением, спасибо
Ale_ko, не совсем понятны Ваши, не знаю как сказать, обиды или претензии. Есть Правила форума, в которых однозначно сказано: один вопрос - одна тема. Если бы вняли совету из поста 4 и разбили задачу на отдельные вопросы, то и помощь получили бы быстрее. Просто на этом форуме не принято помогать нарушителям Правил. А за то, что поделились решением, спасибоPelena
"Черт возьми, Холмс! Но как??!!" Ю-money 41001765434816
Исходный файл один? Действия выполняются над одним объектом? Глупо 4-жды объяснять одно и тоже, с заменой узких целей, часть из которых, кстати, лежит даже внутри одного цикла. И как же тогда, человек несведущий в VBA, скомпоновал бы все корректно в один код? Вот это была бы дискуссия эдак месяца на 2...3
Исходный файл один? Действия выполняются над одним объектом? Глупо 4-жды объяснять одно и тоже, с заменой узких целей, часть из которых, кстати, лежит даже внутри одного цикла. И как же тогда, человек несведущий в VBA, скомпоновал бы все корректно в один код? Вот это была бы дискуссия эдак месяца на 2...3Ale_ko
Сообщение отредактировал Ale_ko - Суббота, 23.12.2017, 20:48