Condition si 2 colonnes ou plages de cellule sont identiques

Bonjour,

Je travaille sur un fichier Excel qui contient des données et formules de calcul dans une colonne pour obtenir un résultat.

J'ai créer une macro qui génère une feuille de résultat à partir des données de la colonne, elle est renommée selon certaines de ces données.
J'ai une seconde macro qui copie entièrement la colonne de calcul et la colle dans la colonne suivante.
Je change certaines données de cette seconde colonne et régénère une nouvelle feuille pour comparer les résultats.
Je peux, si besoin, réinsérer autant de colonne que de résultat nécessaire.

Je suis à la recherche d'un code qui vérifie qu'il n'y a pas 2 colonnes (ou plage de cellule) avec les mêmes données de calculs identiques dans ma feuille afin de générer une feuille de résultat uniquement si les données sont différentes.

Note : Je ne cherche pas a comparer et extraire les différences, ce que j'ai beaucoup trouvé dans mes recherches, mais uniquement a vérifier qu'il n'y a pas de colonne identique. (si il n'y as pas de colonne identique, je peux exécuter la suite de ma macro)

Merci d'avance pour votre aide

Bonjour,

Un fichier anonymisé serait le bien venu

En effet, c'est certainement plus parlant.

En effet, cela sera certainement plus parlant.

Ci joint une version allégée de mon fichier afin de cibler uniquement la partie concernée.
Les données initiales sont présentent dans la colonne "D:D", ou dans la plage "D4:D6"
En cliquant sur le bouton "Ajouter calcul", cela copie la dernière colonne où une valeur est présente en ligne 4 et la colle 2 colonnes plus loin. (une colonne entre les 2 pour plus de clarté)
Ce "copier-coller" peut être répété autant de fois qu'on a besoin de résultat.

Une seconde macro, non présente sur ce fichier, créée une feuille avec les données et le résultat t la nomme avec les valeurs de "longueur" et de "largueur". (ici 10 et 20)
Si des colonnes ont les mêmes valeurs, la macro ne fonctionnera pas car elle ne pourra pas renommer la nouvelle feuille avec un nom déjà existant.

Je cherche a vérifier que chaque colonne, ou plage de la ligne 4 à la ligne 6 de chaque colonne, soient différentes avant de lancer la 2nde macro de création de feuille.

Le fichier est simplifié, le nombre de donnée d'entrée et de formule est beaucoup plus conséquent mais la forme est la même.

Bonjour,

Je ne comprends pas très bien
Ta première macro recopie exactement la colonne D, 2 colonnes plus loin, autant de fois que tu cliques sur le bouton "Ajouter calcul"
Donc toutes tes colonnes contiendront les mêmes valeurs
Or tu dis

Si des colonnes ont les mêmes valeurs, la macro ne fonctionnera pas car elle ne pourra pas renommer la nouvelle feuille avec un nom déjà existant.

J'en déduis donc que ta macro ne fonctionnera jamais, ou alors je n'ai rien compris

Pardon, en effet j'ai oublié de préciser 😊

Une fois la colonne copiée, on modifie ses nouvelles valeurs longueur - largeur pour obtenir un nouveau résultat.
Dans ce cas, la 2nde macro se lancera correctement.

Mais comme le nombre de calcul (donc nombre de colonne) peut être important, il y a de forte chance pour pour qu'il y ai 2 calculs identiques.
Dans ce cas la macro ne fonctionnera pas.

Je rejoint mon fichier tel qu'il pourrait se présenter avec des données différentes en colonne F:F; H:H; L:L (OK) mais les données des colonnes D:D; J:J sont identiques (Nok).
C'est ce dernier point que je souhaite vérifier avant de lancer la 2nde macro

Re,

J'ai bien une solution en VBA mais elle ne me plaiit pas beaucoup, je suis sûr que l'on peut trouver mieux

Je calcule la différence entre le contenu des cellules des colonnes D, F, H, J et L. Avec une peite procédure je regarde si parmi ces différences il existe un "0". Si oui deux valeurs serait identiques donc on sort de cette procédure en précisant qu'on ne peu pas lancer la Macro 2

Méthode trop lourde et peu agréable, mais je ne vois pas, pour le moment, autre chose tout au mons en VBA. Avec des formules peut être ..... mais je ne manipule pas les formules

Bonjour,

Je me permet d'aider un peu.

En supposant que vous vouliez comparer toutes les colonnes entre elles (on parle uniquement des lignes 4 à 6).

En considérant une égalité seulement si les 3 lignes sont égales entre elles.

