2017-10-17 133 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

是的,我遇到了同樣的問題。我通過阻止粘貼來解決它。在該模塊中我有一個代碼:

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 

然後,在工作表中的代碼,我已經把:

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 

正如你所看到的,我已禁用公式欄還可以防止用戶直接複製到它。這個對我有用。

+0

感謝你的投入。 –

+0

如果我錯過了任何東西,請糾正我。你們爲我提供了防止複製/粘貼的解決方案。但是,我的要求是允許用戶粘貼來自不同來源的經過驗證的工作表。用戶不能每次都手動創建記錄。假設我們有從數據庫或外部平面文件中提取的1000多條記錄。用戶想要將這1000條記錄粘貼在我的工作表中,並希望驗證。請爲此提供任何解決方案。 –

+0

這取決於您需要什麼樣的驗證。數據應該放在任何列表中,或者是數字,在某個範圍內,或者以大寫字母開頭,或者其他什麼。 – MarcinSzaleniec

0

子程序檢查對列表中,正常的模塊中:

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。