Страница: 1 |
|
Вопрос: как выделить диапазон в табл. по опредленной дате
|
Добавлено: 08.12.08 18:11
|
|
Автор вопроса: oleg
|
Всем форумчанам доброго дня.
Не откажите в помощи решения некоторой задачи (если такое возможно) или в направлении действий. Совсем недавно начал пробовать писать макросы, раньше почти всегда пользовался встроеннымы функциями или редактировал макросы, записанные при помощи мастера макросов.
Задача такова: в таблице в первой строке проставлены в нарастающем порядке даты, в первом столбце идут наименования, данные заносятся по напротив даты и наименования. Нужно при открытии книги дать запрет на редактирование (поставить в свойствах защиту и защитить лист книги) ячейкам вчерашней и других прошедших дней. То есть проверка соответсвия текущей даты с датой в таблице и задание свойств диапазону на запрет редактирования и вкл. защиты листа. Это защита от "дурака", чтобы он не стер внесенные ранее данные.
Начал пытаться писать, но чувствую туплю страшно... Сначала по дате снимаю защиту со всего листа, а дальше темно и холодно..
Private Sub Workbook_Open()
If Now > DateValue("8/ 12 / 8") Then ActiveSheet.Unprotect
Cells.Select
Selection.Locked = False
Selection.FormulaHidden = False
Спросить кроме вас не у кого, книжку Уокенбаха читаю уже неделю, но пока все в тумане. Если форум читают "спецы" вроде меня могу бросить pdf этой книжки 600 с небольшим страниц.
Спасибо за понимание.
Ответить
|
Номер ответа: 1 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #1
|
Добавлено: 08.12.08 22:10
|
Отличная задачка для начинающих. Для начала надо понять, как вычислить колонку с сегодняшней датой. Для этого проще всего использовать функцию MATCH:
На рабочем листе эта формула нам вернёт номер колонки с текущей датой. Чтобы использовать её в VBA, достаточно воспользоваться функцией Application.Evaluate:
- Application.Evaluate("MATCH(TODAY(), Sheet1!1:1)")
Полный код выглядит следующим образом:
- Option Explicit
-
- Private Sub Workbook_Open()
- Dim ROWS_AMOUNT As Long
- Dim COLUMNS_AMOUNT As Integer
- Dim theSheet As Worksheet
- Dim todayColumn As Integer
-
-
- ROWS_AMOUNT = Rows.Count
- COLUMNS_AMOUNT = Columns.Count
-
- Set theSheet = ThisWorkbook.Worksheets("Sheet1")
-
- todayColumn = CInt(Application.Evaluate("MATCH(TODAY(), " & theSheet.Name & "!1:1)"))
-
- theSheet.Unprotect
-
- Range(theSheet.Cells(1, 1), theSheet.Cells(ROWS_AMOUNT, todayColumn - 1)).Locked = True
-
- Range(theSheet.Cells(1, todayColumn), theSheet.Cells(ROWS_AMOUNT, COLUMNS_AMOUNT)).Locked = False
-
- theSheet.Protect
- End Sub
Интересно, что Excel помнит, какой диапазон был разблокирован в последнем сеансе, поэтому старый диапазон приходится блокировать снова. Этот момент я ещё сам не совсем понял. Однако, факт есть факт.
P.S. Оукенбаха читайте, рекомендую
Ответить
|
Страница: 1 |
Поиск по форуму