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 SubJe 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) + 1En 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) Thenet
Cells(c , i+44) = 1Et, 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 SubJe 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 SubRe,
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 = cptVerifSur 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..."
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
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.