(VBA) Contrôle parametrage

Hello le forum,

Comment puis-je faire pour faire un contrôle entre 2 feuilles sur 3 cellules "liées".

Je m'explique :

Dans mon cas j'ai des commerciaux qui sont rattachés à une sous division qui elle même est rattachée à une division.

Je veux créer une procédure pour faire un contrôle entre la feuille 1 et la feuille 2.

Si les 3 valeurs (liées) ne sont pas présente dans ma feuille2, je veux un message qui m'indique que ces valeurs ne sont pas dans ma feuille2.

Sachant que dans mon vrai fichier ma feuille 1 peut comporter plusieurs millier de lignes.

Merci pour votre aide

Bonsoir Rag02700,

Voici un fichier a essayer si cela convient a ta demande.

Pas de macro dans le fichier

Désolé je me suis tromper de fichier

Salut Florian53, Rag02700

Pas de macro dans le fichier

Désolé je me suis tromper de fichier

ça arrive

regarder cette proposition :

Private Sub CommandButton1_Click()
Dim drn1, drn2, i, j, c
drn1 = Sheets("Feuil1").Range("a" & Rows.Count).End(xlUp).Row
drn2 = Sheets("Feuil2").Range("a" & Rows.Count).End(xlUp).Row

tbl1 = Sheets("Feuil1").Range("a" & 1 & ":c" & drn1)
tbl2 = Sheets("Feuil2").Range("a" & 1 & ":c" & drn2)

For i = 1 To UBound(tbl1)
c = 0
For j = 1 To UBound(tbl2)
If tbl1(i, 1) & tbl1(i, 2) & tbl1(i, 3) _
= tbl2(j, 1) & tbl2(j, 2) & tbl2(j, 3) Then
c = c + 1
End If
Next

If c = 0 Then
rslt = rslt & "-" & tbl1(i, 1) & " " & tbl1(i, 2) & " " & tbl1(i, 3)
Sheets("Feuil1").Range("a" & i & ":c" & i).Interior.ColorIndex = 4
End If
Next
MsgBox "ces divisions sont absents sur la Feuil2" & rslt

End Sub

Edit = Sheets("Feuil1").Range("a" & i & ":c" & i).Interior.ColorIndex = 4

Hello ,

Merci pour vos réponses et solutions

@ Florian53 je ne comprends pas comment fonctionne ton code ???

J'utilise pas trop l’événement SelectionChange... Tu peux me rafraîchir la mémoire stp pour mon cas ?

Merci.

Bonsoir Rag02700,

L'objectif de worksheet_selection change est de lancer le code qui se trouve à l'intérieur de celui ci quand on modifie une cellule dans la feuille concernée.

Et pour éviter des déclenchements intempestifs de cette macro on cerne une plage de cellule pour ne lancer cette procédure que quand un clic intervient dans cette plage de cellule ( avec la méthode intersect)

On peut traduire cette ligne de programmation par :

Si la cellule active n'est pas dans la plage de cellule ( X) alors rien ( fin de procédure) sinon on parcourt le reste de la procédure.

Sans cette méthode ( intersect), le moindre changement dans n'importe quelle cellule de la feuille activerait cette procédure, qui dans ce cas est inutile.

J' espére que mes explications ton suffit pour comprendre le fonctionnement.

Oui c'est clair.

En revanche, si j'ajoute une ligne dans la feuille 1 (dans mon cas ligne 4 ) avec une nouvelle division sous div et commercial qui n'est pas présente dans la feuille 2 je n'ai pas le message...

Obligé d'ajouter une ligne avant la ligne 3 ?

Le code dispose d'une variable "derlgn" qui calcul automatiquement la dernière cellule non vide de la colonne "A" ensuite cette variable est utilisé dans la condition " intersect".

Le code s exécutera lorsqu'un clic interviendra dans la plage " A1:C" & derlgn.

Donc tu peux écrire en dessous de la ligne 3, le code fonctionnera pour toutes les autres lignes.

Hello AMIR,

Ton code est top ... Juste une petite évolution :

Comment je peux faire un " supprimer les doublons" dans mon msgbox ?

Je veux que toutes les cellules non présentes dans feuille2 soient toutes en vert dans feuille1 mais le msgbox pour + de lisibilité avoir juste une ligne et pas toutes les lignes de la même valeur.

Tu peux m'expliquer cette ligne de code stp :

