Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - VBA

Страница: 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

Ответить

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

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



Вопросов: 23
Ответов: 417
 Профиль | | #1 Добавлено: 12.12.08 13:21
Сразу вопрос: А в тех столбцах, что не блокируются, даты точно формата даты, а не что-нибудь еще ?

Ответить

Номер ответа: 2
Автор ответа:
 mc-black



ICQ: 308-534-060 

Вопросов: 20
Ответов: 1860
 Web-сайт: mc-black.narod.ru/dzp.htm
 Профиль | | #2
Добавлено: 12.12.08 14:44
Подойдите со стороны трассировки кода макроса, а там уже станет ясно, в каком именно месте программа не делает то, что нужно. Ставите точки останова (breakpoints), запускаете по F9, затем трассируете пошагово по F8. В промежутках можете смотреть значения переменных или выводить значения выражекний в окне Immediate. Удачи!

Ответить

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



Вопросов: 12
Ответов: 23
 Профиль | | #3 Добавлено: 12.12.08 17:50
Немного наоборот, блокируются лишние столбцы с датой равной текущей, а формат столбцов одинаков, "дата".

Ответить

Номер ответа: 4
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #4 Добавлено: 12.12.08 19:31
Можешь выслать пример файла на z_e_s@mail.ru ?

Ответить

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



Вопросов: 12
Ответов: 23
 Профиль | | #5 Добавлено: 12.12.08 19:46
Теперь только в понедельник. Можно?

Ответить

Номер ответа: 6
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #6 Добавлено: 12.12.08 20:01
Если файл не секретный, можно. :-)
Только дай свой адрес, а то буду на работе, там нет доступа к майлу. :-(

Ответить

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



Вопросов: 18
Ответов: 186
 Профиль | | #7 Добавлено: 12.12.08 23:51
Да тут я уже :). Дело в том, что мой код не был продуман для повторяющихся дат. Чтобы всё работало, необходимо добавить третий параметр функции MATCH, равный нулю:
  1. Option Explicit
  2.  
  3. Dim ROWS_AMOUNT As Long 'общее количество строк
  4. Dim COLUMNS_AMOUNT As Integer 'общее количество колонок
  5.  
  6. Sub BlockEarlierDates(theSheetName As String, theRow As String)
  7.   Dim todayColumn As Integer 'номер колонки с сегодняшней датой
  8.   Dim theSheet As Worksheet  'рабочий лист
  9.  
  10.   'запоминаем рабочий лист
  11.    Set theSheet = ThisWorkbook.Worksheets(theSheetName)
  12.   'вычисляем колонку с сегодняшней датой
  13.   todayColumn = CInt(Application.Evaluate("MATCH(TODAY(), " & theSheet.Name & "!" & theRow & ", 0)"))
  14.   Debug.Print todayColumn
  15.   'разблокируем лист
  16.   theSheet.Unprotect
  17.   'блокируем предыдущие даты
  18.   Range(theSheet.Cells(1, 1), theSheet.Cells(ROWS_AMOUNT, todayColumn - 1)).Locked = True
  19.   'разблокируем сегодняшнюю и последующие даты
  20.   Range(theSheet.Cells(1, todayColumn), theSheet.Cells(ROWS_AMOUNT, COLUMNS_AMOUNT)).Locked = False
  21.   'блокируем лист
  22.   theSheet.Protect
  23. End Sub
  24.  
  25. Private Sub Workbook_open()
  26.   
  27.   ROWS_AMOUNT = Rows.Count
  28.   COLUMNS_AMOUNT = Columns.Count
  29.  
  30.   BlockEarlierDates "лист1", "23:23"
  31.   BlockEarlierDates "лист2", "1:1"
  32.   
  33.   Worksheets("лист1").ScrollArea = "a25:iv33"
  34. End Sub

Ответить

Номер ответа: 8
Автор ответа:
 Jasmin



Вопросов: 23
Ответов: 417
 Профиль | | #8 Добавлено: 15.12.08 07:12
Оооо, автор появился. Сразу понял что, куда и посоветовал как исправить. :-)

Ответить

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



Вопросов: 12
Ответов: 23
 Профиль | | #9 Добавлено: 15.12.08 11:24
Большое спасибо всем за помощь. Подход NYTROGENа к решению проблемы настолько универсален, что нет слов. Просто супер. Спасибо!!!!

Ответить

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



Вопросов: 18
Ответов: 186
 Профиль | | #10 Добавлено: 15.12.08 16:05
Спасибо, стараюсь =)

Ответить

Страница: 1 |

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



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