2016-07-01 1 views
0

Я очень новичок в коде VBA. Теперь мне было поручено выполнить задачу, которая проверяет данные на листах excel.Как заблокировать ячейку на основе значения другой ячейки и выполнить проверку данных

Например, в моем Столбец У меня есть раскрывающееся меню, которое позволяет пользователю делать выбор между «Да» или «Нет».

  • Если пользователь выбрал «Да», ячейки в столбце B и столбце C будут отмечены как обязательные и не могут быть пустыми. Я хочу поставить на это ошибку проверки.

    **Example 1: If A1 and A30 == YES** 
    
    • B1 и C1, B30 и C30 являются обязательными

    • заполнит цвет обязательных элементов и удалить цвет заливки, когда клетки имеют ценность уже

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

      Пример 2: Если A99 == НЕТ

    • B99 будут заблокированы, и пользователь не будет иметь возможность вводить данные на этой ячейке. Возможно, что мы можем добавить значение ячейки как «NA», чтобы избежать путаницы

я смог захватить это с помощью проверки данных и условного форматирования. Тем не менее, я не могу выполнять заблокированные функции, так как в ходе исследования мне нужен код VBA для этого.

+0

Я думаю, что вы сможете сделать это с помощью логики в валидации ... –

+0

Возможно, вы найдете [вопрос полезным] (http://stackoverflow.com/questions/3037400/how-to-lock-the -data-в-клетка-в-Excel-используя-VBA). TL; DR: 'ActiveSheet.Protect' будет блокировать рабочий лист. 'Range (« A1: D5 »). Locked = False' устанавливает расхождения в блокировку. Наконец, 'ActiveSheet.Unprotect' восстанавливает доступ для чтения/записи. –

ответ

1

Что-то вроде этого должно работать.

Поместите его в модуль кода для листа, к которому вы хотите применить его.

Private Sub worksheet_change(ByVal target As Range) 

    ''''' CHECK IF THE CHANGED CELL IS IN RANGE A1:A99 (OR ANY OTHER RANGE YOU DEFINE) 
    If Not Intersect(target, Range("A1:A99")) Is Nothing Then 

     ''''' UNPROTECT THE SHEET 
     ActiveSheet.Unprotect 

     ''''' IF THE CELL CHANGED IS NOW 'YES' 
     If target = "Yes" Then 

      ''''' WE DEFINE HOW MANY COLUMNS TO MOVE ACROSS FROM THE CELL THAT CHANGED AND DO THE ACTIONS IN THE CODE BELOW 
      ''''' SO IN THIS EXAMPLE WE'RE MOVING ACROSS 1 CELL TO B1 AND THEN 2 CELLS TO C1 
      ''''' SO TO GET TO AA1 AND AB2 WE'D DO i = 26 to 27 
      ''''' IF WE WANTED TO ACCESS AA1 ALL THE WAY THROUGH TO AZ1 WE'D DO i = 26 to 51 
      For i = 1 To 2 

       ''''' MOVE ACROSS i NUMBER OF CELLS FROM THE CELL THAT CHANGED 
       With target.Offset(0, i) 

        ''''' UNLOCK THE CELL 
        .Locked = False 

        '''''SET THE CONDITIONAL FORMATTING 
        .FormatConditions.Add Type:=xlExpression, Formula1:="=ISBLANK(" & target.Offset(0, i).Address & ")" 
        With .FormatConditions(.FormatConditions.Count) 
         .SetFirstPriority 
         .Interior.ColorIndex = 37 
        End With 

       End With 

      ''''' INCREASE i BY 1 AND LOOP TO AFFECT THE NEXT CELL 
      Next i 

     ''''' IF THE CELL CHANGED IS NOW 'NO' 
     ElseIf target = "No" Then 

      ''''' WE DEFINE HOW MANY COLUMNS TO MOVE ACROSS FROM THE CELL THAT CHANGED AND DO THE ACTIONS IN THE CODE BELOW 
      For i = 1 To 2 

       ''''' MOVE ACROSS i NUMBER OF CELLS FROM THE CELL THAT CHANGED 
       With target.Offset(0, i) 

        ''''' SET THE CELL VALUE TO BLANK 
        .Value = "" 

        ''''' LOCK THE CELL 
        .Locked = True 

        ''''' REMOVE THE CONDITIONAL FORMATTING 
        .FormatConditions.Delete 

         ''''' ADD NEW CONDITIONAL FORMATTING HERE IF REQUIRED 

       End With 

      ''''' INCREASE i BY 1 AND LOOP TO AFFECT THE NEXT CELL 
      Next i 

     End If 

     '''''PROTECT THE SHEET 
     ActiveSheet.Protect 

    End If 

End Sub 

Обязательно установите заперта ложь в столбце А где падение вниз списки или пользователи не смогут изменить выпадающее значение в то время как лист заблокирован.

+0

Код работал, но, похоже, проблема. Сначала он работает, но когда я попробовал другой экземпляр в A2, он не будет работать и вызовет ошибку, которая также заблокирована этой ячейкой. – PeterS

+0

См. Мою записку в конце моего ответа. Столбец «А» заблокирован по умолчанию. Снять защиту с листа (на вкладке «Обзор» «Снять защиту»), затем выделить все ячейки, в которых выпадающие списки существуют в столбце A, и щелкнуть правой кнопкой мыши, форматировать ячейки, затем щелкнуть вкладку «Защита» и снять флажок «Заблокировано» –

+0

Спасибо! :), но что, если мне нужно указать другую ячейку? Например, я нажал «Да», тогда я хочу, чтобы другая ячейка, такая как AA1, AB2, была обязательной, а ячейки K1 и P1 были необязательными только с другим цветом в качестве индикатора для необязательного? – PeterS

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