Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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 с небольшим страниц.
  
Спасибо за понимание.

Ответить

  Ответы Всего ответов: 2  

Номер ответа: 1
Автор ответа:
 Nytrogen



Вопросов: 18
Ответов: 186
 Профиль | | #1 Добавлено: 08.12.08 22:10
Отличная задачка для начинающих. Для начала надо понять, как вычислить колонку с сегодняшней датой. Для этого проще всего использовать функцию MATCH:
  1. =MATCH(TODAY();1:1)

На рабочем листе эта формула нам вернёт номер колонки с текущей датой. Чтобы использовать её в VBA, достаточно воспользоваться функцией Application.Evaluate:
  1. Application.Evaluate("MATCH(TODAY(), Sheet1!1:1)")


Полный код выглядит следующим образом:
  1. Option Explicit
  2.  
  3. Private Sub Workbook_Open()
  4.   Dim ROWS_AMOUNT As Long          'общее количество строк
  5.   Dim COLUMNS_AMOUNT As Integer    'общее количество колонок
  6.   Dim theSheet As Worksheet        'рабочий лист
  7.   Dim todayColumn As Integer       'номер колонки с сегодняшнней датой
  8.  
  9.   'запоминаем значения
  10.   ROWS_AMOUNT = Rows.Count
  11.   COLUMNS_AMOUNT = Columns.Count
  12.   'запоминаем рабочий лист
  13.   Set theSheet = ThisWorkbook.Worksheets("Sheet1")
  14.   'вычисляем колонку с сегодняшней датой
  15.   todayColumn = CInt(Application.Evaluate("MATCH(TODAY(), " & theSheet.Name & "!1:1)"))
  16.   'разблокируем лист
  17.   theSheet.Unprotect
  18.   'блокируем предыдущие даты
  19.   Range(theSheet.Cells(1, 1), theSheet.Cells(ROWS_AMOUNT, todayColumn - 1)).Locked = True
  20.   'разблокируем сегодняшнюю и последующие даты
  21.   Range(theSheet.Cells(1, todayColumn), theSheet.Cells(ROWS_AMOUNT, COLUMNS_AMOUNT)).Locked = False
  22.   'блокируем лист
  23.   theSheet.Protect
  24. End Sub



Интересно, что Excel помнит, какой диапазон был разблокирован в последнем сеансе, поэтому старый диапазон приходится блокировать снова. Этот момент я ещё сам не совсем понял. Однако, факт есть факт.

P.S. Оукенбаха читайте, рекомендую ;)

Ответить

Номер ответа: 2
Автор ответа:
 oleg



Вопросов: 12
Ответов: 23
 Профиль | | #2 Добавлено: 09.12.08 08:48
Большое спасибо за помощь. Код работает отлично. Конечно для меня он ВЫСШИЙ ПИЛОТАЖ. Как это не странно, но народ в Excele разбирается очень слабо, настоящих специалистов днем с огнем. Поэтому вдвойне приятно, что нашел ВАШ форум и людей, которые не чураются общаться с ламерами как я. Еще раз спасибо.

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам