Comparer 43 colonnes d'un onglet avec un autre

Bonjour,

J'ai deux onglets dans mon Excel avec 1000 observations et 43 variables chacun. Ces variables sont binaires. Je cherche à comparer chacune des cases des deux onglets entre elles. Si les valeurs valent 1 alors je crée une nouvelle variable "cohérence" qui va compter le nombre de 1 pour chaque observation.

Sub macro____()

Dim actWs As Worksheet
Dim mstWs As Worksheet
Set actWs = ActiveSheet
Set mstWs = Sheets("Matrice")

'Dim u As Long
Dim i As Long
Dim c As Long

  For i = 1 To 43 ' pour chacune des colonnes
        For c = 1 To 1000 pour chaque ligne
            If actWs.Cells(i, c) = mstWs.Cells(i, c) Then

               Cells(c , i+44) = 1
            Next c
    Next i

End Sub

Je ne vois pas trop comment traduire cela en vba.

Bonjour,

Si j'ai compris ta question ...

Tu peux remplacer Cells(c , i+44) = 1

par

Cells(c , i+44) = Cells(c , i+44) + 1

En espèrant que cela t'aide ...

P.S. J'avoue que c pour Ligne et L pour Colonne ... c'est .... très rafraîchissant ...

Bonjour le forum,

Sauf erreur de ma part, le i et le c ne se trouve pas à la même place dans ces deux lignes de codes suivantes :

     If actWs.Cells(i, c) = mstWs.Cells(i, c) Then

et

 Cells(c , i+44) = 1

Et, sauf incompréhension de ma part (ce qui arrive souvent, genre très souvent) beh c'est pas normal

Cdlt,

Merci pour ta réponse James007. En fait je chercher à compter les cases qui ont matché entre elles (1 dans les même cases des 2 fichiers)et à mettre le résultat dans ma variable "cohérence".

Oui, je me suis un peu emmêler les pinceaux avec le nom des variables...

@VH_AE: Merci, je ne l'avais pas remarquer

En fait, mon problème est que je souhaite sommer dans ma colonne Cells(c, i + 44) toute les case qui ont été égale à 1 dans les deux fichiers .

Par exemple, à la ligne 1, on a eu sur les 43 colonnes, 27 qui ont des 1 aux même emplacement dans les deux onglets. Donc ma case "cohérence", me donne 27.

Sub macro____()

Dim actWs As Worksheet
Dim mstWs As Worksheet
Set actWs = ActiveSheet
Set mstWs = Sheets("Matrice")

'Dim u As Long
Dim i As Long
Dim c As Long

'For u = 2 To 10
    For i = 1 To 43
        For c = 1 To 2
            If actWs.Cells(c, i) = mstWs.Cells(c, i) Then
               Cells(c, i + 44) = Cells(c, i + 44) + 1

            End If
        Next c
    Next i
'Next u '
End Sub

Je pensais à sommer la valeur des deux case des deux fichiers dans la colonne c( i, c+ 44) et à diviser par deux

Sub macro____()

Dim actWs As Worksheet
Dim mstWs As Worksheet
Set actWs = ActiveSheet
Set mstWs = Sheets("Matrice")

'Dim u As Long
Dim i As Long
Dim c As Long

'For u = 2 To 10
    For i = 1 To 2
        For c = 1 To 43
            If actWs.Cells(i, c) = mstWs.Cells(i, c) Then
               'Cells(i, c) = Cells(i, c) + 1
               Cells(i, c + 44) = (actWs.Cells(i, c).Value + mstWs.Cells(i, c).Value) / 2
               Cells(i, c + 44) = Cells(i, c + 44) + 1

            End If
        Next c
    Next i
'Next u '
End Sub

Re,

Que donnent les différents tests que tu as effectués ...???

Hello,

Merci pour ta réponse. Comment dire les résultats ne sont pas ceux esperés...

Bonjour (..)

Comme je ne suis pas certain d'avoir compris le résultat espéré, voici une proposition qui traite ce que je crois en comprendre avec une approche "fonction" à mon avis beaucoup plus adaptée au problème que je pense avoir deviné tout en sachant que je peux toujours me tromper parce que l'erreur est humaine, mais jamais informatique. Les ordinateurs ne se trompent jamais se sont les hommes qui ne savent pas décrire à la machine le besoin comme il faut, et parfois même les hommes expriment le besoin dans la boule de cristal de James007, et comme je suis persuadé qu'elle n'est toujours pas réparée, sinon il serait le seul à répondre sur le forum, et encore vous ne poseriez plus de questions, puisqu'il trouverait les réponses avant même que les questions soient posées. Et d'ailleurs je ne vois pas (James) l'intérêt de faire réparer ta boule de cristal, parce que nous serions tous obligés d'attendre en face d'un forum totalement vide et inactif que tu casses encore (et enfin) ta boule de cristal...

