Boucle sur des données d'une autre feuille Excel

Bonjour,

Je ne crois pas avoir vu ce sujet abordé ici malgré mes petites recherches donc je me permets de faire un nouveau sujet.

[*]Sur une 1ère feuille d'un classeur excel, j'ai un tableau avec les réponses en OUI/NON à différentes questions (en lignes, les numéros ID des répondants et en colonnes, les questions)

Les cellules contenant les infos (oui ou non) sont situées de C3 à AV226. Cependant, il y a 2 groupes de données : C3 à S226 pour le 1er groupe et T3 à AV226 pour le 2ème.

[*]Sur la 2ème feuille du classeur, j'ai fait un tableau regroupant en lignes les 17 intitulés du 1er groupe et en colonnes les 29 intitulés du 2ème. Cellules contenant les infos : B2 à AD18

Le but est de remplir chaque cellule de la 2ème feuille avec le nombre d'occurrences de OUI d'après la 1ère feuille de façon à ce que, à chaque fois qu'un OUI a été mis dans une colonne du 1er groupe, les cellules correspondantes soient incrémentées pour chaque OUI dans le 2ème groupe.

Ex : N°23 a mis OUI dans les colonnes D et H puis OUI pour les colonnes Z, AB et AI.

Je souhaite alors incrémenter, dans la 2ème feuille, les 6 cellules correspondant aux intersections suivantes (tous les couples entre les données marquées OUI de chacun des deux groupes) :

[*]D avec Z soit, dans la 2ème feuille la cellule : H3

[*]D avec AB soit, dans la 2ème feuille la cellule : J3

[*]D avec AI soit, dans la 2ème feuille la cellule : Q3

[*]D avec Z soit, dans la 2ème feuille la cellule : H7

[*]D avec AB soit, dans la 2ème feuille la cellule : J7

[*]D avec AI soit, dans la 2ème feuille la cellule : Q3

L'algorithme auquel j'ai pensé (à exécuter via un code VBA) :

[*] Initialiser à 0 toutes les cellules de la 2ème feuille (de B2 à AD18)

[*] "Scanner", ligne par ligne, les cellules de la 1ère feuille de la colonne C à la colonne S (1er groupe) en "retenant" les numéros des colonnes marquées d'un OUI (cela correspondra aux lignes dans le 2ème tableau)

[*] "Scanner" ensuite, pour la même ligne, les cellules des colonnes T à AV. À chaque fois qu'il y a un OUI alors incrémenter, dans la 2ème feuille, la cellule correspondant au numéro de colonne en cours (transposé dans le 2ème tableau) et toutes les lignes "retenues" dans l'étape précédente.

À la fin, je me retrouverai avec le tableau de la 2ème feuille avec des valeurs correspondant aux nombres d'occurrences tels que je les veux, normalement.

Est-ce que mon algo vous semble correct ?

Comment avoir accès aux données d'une autre feuille dans VBA ?

Y a-t-il moyen de faire ça avec un Tableau Croisé Dynamique ?

Bonjour,

Envoie un fichier, on verra + clair pour te répondre

Amicalement

Claude

Ah on peut faire ça

J'ai enlevé des infos et j'ai renommé les lignes et les colonnes pour des questions de confidentialité.

En plus, dans la 1ère feuille, il faut imaginer des OUI et des NON à la place des erreurs de référence

J'ai commencé à coder mon alogorithme... mais je n'en suis qu'à la première étape

re,

Tu ne peux pas faire un fichier + clair ?

avec exemple de résultat attendu et annotations

Claude

J'espère que c'est plus clair avec un exemple et des annotations

Désolé

Bonjour à tous,

Une solution par formule ? Avec choix du répondant...

Merci, ça se rapproche en effet de ce que je veux.

Je vais regarder la formule et voir si je peux faire pareil mais en agrégeant les réponses de TOUS les répondants.

Suffit de demander ! Une autre approche avec une ligne comptabilisant d'abord le nombre de OUI.

Merci.

Si j'ai bien compris, tu fais ça :

[*] Total par colonne de tous les OUI

[*] Pour chaque cellule de "Feuil3", chercher le nombre total de OUI dans Feuil1 correspondant au nom de la ligne de la cellule dans Feuil3 parmi la plage bleue et, par ailleurs, le nombre total de OUI dans Feuil1 correspondant au nom de la colonne de la cellule dans Feuil3 parmi la plage verte.

[*] Une fois les 2 nombres obtenus, on prend le minimum.

Si c'est bien cela, alors ce n'est pas ce que je souhaite : quand je parlais d'agréger, je pensais à agréger les résultats a posteriori, pas a priori

Je repars sur mon algorithme.

Encore merci

Bonjour sseb22,

sseb22 a écrit :

Si j'ai bien compris, tu fais ça :

[*] Total par colonne de tous les OUI

[*] Pour chaque cellule de "Feuil3", chercher le nombre total de OUI dans Feuil1 correspondant au nom de la ligne de la cellule dans Feuil3 parmi la plage bleue et, par ailleurs, le nombre total de OUI dans Feuil1 correspondant au nom de la colonne de la cellule dans Feuil3 parmi la plage verte.

[*] Une fois les 2 nombres obtenus, on prend le minimum.

C'est exactement ça !
sseb22 a écrit :

Si c'est bien cela, alors ce n'est pas ce que je souhaite

Ah mince alors
sseb22 a écrit :

