2017-10-17 5 views
0

Excel 시트에 5 개의 다른 열이 있고 각각에 별도의 데이터 유효성 검사 규칙이 있습니다. 내 규칙은 사용자가 키보드를 통해 직접 입력 할 때 작동합니다.
그러나 다른 소스 (예 : notepad, one note 등)의 데이터를 복사하여 복사하는 동안 내 유효성 검사가 작동하지 않습니다. 개별적으로 cell을 클릭하면 작동합니다.
예 : 내 열 Name, Employee ID, Plan ID, Client Name, Email ID다른 원본의 데이터를 복사/붙여 넣기 할 때 데이터 유효성 검사가 Excel에서 작동하는 방법

처럼 내 데이터 유효성 검사가 자동으로 작동 일부 VBA의 종류 또는 공식을 필요로 할 때 사용자 복사/다른 소스에서 붙여 넣기 데이터입니다.

+0

규칙을 덮어 쓸 경우 메시지가 표시되는 예는 여기를 참고하십시오. https://stackoverflow.com/questions/29386971/force-pasted-values-to-obey-data-validation-rules – QHarr

답변

0

예, 동일한 문제가 발생했습니다. 붙여 넣기를 전혀하지 않아서 해결했습니다. 당신이 볼 수 있듯이, 나는 또한 그것으로 직접 사용자의 복사를 방지하기 위해 장애인 수식 입력 줄을

Private Sub Worksheet_Activate() 
    Application.DisplayFormulaBar = False 
End Sub 

Private Sub Worksheet_Change(ByVal Target As Range) 
    NotAllowPaste 
End Sub 

Private Sub Worksheet_Deactivate() 
    Application.DisplayFormulaBar = True 
End Sub 

:

Sub NotAllowPaste() 
Dim UndoList As String 
If ThisWorkbook.Name <> ActiveWorkbook.Name Then Exit Sub 
With Application 
    .EnableEvents = False 
    UndoList = .CommandBars("Standard").Controls("&Undo").List(1) 
    If InStr(UndoList, "Paste") > 0 Or _ 
    UndoList = "Keep Source Formatting" Or _ 
    UndoList = "Drag and Drop" Then 
     .Undo 
     MsgBox "Pasting and ""drag and drop"" is forbidden in this workbook.", vbCritical 
    End If 
    .EnableEvents = True 
End With 
End Sub 

그런 다음, 워크 시트 코드에서 내가 넣어 가지고 : 모듈에서 나는 코드가 . 그것은 나를 위해 작동합니다.

+0

감사합니다. 귀하의 의견. –

+0

나는 무엇이든 놓친 경우에 나를 정정하십시오. 당신들은 나에게 복사/붙여 넣기를 막기위한 해결책을 제공했습니다. 하지만, 내 요구 사항은 다른 소스에서 내 유효 시트에 붙여 넣을 수 있도록하는 것입니다. 사용자는 매번 수동으로 레코드를 생성 할 수 없습니다. 데이터베이스에서 또는 외부 플랫 파일에서 1000 개 이상의 레코드를 추출했다고 가정합니다. 사용자가이 1000 개의 레코드를 내 시트에 붙여넣고 유효성을 검사하려고합니다. 이에 대한 해결책을 제공해주십시오. –

+0

어떤 종류의 유효성 검사가 필요한지에 따라 다릅니다. 데이터는 모든 목록에 있거나 숫자 및 일부 범위이거나 대문자로 시작해야합니다. – MarcinSzaleniec

0

정상 모듈리스트에 대해 검사 루틴 value는 두 걷고 사이에 삽입하는 경우

Sub ListToCheck(rng As Range) 
Dim cl As Range 
Dim i As Integer 
Dim bMatch As Boolean 
Dim sListName As String 

sListName = "sheet2!MyList" 'change this accrording to your needs 
bMatch = False 

For Each cl In rng.Cells 
    With WorksheetFunction 
    For i = 1 To .CountA(Range("MyList")) 
     If cl.Value = .Index(Range(sListName), i) Then bMatch = True 
    Next i 
    End With 

    With cl.Interior 
    If bMatch Then 
     .ColorIndex = 0 
    Else 
     .Color = vbYellow 
    End If 
    End With 
    bMatch = False 
Next cl 

End Sub 

및 확인하기위한 또 다른 하나 다음에

Sub ValueToCheck(rng As Range, minV As Long, maxV As Long) 
Dim cl As Range 
Dim bOk As Boolean 

For Each cl In rng.Cells 
    With cl 
    If IsNumeric(.Value) Then 

     If .Value < minV Or .Value > maxV Then 
      .Interior.Color = vbYellow 
     Else 
      .Interior.ColorIndex = 0 
     End If 
    Else 
     .Interior.Color = vbYellow 
    End If 
    End With 
Next cl 
End Sub 

그리고, 작은 매크로 시트 : 유효성 검사가 사용될 때 :

Private Sub Worksheet_Change(ByVal Target As Range) 
Dim col As Range 
Dim colAdr As String 

For Each col In Target.Columns 
    colAdr = col.Address(ReferenceStyle:=xlR1C1) 
    Select Case Right(colAdr, Len(colAdr) - InStrRev(colAdr, "C")) 
     Case Is = 1 
      ListToCheck col 
     Case Is = 2 
      ValueToCheck col, 1000000, 9999999 
     End Select 
Next col 
End Sub 

나는 첫 번째 열이 일부 목록에 대해 점검하고 두 번째는 1000000에서 9999999 사이가됩니다. 그러나이를 적절하게 수정할 수 있습니다. 보시다시피, 필자는 Excel 검증을 사용하지 않습니다. 붙여 넣기 할 때 우연히 덮어 쓸 수 있습니다. 유효하지 않은 셀을 노란색으로 채우기 위해 매크로를 만들었지 만 다른 작업을 수행하도록 지시 할 수 있습니다. 누군가가 1 000 개 이상의 값을 붙여 넣으려고한다고 생각한다면 msgbox를 추천하지 않습니다.