Bref quelques explications sont dans le code (plus concises) et la syntaxe d'utilisation de cette "nouvelle fonction" est la suivante : =CompareLigne( selection ) où selection représente toutes les colonnes à comparer sur une ligne

Function CompareLigne(cel As Range)
Dim wsTest As Object
Dim wsMatrice As Object
Dim ligVerif, colVerif
Dim debVerif, finVerif
Dim cptVerif

   Application.Volatile    ' Pour rendre la fonction "avec caclul automatique"
    Set wsTest = Worksheets("Feuil1")       ' Feuille "source"
    Set wsMatrice = Worksheets("Matrice")   ' Feuille "matrice"

    ' La ligne à verifier est la ligne contenant la formule ET la meme dans les 2 onglets
    ligVerif = cel.Row
    ' debVerif est la premiere colonne à verifier,finVerif est la derniere
    debVerif = cel.Column
    finVerif = cel.Columns.Count

    ' Compteur à 0 (zero)
    cptVerif = 0

    ' Pour les 43 premieres colonnes
    For colVerif = debVerif To finVerif
        ' Si colonne 1 de [Feuil1] = colonne 1 de [Matrice] Alors une de plus !
        If wsTest.Cells(ligVerif, colVerif) = wsMatrice.Cells(ligVerif, colVerif) Then cptVerif = cptVerif + 1
    Next
    Set wsTest = Nothing
    Set wsMatrice = Nothing

    CompareLigne = cptVerif

End Function

@James007

ça c'est la tirade du forumeur cristalophobe


@xanadu31

Quelle est l'origine de ton pseudo ?

Bonjour NCC 1701,

Merci pour ta réponse (très matinale :p). J'aime beaucoup ton approche. Seulement, je ne suis pas sur de comprendre ce qui entre en paramètre de la fonction. Est-ce une ligne ou une colonne?

 

 ' Pour les 43 premieres colonnes
    For colVerif = debVerif To finVerif
        ' Si colonne 1 de [Feuil1] = colonne 1 de [Matrice] Alors une de plus ! 
        If wsTest.Cells(ligVerif, colVerif) = wsMatrice.Cells(ligVerif, colVerif) Then cptVerif = cptVerif + 1 ' En fait, je souhaiterais sommer pour chaque ligne toutes les cellules qui ont un 1 dans la feuille principale et dans la matrice.
    Next
    Set wsTest = Nothing
    Set wsMatrice = Nothing

    CompareLigne = cptVerif

Sur le pseudo, je suis un grand fan de Citizen Kane

Cdt,

(re)

Sur le pseudo d'abord... C'est une très bonne référence cinématographique effectivement !

Sais-tu que c'est aussi (et entre autres) la capitale d'été de Kubilai Khan, la résidence de Mandrake le Magicine et surtout le projet imaginé en 1965, qui peut être considéré comme l'ancêtre de l'hypertexte ?


Pour ce qui est du code proposé...

La fonction attend "l'ensemble des cellules qui doivent être comparées sur une même ligne"

Elle s'utilise donc une fonction =Somme(..) par exemple

La seule contrainte expliquée dans le code c'est "que la ligne et les colonnes doivent être les mêmes dans les 2 onglets" tu compares la 1ère ligne de la colonne 1 à 43 de l'onglet 1 avec la même ligne 1 de la colonne 1 à 43 de l'autre onglet...

Est-ce plus clair ?

(Re)

Ah, je suis content de voir que le forum est aussi fréquenté par des cinéphiles.

Il y aurait beaucoup à dire sur Kublakhan et plus encore sur Mandrake de magicien. Dans Doctor Strangelove de Kubrick par exemple, le capitaine Madrake, joué par Peter Sellers, ressemble comme deux gouttes d'eaux au magicien et le plus intérressant, est que Sellers à eu a joué le rôle du magicien au tout début de sa carrière.

Sur le code en lui même, en effet, cela marche j'obtient bien un total de 43 quand je sélectionne toute la plage.