quand je parlais d'agréger, je pensais à agréger les résultats a posteriori, pas a priori

Comprends pas ! Tu n'es pas obligé d'employer autant de termes latins dans une même phrase ! Peux-tu éclaircir ce point ?
sseb22 a écrit :

Je repars sur mon algorithme.

N'abandonne pas aussi vite !!

Voici l'algorithme que j'ai codé. Normalement, c'est bon mais je ne sais pas (encore) comment faire comprendre au VBA d'agir sur des cellules de différentes feuilles. (je remets exactement le même fichier, pour rappel)

Sub Test()

Dim Ligne As Integer
Dim Col As Integer
Dim Aux As Integer
Dim Tbl_Met(16) As Integer

Tbl_Met = 0

' Ici, on met à 0 les cellules de Feuil3
For Ligne = 2 To 18
    For Col = 2 To 30
        With Cells(Ligne, Col)
        .Value = 0
        End With
    Next Col
Next Ligne

'Ici, je voudrais scanner les cellules de Feuil1
For Ligne = 3 To 226
'Scan de la 1ère partie (en bleu) de Feuil1
    For Col = 3 To 19
'Ici, j'aimerais que With Cells corresponde donc à des cellules de Feuil1
        With Cells(Ligne, Col)
        If .Value = "OUI" Then Tbl_Met(Col - 3) = 1
        End With
    Next Col
'Scan de la 2ème partie (en vert) de Feuil1
    For Col = 20 To 48
'Ici, j'aimerais que With Cells corresponde donc à des cellules de Feuil1
        With Cells(Ligne, Col)
        If .Value = "OUI" Then
            For Aux = 0 To 16
                If Tabl_Met(Aux) = 1 Then
'Ici, je voudrais dire à Excel d'aller chercher les cellules de Feuil3
                    Feuil3![Col-18,Aux+2] = Feuil3![Col-18,Aux+2] + 1
                End If
            Next Aux
        End If
        End With
    Next Col
    Tabl_Met = 0
Next Ligne

End Sub

-- 08 Juil 2011, 12:17 --

vba-new a écrit :

Bonjour sseb22,

Comprends pas ! Tu n'es pas obligé d'employer autant de termes latins dans une même phrase ! Peux-tu éclaircir ce point ?

Salut

En fait, je souhaite regarder chaque individu (compter le nombre de OUI dans la 1ère partie puis incrémenter les bonnes cellules en fonction des OUI de la seconde partie du tableau) et avoir le total à la fin plutôt que de faire d'abord le total et compter le nb de OUI et incrémenter les bonnes cellules.

La 2ème manière fait perdre de l'info, en fait.

Tu peux faire comme ça :

 With Sheets("Feuil1").Cells(Ligne, Col)

Merci.

J'ai réécrit mais il me met une erreur de compilation ligne 41 (End If) : End If sans bloc If.

Etant donné que le IF est 2 lignes au-dessus, je me suis dit que c'était :

.Value=.Value+1

mais apparemment c'est une syntaxe correcte.

Est-ce que :

With Sheets("Feuil3").Cells(Aux + 2, Col - 18)

est correct ?

Sub Croisement()

Dim Ligne As Integer
Dim Col As Integer
Dim Aux As Integer
Dim i As Integer
Dim Tbl_Met(16) As Integer

For i = 0 To 16
    Tbl_Met(i) = 0
Next i

' Ici, on met à 0 les cellules de Feuil3
For Ligne = 2 To 18
    For Col = 2 To 30
        With Sheets("Feuil3").Cells(Ligne, Col)
        .Value = 0
        End With
    Next Col
Next Ligne

'Ici, je voudrais scanner les cellules de Feuil1
For Ligne = 3 To 226
'Scan de la 1ère partie (en bleu) de Feuil1
   For Col = 3 To 19
'Ici, j'aimerais que With Cells corresponde donc à des cellules de Feuil1
       With Sheets("Feuil1").Cells(Ligne, Col)
        If .Value = "OUI" Then Tbl_Met(Col - 3) = 1
        End With
    Next Col
'Scan de la 2ème partie (en vert) de Feuil1
   For Col = 20 To 48
'Ici, j'aimerais que With Cells corresponde donc à des cellules de Feuil1
       With Sheets("Feuil1").Cells(Ligne, Col)
        If .Value = "OUI" Then
            For Aux = 0 To 16
                If Tbl_Met(Aux) = 1 Then
'Ici, je voudrais dire à Excel d'aller chercher les cellules de Feuil3
                   With Sheets("Feuil3").Cells(Aux + 2, Col - 18)
                   .Value = .Value + 1
                End If
            Next Aux
        End If
        End With
    Next Col
    For i = 0 To 16
        Tbl_Met(i) = 0
    Next i
Next Ligne

End Sub

-- 08 Juil 2011, 15:12 --

J'ai oublié un "End With". C'est probablement ça

-- 08 Juil 2011, 15:31 --

Nouveau problème : mon tableau Tbl_Met est toujours rempli de 0, malgré la présence de OUI dans certaines cellules.

(je continue à regarder, je vous tiens au courant )

-- 08 Juil 2011, 15:39 --

PUREE !! C'est case-sensitive !

-- 08 Juil 2011, 16:01 --

Merci à vous 2, ça a l'air de marcher en remplaçant les "OUI" par "Oui".

Rechercher des sujets similaires à "boucle donnees feuille"