rslt = rslt & "-" & tbl1(i, 1) & " " & tbl1(i, 2) & " " & tbl1(i, 3) & vbLf

C'est surtout au premier passage car la variable n'est pas déclarer et finalement au premier passage dans la condition rslt c'est vide ... enfin je me comprend Je comprends pas pourquoi au premier passage dans cette condition tu n'as pas d'erreur en fait ...

Merci a toi

Bonsoir Rag02700 et Amir,

Les variables non initialisée :

  • de type integer prennent par défaut la valeur "0"
  • de type string prennent par défaut la valeur "" (vide)

Ok

J'ai compris Merci

et du coup pour avoir simplement une seule ligne par valeur dans le msgbox ? Pas possible peut-être ...

Salut

Peut être tu parles de ça:

rslt = rslt & vbLf & tbl1(i, 1) & " " & tbl1(i, 2) & " " & tbl1(i, 3)

Hello,

Je ne pense pas ( j'ai pas encore testé) car vblf c'est pour un retour a la ligne ...

Mettre les erreurs dans un msgbox c'est une très bonne idée mais le problème c'est que si l'utilisateur entre un trio de donnée (division + sous division + commercial) faux (pas présent dans feuille2) j'ai les valeurs du trio dans un msgbox a la fin du programme. Jusque là pas de soucis.

Maintenant imaginons que dans ma feuille 1, j'ai 500 lignes et que l'utilisateur Indique un trio qui n'est pas dans ma feuille 2 150 fois. Je vais avoir mon msgbox d'erreur (super !) Mais avec 150 fois la même valeur ... Ce qui pour moi n'a pas d'intérêt... Le mieux c'est dans le msgbox d'avoir juste une fois le trio qui n'est pas bon pour + de lisibilité. Par contre on garde en vert les 150 valeurs en erreurs.

Est ce que on a une astuce pour faire ça ?

Merci.

Par exemple un :

rslr.removeduplicates

??

Salut

essayer ça :

6cparametre.xlsm (21.44 Ko)
Private Sub CommandButton1_Click()

Dim drn1%, drn2%, i%, j%
Dim d, prsnt As Boolean, str2 As String, str1 As String

Set d = CreateObject("Scripting.Dictionary")

drn1 = Sheets("Feuil1").Range("a" & Rows.Count).End(xlUp).Row
drn2 = Sheets("Feuil2").Range("a" & Rows.Count).End(xlUp).Row
Sheets("Feuil1").Range("a" & 1 & ":c" & drn1).Interior.ColorIndex = 2
tbl1 = Sheets("Feuil1").Range("a" & 1 & ":c" & drn1)
tbl2 = Sheets("Feuil2").Range("a" & 1 & ":c" & drn2)

For i = 1 To UBound(tbl1)
prsnt = False
For j = 1 To UBound(tbl2)
str1 = tbl1(i, 1) & tbl1(i, 2) & tbl1(i, 3)
str2 = tbl2(j, 1) & tbl2(j, 2) & tbl2(j, 3)
If str1 = str2 Then
prsnt = True
Exit For
End If
Next
If prsnt = False Then
Sheets("Feuil1").Range("a" & i & ":c" & i).Interior.ColorIndex = 4
If Not (d.Exists(str1)) Then
rslt = rslt & vbLf & tbl1(i, 1) & " " & tbl1(i, 2) & " " & tbl1(i, 3)
d.Add (str1), i
ListBox1.AddItem (str1)
End If
End If
Next
MsgBox "ces divisions sont absents sur la Feuil2 :" & rslt

End Sub

Hello,

C'est exactement ça ... Merci pour le boulot c'est top ...

Tu peux mettre des commentaire stp ?

J'ai du mal avec les booléens

Merci à toi.

Salut

L’utilisation de"Boolean" ici n est pas obligatoire :

C’est seulement une chose pour que le code sache qu’il passe la condition « condition est vraie)

Tu peux utiliser autre chose :

Dim  s As Integer
prsnt = False
--------------
-------------
For i = 1 To UBound(tbl1)
s = 0
---------------
If str1 = str2 Then
s = s + 1
Exit For
End If
Next
If s = 0 Then
---------------

est semblable a :

Dim  prsnt As Boolean
--------------
-------------
For i = 1 To UBound(tbl1)
prsnt = False
---------------
If str1 = str2 Then
prsnt = True
Exit For
End If
Next
If prsnt = False Then
---------------
Rechercher des sujets similaires à "vba controle parametrage"