Страница: 1 |
|
Вопрос: на листах книги макрос работает по разному, help
|
Добавлено: 12.12.08 11:38
|
|
Автор вопроса: oleg
|
Помогите понять в чем причина: с помощью NYTROGENa, спасибо ему, был написан код блокировки ячеек по определенной дате, я попытался его отладить на 2-х листах книги и на одном листе заблокировать положением курсора, чтобы сохранить формулы вне зависимости от наличия защиты листа. Вероятно было бы грамотнее присваивать свойства защищенности определенному диапазону, но пока еще плаваю в этом, поэтому пошел по такому пути. Но суть вопроса в другом: на каждом из листов присутствуют столбцы с несколькими одинаковыми датами, идущими подряд друг за другом, при этом на одном листе блокируются ячейки все ячейки с датой меньше текущей, а на другом блокируется столбец с одной из дат, равной текущей (в частности левый) а второй, третий не блокируется. Мозг закипает, не могу понять вообще с какой стороны подойти. Если есть возможность надоумьте пожалуйста. Спасибо!
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("лист1")
'вычисляем колонку с сегодняшней датой
todayColumn = CInt(Application.Evaluate("MATCH(TODAY(), " & theSheet.Name & "!23:23)"))
'разблокируем лист
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
ROWS_AMOUNT = Rows.Count
COLUMNS_AMOUNT = Columns.Count
'запоминаем рабочий лист
Set theSheet = ThisWorkbook.Worksheets("лист2")
'вычисляем колонку с сегодняшней датой
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
Worksheets("лист1").ScrollArea = "a25:iv33"
End Sub
Ответить
|
Номер ответа: 7 Автор ответа: Nytrogen
Вопросов: 18 Ответов: 186
|
Профиль | | #7
|
Добавлено: 12.12.08 23:51
|
Да тут я уже . Дело в том, что мой код не был продуман для повторяющихся дат. Чтобы всё работало, необходимо добавить третий параметр функции MATCH, равный нулю:
- Option Explicit
-
- Dim ROWS_AMOUNT As Long
- Dim COLUMNS_AMOUNT As Integer
-
- Sub BlockEarlierDates(theSheetName As String, theRow As String)
- Dim todayColumn As Integer
- Dim theSheet As Worksheet
-
-
- Set theSheet = ThisWorkbook.Worksheets(theSheetName)
-
- todayColumn = CInt(Application.Evaluate("MATCH(TODAY(), " & theSheet.Name & "!" & theRow & ", 0)"))
- Debug.Print todayColumn
-
- 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
-
- Private Sub Workbook_open()
-
- ROWS_AMOUNT = Rows.Count
- COLUMNS_AMOUNT = Columns.Count
-
- BlockEarlierDates "лист1", "23:23"
- BlockEarlierDates "лист2", "1:1"
-
- Worksheets("лист1").ScrollArea = "a25:iv33"
- End Sub
Ответить
|
Страница: 1 |
Поиск по форуму