XL 2016 (RESOLU) Variable Tableau Données colonne en double

darkjedi

XLDnaute Nouveau
Bonsoir,

Je suis à la recherche d'une solution pour le problème qui se présente à moi.
J'aimerais vérifier dans 1 colonne définie d'une variable tableau que chaque valeur contenue dans cette colonne ne le soit qu'en double
Voici un début de code mais celui-ci fait ligne 1 avec ligne 2 ensuite ligne 3 avec la ligne 4 mais pas ligne 1 avec l'ensemble des lignes de l'array.
De plus cela ne prend en compte que si le témoin est seul et non s'il est répété plus de 2 fois.
La colonne F est la colonne à vérifier. La colonne J est le résultat attendu de la macro.
Merci pour votre aide.

Temoins en double.png


Voici le bout de code qu'il faut que je développe:
VB:
Option Explicit

Dim m As Integer
Dim dernLigneSerie As Long
Dim tabControleSerie() As Variant
Dim controleTemoinSerieDouble As Boolean

Sub VerifTemoinsEnDouble()

    'definition tableau SERIE
    dernLigneSerie = Range("F" & Rows.Count).End(xlUp).Row
    tabControleSerie = Sheets("Feuil1").Range("F2:J" & dernLigneSerie).Value
    
    For m = LBound(tabControleSerie, 1) To UBound(tabControleSerie, 1)
        controleTemoinSerieDouble = False
        If tabControleSerie(m, 1) = tabControleSerie(m + 1, 1) Then
            controleTemoinSerieDouble = True
            m = m + 1
        End If
        
        If controleTemoinSerieDouble = False Then
            tabControleSerie(m, 4) = "témoin seul"
        End If
    Next m
    
    'Transfère les éléments du tableau dans la feuille de calcul
    Sheets("Feuil2").Range("A16").Resize(UBound(tabControleSerie, 1), UBound(tabControleSerie, 2)) = tabControleSerie
    
End Sub
 

Pièces jointes

  • TEST SMRI-verifTemoinsEn doubles.xlsm
    24.5 KB · Affichages: 7

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonsoir @darkjedi,

Je ne suis pas certain d’avoir tout compris au niveau présentation des résultats.
Cliquez sur le bouton Hop ! Le code est dans Module1 :
Code:
Sub NbrTemoin()
Dim t, derlig&, i&, d

With Sheets("Feuil1")
   If .FilterMode Then .ShowAllData
   derlig = .Cells(.Rows.Count, "f").End(xlUp).Row
   t = .Range("f2:i" & derlig)
End With

ReDim Preserve t(1 To UBound(t), 1 To UBound(t, 2) + 1)
Set d = CreateObject("scripting.dictionary")
d.CompareMode = TextCompare

For i = 1 To UBound(t): d(t(i, 1)) = d(t(i, 1)) + 1: Next
For i = 1 To UBound(t)
   If d(t(i, 1)) = 1 Then
      t(i, UBound(t, 2)) = "témoin seul"
   ElseIf d(t(i, 1)) > 2 Then
      t(i, UBound(t, 2)) = "nb temoins >2"
   End If
Next i
 
With Sheets("Feuil2")
   derlig = .Cells(16, "a").End(xlDown).Row
   .Range("a16:e" & derlig).ClearContents
   .Range("a16").Resize(UBound(t), UBound(t, 2)) = t
   .Activate
End With
 
End Sub
 

Pièces jointes

  • darkjedi- compter doublons- v1.xlsm
    25.3 KB · Affichages: 9
Dernière édition:

darkjedi

XLDnaute Nouveau
Bonjour @mapomme,

Le code fonctionne très bien. Il me donne le résultat désiré. Et je te remercie.:)
Je ne connaissais pas le comparemode du dictionnaire.
Mais dans VBA, je préfère que mes déclarations de variables soient obligatoires. En le faisant, je suis obligé de modifier cette ligne pour que le mode de comparaison du dico fonctionne.
avant:
VB:
d.CompareMode = TextCompare
après:
Code:
d.CompareMode = vbTextCompare

Dans ton code je ne comprends pas très bien des ligne de code.
Pourrais tu m'expliquer ce que cela fait?
Code:
ReDim Preserve t(1 To UBound(t), 1 To UBound(t, 2) + 1)
Code:
For i = 1 To UBound(t): d(t(i, 1)) = d(t(i, 1)) + 1: Next

Je vais pouvoir m'inspirer de ton travail pour comparer les valeurs de mes témoins en double 2 à 2 pour vérifier qu'il n'y a pas d’écart supérieure à 0.3 entre eux.
Ou bien est-il possible de l'effectuer dans cette même routine car les témoins en doubles sont déjà marqués ?
Encore une fois merci
 

mapomme

XLDnaute Barbatruc
Supporter XLD
Bonjour @darkjedi :)

Mais dans VBA, je préfère que mes déclarations de variables soient obligatoires.
Et elle sert à quoi l'instruction "Option Explicit" en début de mon code de Module1 ??

On ne déclare des variables dans un module hors des fonctions ou procédures que si elles sont communes à plusieurs procédures ou fonctions.

d.CompareMode = vbTextCompare
Rien à voir avec la déclaration ou non des variables.
TextCompare fonctionnait chez moi car j'avais référencé directement dans VBE la bibliothèque "Microsoft Scripting Runtime" (qui contient la définition du dictionary et des ses constantes dont TextCompare).
Il vaut mieux utiliser, comme tu l'a fait "vbTextCompare" qui marche dans tous les cas.
 
Dernière édition:

darkjedi

XLDnaute Nouveau
Bonjour@mapomme,

En effet, je n'avais pas téléchargé le fichier. J'avais simplement recopié ton code et collé dans un module.
Moi qui déclarait toutes mes variables au début du code même si elles n'étaient utilisées que dans 1 routine, je me suis bien trompé.:confused:
Et il est vrai que dans le fichier original, la bibliothèque "Microsoft Scripting Runtime" n'est pas active.
En tout cas cette constante comparemode est vraiment top.
En ayant pas mal de soucis avec les différentes versions d'Excel au travail dans le code, j’intègre souvent le vbxxx ou vba.xxx. Est-ce correct ? Je ne maitrise pas assez le sujet.

Pour la question subsidiaire, j'aimerai comparer les valeurs de chaque témoin qui sont en double entre eux. Pour les autres cas, on ne fait rien car il y a déjà 1 problème.
Et ainsi cela me permettra de vérifier que l'écart entre les 2 valeurs ne soit pas supérieur à 0.30.
Mes 2 valeurs de témoins peuvent être positives ensemble ou négatives ensemble ou l'une positive et l'autre négative.
Donc en tenant compte de la colonne F, si les témoins sont en double, on fait le calcul avec leurs valeurs de la colonne G et on vérifie l’écart.
Je vous remercie pour le temps consacré à cette recherche.
Capture d’écran (11).png
 

darkjedi

XLDnaute Nouveau
Bonsoir @mapomme, @patricktoulon

Je ferais un test durant le week-end. Et je ferais le retour. Mais je suis certain que cela sera bon.
:)
@patricktoulon:
Le système de formule sur la feuille n'est pas le but recherché car avec ce qui est mis en place ici, je vais modifier le fichier modèle machine pour intégrer toutes ces évolutions. Cela permettra de valider une série rapidement. Ensuite tout ceci est ventilé sur d'autres fichiers (résultat ou carte de contrôle) avec ADO.
Bon week-end à vous
 

Discussions similaires

Membres actuellement en ligne

Statistiques des forums

Discussions
312 104
Messages
2 085 349
Membres
102 869
dernier inscrit
radyreth