2017-10-17 11 views
0

J'ai 5 colonnes différentes dans ma feuille Excel et chacune a des règles de validation de données distinctes. Mes règles fonctionnent lorsque l'utilisateur entre manuellement au clavier.
Mais, lors de la copie de données collées à partir de sources différentes comme notepad, one note etc ma validation ne fonctionne pas. Seulement cela fonctionne quand vous cliquez sur le cell individuellement.
Exemple: Mes colonnes sont comme, Name, Employee ID, Plan ID, Client Name, Email ID etcComment la validation des données fonctionne-t-elle dans Excel lorsque vous copiez/collez des données provenant de différentes sources?

je besoin d'une sorte de VBA ou d'une formule où ma validation de données fonctionne automatiquement lorsque les données copier/coller utilisateur de source différente.

+0

Voir ici pour un exemple où un message est affiché si les règles vont être remplacées https://stackoverflow.com/questions/29386971/force-pasted-values-to-obey-data-validation-rules – QHarr

Répondre

0

Oui, j'ai rencontré le même problème. Je l'ai résolu en bloquant le collage du tout. Dans le module I un code:

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 

Ensuite, dans le code de feuille de calcul, j'ai mis:

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 

Comme vous pouvez le voir, je barre de formule désactivée également pour empêcher la copie de l'utilisateur directement dans ce . Ça marche pour moi.

+0

Merci pour vos entrées. –

+0

Corrigez-moi si j'ai raté quelque chose. Vous m'avez fourni la solution pour empêcher le copier/coller. Mais, mon exigence est de permettre à l'utilisateur de coller dans ma feuille validée à partir de différentes sources. L'utilisateur ne peut pas créer les enregistrements manuellement à chaque fois. Supposons que nous ayons plus de 1000 enregistrements extraits de la base de données ou de fichiers plats externes. L'utilisateur veut coller ces 1000 enregistrements dans ma feuille et veut valider. S'il vous plaît fournir une solution pour cela. –

+0

Cela dépend, de quel type de validation avez-vous besoin. Les données doivent-elles figurer dans n'importe quelle liste, ou être numériques et dans une certaine mesure, ou commencer par des majuscules ou quoi que ce soit. – MarcinSzaleniec

0

le sous-programme de vérification contre la liste, dans le module normal:

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 

et un autre pour vérifier, si la valeur insérée entre deux positions longues:

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 

Ensuite, une petite macro dans la feuille quand la validation doit être utilisée:

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 

Je suppose que la première colonne est pour être vérifier contre une liste, et le second doit être entre 1000000 et 9999999. Mais vous pouvez le modifier en conséquence. Comme vous pouvez le voir, je n'utilise pas la validation Excel - cela peut être écrasé par inadvertance par l'utilisateur lors du collage. J'ai fait des macros pour remplir une cellule non valide avec du jaune, mais vous pouvez l'ordonner en faisant autre chose. Je ne recommanderais pas msgbox si vous pensez que quelqu'un pourrait essayer de coller 1 000 ou plus de valeurs.