Salut Mike, les gens du fil et le Forum...
Le copié collé fonctionne à condition que tu colles dans l'orde de saisie cellule par cellule, et évidemment pas un avec un tableau complet, ce que tu n'avais pas spécifié au départ.
On pourrait trafiquer la macro évènementielle avec le risque de mettre en péril son intégrité... mais étant donné que tu dis que c'est quelque chose de ponctuel, juste pour récupérer un tableau existant... Tu as deux solutions ...
Une première toute simple, tu mixtes les formules qui t'ont été proposées soit ci-dessus par Jean-Marie soit dans Lien supprimé par LaurentTBT.
Ces formules auront l'avantage de mettre à jour la feuille... Puis tu fais un copié/collé "Valeur Seule" sur la plage H2:J300.....Ensuite la Macro évènemetielle gérera la feuille normalement, même en cas de changement dans les plages déjà remplies... Dans cette hypothèse je te conseille la Macro de Laurent qui, elle, permet de compléter des test avec les If si la Colonne B(x) est vide et pas les autres (etc comme je fais par macro), chose que ne fait pas NBVal.
Maintenant la seconde solution, si tu veux tout faire par VBA, il ne faut donc pas traffiquer la macro évènementielle qui est donc prévue pour un "Watching" pendant la saisie. Il faut juste faire tourner une boucle après avoir importé tes données par copié/collé...
Voici une boucle qui analysera tous les cas de figure et te fera une liste des anomalies...
Sub BouclePourCopierColler()
Dim Plage As Range, Cell As Range
Dim CareVide As Integer
Dim Msg As String
Set Plage = Sheets("Feuil1").Range("B2:B300")
For Each Cell In Plage
'Cas cellule B(x) vide => on vide tout:
If IsEmpty(Cell) Then
Range(Cell.Offset(0, 6), Cell.Offset(0, 8)) = ""
'Cas cellule C(x) vide mais pas D(x) => on vide tout
ElseIf IsEmpty(Cell.Offset(0, 1)) And Not IsEmpty(Cell.Offset(0, 2)) Then
Range(Cell.Offset(0, 6), Cell.Offset(0, 8)) = ""
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf
Else
'Une fois les tests faits.... Maintenant on remplit
'Cas Cellule C(x) vide, donc seule B(x) remplie => 1
If IsEmpty(Cell.Offset(0, 1)) Then Cell.Offset(0, 6) = 1
'Cas Cellule D(x) vide, donc seule B(x) et C(x) remplies => 2
If IsEmpty(Cell.Offset(0, 2)) Then Cell.Offset(0, 7) = 2
'Cas Cellule D(x) remplie, et donc B(x) et C(x) remplies => 3
If Not IsEmpty(Cell.Offset(0, 2)) Then Cell.Offset(0, 8) = 3
End If
'ici pour le message only
'Cas cellule B(x) vide mais pas C(x) on Comptabilise l'erreur (déjà vidé par first If)
If IsEmpty(Cell) And Not IsEmpty(Cell.Offset(0, 1)) Then
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf
End If
'Cas cellule B(x) vide mais pas D(x) on Comptabilise l'erreur (déjà vidé par first If)
If IsEmpty(Cell) And Not IsEmpty(Cell.Offset(0, 2)) Then
CareVide = CareVide + 1: Msg = Msg & Cell.Address & vbCrLf
End If
Next Cell
If CareVide > 0 Then
MsgBox "Des anomalies on été constatées : " & vbCrLf & _
"Nombre de Lignes Comportant des Trous : " & CareVide & vbCrLf & vbCrLf & Msg, vbInformation, "Warning"
End If
End Sub
Grosso Modo, tu pourras être tranquille avec çà... Ensuite la Macro Evènementielle sur Change dans les colonnes B à D prendra le relais.
Bon Dimanche à tous et toutes
@+Thierry
[/i]PS : Pas trop chaud à Amien ?[/i]