On peut sauvegarder dans la mémoire le tableau des valeurs en D4:D6 .... (étendu jusqu'au possible à droite) et on parcours ce tableau de gauche à droite, en comparant chaque colonne avec celles qui se trouvent à sa droite.

Mis en code, en se basant sur le dernier fichier joint, j'arrive à ceci :

Public Function VerifUnique() As Boolean
  Dim endCol As Long
  With ThisWorkbook.Worksheets("Tabelle1")
    endCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
  End With

  Dim tbl As Variant
  tbl = ThisWorkbook.Worksheets("Tabelle1").Range("D4").Resize(3, endCol - 3)
  tbl = WorksheetFunction.Transpose(tbl)

  Dim i As Long, j As Long, k As Long
  Dim myVals(1 To 3) As Double, nbIdq As Long
  For k = LBound(tbl, 1) To UBound(tbl, 1) Step 2
    ' sauvegarde col initiale
    For j = 1 To 3
        myVals(j) = CDbl(tbl(k, j))
    Next j
    ' parcours autres colonnes
    For i = k + 2 To UBound(tbl, 1) Step 2
      nbIdq = 0
      For j = 1 To 3
        nbIdq = nbIdq - 1 * (myVals(j) = CDbl(tbl(i, j)))
      Next j
      If nbIdq = 3 Then
        ' MsgBox "Les colonnes " & k & " et " & i & " sont identiques", vbCritical, "STOP"
        VerifUnique = False
        Exit Function
      End If
    Next i
  Next k

  VerifUnique = True
End Function

Il suffit d'écrire dans votre code un petit test d'appel à cette fonction, pour lancer la seconde macro

Sub test()
  If VerifUnique Then Macro2
End Sub

Bonsoir Saboh,

Tu me délivres d'une difficulté qui consiistait à comparer plusieurs cellules ensemble, c'est super.
Ne m'en sortant pas j'ai pensé à une astuce qui vaut ce qu'elle vaut : avec une MFC je penses colorier les doublons et ainsi pouvoir les repérer grâce au "Interior.Color" pour autoriser ou non, suivant leur existence, le lancement de la macro2
C'est un peu tiré par les cheveux et de plus je n'ai pas essayé.

Heureux de te retrouver sur le Forum et bien cordialement
Jacky

Salut @Jacky,

Oui c'est une approche possible, disons "visuelle" du problème. Si j'ai bien compris tu regarderai ensuite chaque colonne pour voir si elle a les 3 cellules colorées.

Mais sur la mise en place concrète je ne sais pas si c'est possible :

Car supposons l'exemple ci-dessous :

1

1

3

4

1

2

2

5

1

3

11

3

Si on regarde la 2e colonne : elle va avoir sa première cellule égale à celle de col1, sa 2e égale à celle de col3 et sa dernière égale à celle de col4. Donc elle sera toute colorée, pourtant elle n'est égale à aucune autre colonne.

C'est pour ça que je pense que la formule de MFC serait assez complexe, et donc "lourde" (les MFC sont recalculées à chaque modif du classeur). C'est pourquoi je suis parti sur un parcours du tableau "simple et logique" qui selon moi résout le problème de manière efficace.

En fait en "scannant" les colonnes de gauche à droite on est sûr de ne rien oublier (variable k allant de LBound(tbl, 1) à UBound(tbl, 1)), de ne rien calculer 2 fois (variable i allant de k+2 à UBound(tbl, 1)), et surtout il suffit de s'arrêter sur le 1er doublon (exit function) au lieu de finir le parcours.

Bonjour Saboh,

En effet mon idée ne convient pas car, comme tu le dis, des colonnes peuvent se colorer alors qu'elles sont différentes des autres, je n'avais pas vu cette précision qui fait que se servir des MFC ne peut convenir.
Comme je l'ai dit précédemment ta méthode est superbe et il fallaiit y penser ......

Au plaisir de te retrouver sur le Forum

Bonjour à tous les 2,

Merci pour tout vos retours, j'ai l'impression d'avoir lancer un sujet à réflexion 😉

J'ai testé le code de Saboh, c'est tout à fait ce que je recherche ! 👍
Ce code est bien au dessus de mon niveau en vba mais je comprend le principe.

Cependant, mon fichier final a 14 données à vérifier et la ca ne fonctionne plus.
J'ai modifié la plage de la variable myvals à (1 to 14) et le nombre de boucle de j à 14 mais une erreur s'affiche à la ligne myVals(j) = CDbl(tbl(k, j)

Public Function VerifUnique() As Boolean

  Dim endCol As Long
  With ThisWorkbook.Worksheets("Tabelle1")
    endCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
  End With

  Dim tbl As Variant
  tbl = ThisWorkbook.Worksheets("Tabelle1").Range("D4").Resize(3, endCol - 3)
  tbl = WorksheetFunction.Transpose(tbl)

  Dim i As Long, j As Long, k As Long
  Dim myVals(1 To 14) As Double, nbIdq As Long

  For k = LBound(tbl, 1) To UBound(tbl, 1) Step 2
    ' sauvegarde col initiale
    For j = 1 To 14
        myVals(j) = CDbl(tbl(k, j))
    Next j
    ' parcours autres colonnes
    For i = k + 2 To UBound(tbl, 1) Step 2
      nbIdq = 0
      For j = 1 To 14
        nbIdq = nbIdq - 1 * (myVals(j) = CDbl(tbl(i, j)))
      Next j
      If nbIdq = 14 Then
         MsgBox "Les colonnes " & k & " et " & i & " sont identiques", vbCritical, "STOP"
        VerifUnique = False
        Exit Function
      End If
    Next i
  Next k

  VerifUnique = True

End Function

Bonjour,

C'est parce que le tableau "tbl" doit aussi etre redimensionné. Vous aviez oubliez ce petit détail.

Pour faire plus simple je vous rajoute une variable du nombre de lignes (NB_LIGNES) en haut de la fonction, vous aurez simplement à la modifier si le nombre de lignes vient à varier.

J'ai un petit peu revu la définition du tableau en suivant le meme principe : si dans votre feuille D4 n'est pas la 1e cellule (haut gauche) du tableau, la modifier dans le With correspondant.

Public Function VerifUnique() As Boolean
  Dim NB_LIGNES As Long: NB_LIGNES = 14

  Dim endCol As Long, tbl As Variant
  With ThisWorkbook.Worksheets("Tabelle1")
    endCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
    With .Range("D4")
      tbl = .Resize(NB_LIGNES, endCol - .Column + 1)
    End With
  End With

  tbl = WorksheetFunction.Transpose(tbl)

  Dim i As Long, j As Long, k As Long, nbIdq As Long
  Dim myVals() As Double: ReDim myVals(1 To NB_LIGNES)

  For k = LBound(tbl, 1) To UBound(tbl, 1) Step 2
    ' sauvegarde col initiale
    For j = 1 To NB_LIGNES
        myVals(j) = CDbl(tbl(k, j))
    Next j
    ' parcours autres colonnes
    For i = k + 2 To UBound(tbl, 1) Step 2
      nbIdq = 0
      For j = 1 To NB_LIGNES
        nbIdq = nbIdq - 1 * (myVals(j) = CDbl(tbl(i, j)))
      Next j
      If nbIdq = NB_LIGNES Then
        ' MsgBox "Les colonnes " & k & " et " & i & " sont identiques", vbCritical, "STOP"
        VerifUnique = False
        Exit Function
      End If
    Next i
  Next k

  VerifUnique = True

End Function

C'est super Merci...sauf que certaines données sont de type "chaine"...j'ai omis de préciser ce point..

Du coup la 1ere boucle se stop dès qu'elle rencontre ce type de donnée, les variables des boucles étant de type long
exemple : boucle 6 (Seb) dans le Excel joint...

Oui c'est important ce genre de "détails"

Attention du coup car on doit travailler en Variant, et on n'a pas la main sur la méthode de comparaison des valeurs. Mais bon je pense que ça ne vous posera pas de problème, surtout si les valeurs sont bien définies (par ex. 0 et non pas 1e-14).

J'aime bien typer les variables le plus précisément possible, aussi parce que c'est plus efficace dans les calculs, mais des fois on a besoin de s'adapter.

Pour info si vous savez le faire, vous pourriez aussi essayer le type "String" au lieu de variant, mais vu qu'on travaille avec une majorité de nombres, j'aurai tendance à le déconseiller.

Public Function VerifUnique() As Boolean
  Dim NB_LIGNES As Long: NB_LIGNES = 14

  Dim endCol As Long, tbl As Variant
  With ThisWorkbook.Worksheets("Tabelle1")
    endCol = .Cells(4, .Columns.Count).End(xlToLeft).Column
    With .Range("D4")
      tbl = .Resize(NB_LIGNES, endCol - .Column + 1)
    End With
  End With

  tbl = WorksheetFunction.Transpose(tbl)

  Dim i As Long, j As Long, k As Long, nbIdq As Long
  Dim myVals() As Variant: ReDim myVals(1 To NB_LIGNES)

  For k = LBound(tbl, 1) To UBound(tbl, 1) Step 2
    ' sauvegarde col initiale
    For j = 1 To NB_LIGNES
        myVals(j) = tbl(k, j)
    Next j
    ' parcours autres colonnes
    For i = k + 2 To UBound(tbl, 1) Step 2
      nbIdq = 0
      For j = 1 To NB_LIGNES
        nbIdq = nbIdq - 1 * (myVals(j) = tbl(i, j))
      Next j
      If nbIdq = NB_LIGNES Then
        ' MsgBox "Les colonnes " & k & " et " & i & " sont identiques", vbCritical, "STOP"
        VerifUnique = False
        Exit Function
      End If
    Next i
  Next k

  VerifUnique = True

End Function

Oui sincèrement désolé d'avoir oublié ce point Je voulais faire un exemple au plus simple pour cibler le besoin et j'en ai oublié l'essentiel.

Autrement ca fonctionne, c'est nickel! Vous êtes très fort!
Merci pour ce code et toutes ces précisions, je ne m'en serais jamais sorti tout seul

Je vous en prie, merci pour votre retour. Bonne fin de journée.

Rechercher des sujets similaires à "condition colonnes plages identiques"