2015-05-06 3 views
0

У меня есть электронная таблица, которая будет использоваться для управления документами и информацией, необходимой для различных проектов. Я хотел бы, чтобы некоторые из этих ячеек были окрашены и заблокированы в зависимости от информации, введенной в другую ячейку.Блокировка ячеек на основе критериев в других ячейках

Прежде чем я углубится в подробности, я должен упомянуть, что я совершенно не знаком с макросами и VBA, поэтому мои знания чрезвычайно просты. Эти столбцы могут быть изменены, поэтому в дополнение к коду я хотел бы знать, как я могу редактировать код, чтобы добавить дополнительные столбцы или как их удалить. Кроме того, у меня будет более 500 строк данных, к которым это нужно будет применить, и окончательный продукт будет защищен.

Я добавил ссылку на документ, который похож на тот, на котором я фактически работаю (из-за ограничений безопасности моей компании я не могу загрузить оригинал). Он есть условия, я в настоящее время нужно встретить:

  • Если “Single Source” выбран в колонке B, столбцы E-H и P-R должны быть заблокированы.
  • Если “≤ $50k” или “≤ $100k” указаны в колонке C в дополнение к “Single Source”, то столбец F будет заблокирован.
  • Выпадающий список в столбце C может измениться на ориентировочную цену, введенную вручную, поскольку текущие диапазоны могут быть изменены.
  • Если выбран в колонке B и если “≤ $50k” или “≤ $100k” выбирается в колонке C, столбцы P-R & AC нужно быть запертыми
  • Оба L5 & A5 сертификатов будут заблокированы, если колонок C находится под $2M
  • И L4 & A4 утверждения будут заблокированы, если столбец C находится под $1M
  • Оба L3 & A3 сертификатов будут заблокированы, если колонок C находится под $500k
  • Оба L2 & A2 сертификатов будут заблокированы, если колонок C находится под $50k
  • L2 & A2 утверждений никогда не будет заблокирован.

Любые коды, которые я нашел в Интернете до сих пор, не работали из-за моей неспособности успешно редактировать их для удовлетворения моих потребностей, поэтому любая помощь будет принята с благодарностью.

https://www.dropbox.com/s/9memoq1hcab2a4e/Document%20Control_Test.xlsm?dl=0

+0

Многие работодатели блокируют DropBox. Вы должны разместить соответствующий код в своем вопросе. –

+0

Пожалуйста, не используйте Excel таким образом, используйте «UserForm» вместо листа;). –

+0

Я могу попытаться опубликовать снимок экрана, но я не уверен, что вы подразумеваете под соответствующим кодом. Я не знаю, что такое UserForm. Я спросил своего босса, что он хотел, чтобы я создал это, и он специально сказал Excel. – Leigh598

ответ

0

Для справки UserForm представляет собой форму, VBA можно открыть, что работает вроде как облегченной версии приложения. Примером чего-то, что является UserForm (под обложками), является любое сообщение об ошибке, которое Excel когда-либо показывал вам. Вы можете создать свой собственный в Excel из окна Visual Studio for Applications.

Прежде чем перейти к тому, как вы хотите, вы упомянули, что хотите, чтобы колонка C была выпадающим списком, позволяющим вводить введенные пользователем значения. Таблицы Excel этого не позволяют. Это либо выпадающее, либо введенное пользователем значение, оно не может быть одновременно. Учитывая, что в некоторых случаях список опций может быть недостаточным, вы должны просто сделать его пользователем введенной ячейкой (т. Е. Нет ниспадающих вариантов), а затем проверить значения, введенные в ваш макрос.

Вы можете использовать прямые макросы, чтобы делать то, что вы хотите, и с учетом вашего комментария о изменчивости того, что должен делать код VBA, я буду еретиком и скажу, что это, вероятно, более удобный подход.

Чтобы сделать эту работу вам нужно изменить код листа, чтобы добавить обработчик событий, в частности, Worksheet_Change

Оттуда вы должны проверить, что клетка, которая изменила была клетка, которая должна вызывать макрос для запуска. Основываясь на данных, в вашем вопросе, вы будете хотеть искать ячейки в столбцах B & C, например, так

IF LEFT(Target.Address, 3) = "$B$" OR LEFT(Target.Address, 3) = "$C$" THEN 

В этот момент, вероятно, имеет смысл просто вызвать другую функцию, которая на самом деле делает тяжелые и передайте ему номер строки. Пример:

FormatMgmt(RIGHT(Target.Address, LEN(TARGET.Address) - 3), ActiveSheet.Name) 

Затем, чтобы дать вам пример, чтобы отработать, что должно дать вам представление о том, как сделать все, что вы перечислили

Sub FormatMgmt(rn as long, WSName as String) 
    ' 
    Dim ws As Worksheet 
    Set ws = ThisWorkbook.Worksheets(ActiveSheet.Name) 
    Dim CC As Range 
    Set CC = ws.Range("C" & rn) 'I'm using a variable to refer to column C since we'll 
     'need to use this cell quite a bit 

    Application.ScreenUpdating 'Prevent Excel from updating what's displayed on your 
     'computer monitor. This lets the macro run faster 

    'Determine what's in Column B for the identified row 
    Select Case LCase(ws.Range("B" & rn).Value) 'LCase forces all text to lower case, so 
     'that capitalization doesn't mess up the comparison 
     Case "single source" 
      'Protect Columns E-H & P-R 
      ws.Unprotect ("<whatever_your_password_is>") 'The password is optional, but 
       'you need to unlock the sheet to change whether cells are protected 

      ws.Range("E" & rn & ":H" & rn).Locked = True 

      'Check if column F needs locked. Note, you said if <=50k OR <=100k selected 
      'should do this. Since I'm assuming a user entered value, I have to take the 
      'tigher constraint 
      If CC.Value <= 50000 Then 
       'Lock column F. 
       ws.Range("F" & rn).Locked = True 
      End If 

      'Check if L3, L4, L5, A3, A4, or A5 need locked. Note: you're last bullet 
      'says A2 & L2 should never be locked, which contradicts the bullet 
      'immediately prior. I assumed the later bullet took precedence. Also, I 
      'assumed the conditions in the last 5 bullets stacked (i.e. CC < $500k means 
      'A3-A5 & L3-5 should be locked) 
      If CC.Value < 2000000 Then 
       ws.Range("L5").Locked = True 
       ws.Range("A5").Locked = True 
      End If 

      If CC.Value < 1000000 Then 
      '... 
      'Fill in the rest of the code here. You should have enough to start 
      '... 
      'NOTE: Be sure to put in appropriate logic to UNDO any of the cell locking 
      'if a cell's value changes as well 

     'Relock the sheet 
     WS.Protect"<whatever_your_password_is>") 

     'At the very end of the macro be sure to turn screen updating back on (no 
     'good doing all this if it doesn't show on the screen) 
     Application.ScreenUpdating = True 
End Sub 

Это должно быть достаточно, чтобы вы начали. Если нет, выполните поиск Google для более конкретной проблемы, и вы должны придумать ответ довольно быстро (так я узнал VBA, VB.net, C#, SQL и т. Д.)

Смежные вопросы