Ceci étant, je souhaiterais que plutôt que de comparer les colonnes, je puisse le faire cellules par celule. Je m'explique ma matrice correspondra à chaque fois à une ligne générer après un filtre. Ce qui fait que j'aurais à chaque fois une ligne dans mon fichier matrice.

(re)

Commençons (comme toujours par le côté facile)... j'ai adoré aussi cette ressemblance, similitude (je ne sais pas comme dire) entre le Jeu Singulier de Sellers et la Folie douce de Mandrake...


Concernant ton "développement" je n'ai pas bien compris ta dernière remarque... Peux-tu développer ?

(re)

C'était vraiment un bon acteur. Dc Strangelove est un film que je ne peux me lasser de voir. Il est plein de clin d'œil comme celui-ci et certaine réplique sont culte. "My precious precious bodily fluids..."

23fichier-export.xlsm (366.09 Ko)

Sur mon post précédent, oui j'avoue qu'il n'est pas des plus clair. Dans le fichier en pièce jointe je donne un exemple du tableur sur lequel je travail.

Sur l'onglet "Feuil1", j'ai un colonne "message_c" avec différente valeurs puis mes 43 colonnes avec des 1 ou sans valeurs et enfin ma colonne "résultat".

Dans mon onglet 2 "Matrice", j'ai également une colonne "message_c" mais avec une valeur unique à chaque fois.

Ce que je souhaite faire, c'est pour chaque valeur de ma colonne "message_c" de ma Feuil1, je veux trouver la même valeur dans l'onglet "Matrice" puis comparer s'il y a correspondance entre les 1 de chaque lignes et calculer le nombre dans ma colonne "résultats"

Cdt,

(re)

C'est vrai que les allusions sont nombreuses, pour ma part malgré tout je n'ai pas tout à fait le même genre de référence... Je suis plutôt SF/Anticipation et parmi les films cultes je citerais Blade Runner qui est le film auquel il est fait le plus de référence...

PS/ Mon pseudo à moi est aussi un indice...


Oui effectivement ce n'est pas tout à fait identique...

Résumons un peu ton besoin:

Dans le nouvel exemple tu as dans [Feuil1] tu as (par exemple) 5 x REPARTTITEUR_MELT, dans |Matrice] 1 seule ligne

sur cette "rubrique" si je compte les 1 j'ai pour [Feuil1] respectivement 1,1,2,1,0 et dans |Matrice] j'ai 3 que dois-je obtenir pour chacune des lignes de [Feuil1] ?

Ah la SF c'est très bien également Il y a un Blade runner au ciné en ce moment. Je n'ai jamais vu Blade Runner. J'essaierais ce week end. Je me sens désavantager maintenant que tu connais l'origine de mon pseudo...

Oui, en fait, pour prendre un exemple. Sur [Feuil1], je regarde TEST_LBE_OK que je vais chercher la valeur dans ma feuille [Matrice] parmi la liste proposée. Ensuite, je regarde les 1 de la ligne TEST_LBE_OK. Il y en a une ici en V2.

Je compare alors avec la case V2 de matrice. Si il y a un 1 dans les 2 cases alors ma case "résultat" vaut 1.

Et je voudrais faire ca pour toute les lignes de la colonne message_c de Feuil

Cdt,

(re)

Côté ciné... Oui je sais Blade Runner (la suite ou presque) est à l'affiche en ce moment... Je n'ai pas encore pris le temps d'y aller...

Par contre l'indice du pseudo se situe bien ailleurs dans le temps et dans l'espace... c'est en fait l'immatriculation du vaisseau Entreprise du Cdt Kirk tiré de la série incontournable Star Trek (de Gene Roddenberry) !


Ok... je crois que je n'avais pas compris cela comme ceci

Il faut que je réfléchisse à une nouvelle stratégie

Le fameux USS enterprise. Je comprends mieux, tu navige dans l'univers d'excel comme tu navigerais dans l'univers. Startrek est une référence dans le domaine. Personnellement, j'ai plus aimé Stargate. Que ce soit le film de 95 et les séries SGA et SG1(J'ai volontairement omis universe... Je ne leur pardonne pas l'absence de saison 3...:p

Concernant le code, ce sont les 1 de ma Feuil1 que je dois prendre en référence pour comparer leur position avec l'onglet matrice.

Rechercher des sujets similaires à "comparer colonnes onglet"