Recherche nombre composants communs matrice croisée

esstin

XLDnaute Nouveau
Bonjour,
J'ai un petit problème pour récupérer des données d'une matrice croisée dynamique. Sur cette matrice, en colonne figure les composants et en ligne les articles finis qui utilisent ces composants.
Je souhaiterais savoir pour chaque article le nombre de composant qu'il a en commun, ainsi que le nom de ces composant, avec tout les autres articles.
Par rapport à la matrice jointe :
Par exemple A a 3 composants en communs avec B (a,b,c)
A a 2 composants en commun avec C (a,b)
A a 3 composants en commun avec D et E (a,b,f)

Je voudrait savoir cela pour tout les articles entre eux.
Cette matrice n'est qu'un exemple car en réalité, il y a 660 articles différent et jusqu'à IN colonnes. :eek::eek:

Pensez-vous que cela soit possible en macro? :confused:
Avez vous une idée qui peux fonctionner? :confused:

Je précise que je suis juste analyste de données et que je n'ai pas de notion de programmation.

Merci pour vos réponses et votre aide :):)
 

Pièces jointes

  • matrice_expliq.xls
    14 KB · Affichages: 58

GIBI

XLDnaute Impliqué
Re : Recherche nombre composants communs matrice croisée

Bonjour,

je crois avoir compris la demande, mais je ne sais pas trop commun présenter le résultat.

J'ai fais un essai de macro, qui peut être activer via un bouton

Merci de ton retour

GIBI
 

Pièces jointes

  • matrice_expliq2.xls
    42 KB · Affichages: 51

CISCO

XLDnaute Barbatruc
Re : Recherche nombre composants communs matrice croisée

Bonjour

J'ai fait un petit fichier, mais, malheureusemnt, cela n'est certainement pas utilisable dans le cas de ton fichier, vu le nombre de colonnes, de lignes...

@ plus
 

Pièces jointes

  • matrice_expliq(1).xls
    43.5 KB · Affichages: 54
Dernière édition:

esstin

XLDnaute Nouveau
Re : Recherche nombre composants communs matrice croisée

Bonjour,

je crois avoir compris la demande, mais je ne sais pas trop commun présenter le résultat.

J'ai fais un essai de macro, qui peut être activer via un bouton

Merci de ton retour

GIBI


Merci beaucoup pour ta réponse, c'est exactement ce que je souhaite.
Le bouton synthèse marche très bien pour le tableau d'explication en revanche il coince pour la vraie matrice.
La macro commence à s'éxécuter et au bout d'un moment une fenêtre VB apparait :
Erreur d'exécution '9':
L'indice n'appartient pas à la sélection

Quand je clique sur le bouton débogage c'est la ligne 19 qui est souligné
Tabart2(L1, NA, N) = Cells(1, C1) ' composant commun

J'ai pensé que peut être il y a plus de 65000 réponses communs entre 2 articles et que le fichier s'arrête.....

En tout cas merci merci beaucoup car ta macro est vraiment très bien construite. Chapeau l'artiste.

Je joind la vraie matrice pour que tu vois ce qui va pas.
Elle est en 2 parties car sinon elle fait plus de 50ko.

Bonne soirée et Bon weekend
Encore merci GIBI
 

Pièces jointes

  • matrice_originale_haut.zip
    36.8 KB · Affichages: 30
  • matrice_originale_bas.zip
    38.2 KB · Affichages: 24

esstin

XLDnaute Nouveau
Re : Recherche nombre composants communs matrice croisée

Bonjour

J'ai fait un petit fichier, mais, malheureusemnt, cela n'est certainement pas utilisable dans le cas d ton fichier, vu le nombre de colonnes, de ligne...

@ plus


Merci beaucoup à toi CISCO
C'est vrai que pour mon fichier actuel ta solution n'est pas trop utilisable.
En revanche celui-ci est très clair et me sera certainement utile pour de futur présentation ou projet avec moins de réfèrence et de conditions.

Bonne soirée et bon weekend
 

GIBI

XLDnaute Impliqué
Re : Recherche nombre composants communs matrice croisée

Bonsoir,

l'erreur venait du nombre trop important des articles communs.

J'ai refait la macro d'une manière plus simple : j'ai remplacé le stockage du résultat en tableau par une écriture direct en sortie (un message dans la barre de massage permet de suivre l'avancement).

J'ai traité le problème des 65000 en écrivant sur plusieurs onglet : Resultat1 à Resultat10.
Pour effacer, si tu le veux, les feuilles résultats tu peux utiliser la macro RazResultat

Remplace la macro actuel par le code ci-dessous

Code:
Option Explicit    ' Exige la déclaration explicite des variables.

Sub Synthese()
Dim L1 As Long, L2 As Long, LMax As Long, LS As Long, Cmax As Long
Dim C1 As Long, C2  As Long, N As Long, NA As Long
Dim NumF As Integer
Dim Resultat As String
Dim Tableau, aa
Application.ScreenUpdating = False

Resultat = "Resultat"
NumF = 1
Resultat = "Resultat" & NumF
Sheets(Resultat).Activate
Cells.ClearContents

Sheets("Feuil1").Activate
LMax = Range("A65536").End(xlUp).Row
Cmax = Range("IV1").End(xlToLeft).Column

Tableau = Range(Cells(1, 1), Cells(LMax, Cmax)) 'plage en tableau

LS = 2 ' init n° ligne résultat
For L1 = 2 To LMax 'pour chaque article niveau 1
 Application.StatusBar = "Traitement ligne " & L1
 If LS > (65000 - LMax) Then
    NumF = NumF + 1
    Resultat = "Resultat" & NumF
    Sheets(Resultat).Activate
    Cells.ClearContents
    LS = 2
  End If
 NA = 1
 For L2 = L1 + 1 To LMax 'pour chaque article niveau 2
 
       N = 0
       For C1 = 2 To Cmax
          If Tableau(L1, C1) <> "" Then
             If Tableau(L2, C1) <> "" Then
                N = N + 1 ' nbre composant
                Sheets(Resultat).Cells(LS, 3 + N) = Tableau(1, C1)  ' composant commun
             End If
          End If
       Next
       If N <> 0 Then
          Sheets(Resultat).Cells(LS, 3) = N
          Sheets(Resultat).Cells(LS, 1) = Tableau(L1, 1)
          Sheets(Resultat).Cells(LS, 2) = Tableau(L2, 1)
          LS = LS + 1
       End If
  
 Next L2


Next L1
Application.StatusBar = "Traitement teminé"
Application.ScreenUpdating = True

End Sub
Sub RazResultat()
 Dim NumF, Resultat
  
 For NumF = 1 To 10
  Resultat = "Resultat" & NumF
  Sheets("Resultat" & NumF).Activate
  Cells.ClearContents
 Next
End Sub
 
Dernière édition:

esstin

XLDnaute Nouveau
Re : Recherche nombre composants communs matrice croisée

Bonsoir,

l'erreur venait du nombre trop important des articles communs.

J'ai refait la macro d'une manière plus simple : j'ai remplacé le stockage du résultat en tableau par une écriture direct en sortie (un message dans la barre de massage permet de suivre l'avancement).

J'ai traité le problème des 65000 en écrivant sur plusieurs onglet : Resultat1 à Resultat10.
Pour effacer, si tu le veux, les feuilles résultats tu peux utiliser la macro RazResultat

Remplace la macro actuel par le code ci-dessous

Code:
Option Explicit    ' Exige la déclaration explicite des variables.

Sub Synthese()
Dim L1 As Long, L2 As Long, LMax As Long, LS As Long, Cmax As Long
Dim C1 As Long, C2  As Long, N As Long, NA As Long
Dim NumF As Integer
Dim Resultat As String
Dim Tableau, aa
Application.ScreenUpdating = False

Resultat = "Resultat"
NumF = 1
Resultat = "Resultat" & NumF
Sheets(Resultat).Activate
Cells.ClearContents

Sheets("Feuil1").Activate
LMax = Range("A65536").End(xlUp).Row
Cmax = Range("IV1").End(xlToLeft).Column

Tableau = Range(Cells(1, 1), Cells(LMax, Cmax)) 'plage en tableau

LS = 2 ' init n° ligne résultat
For L1 = 2 To LMax 'pour chaque article niveau 1
 Application.StatusBar = "Traitement ligne " & L1
 If LS > (65000 - LMax) Then
    NumF = NumF + 1
    Resultat = "Resultat" & NumF
    Sheets(Resultat).Activate
    Cells.ClearContents
    LS = 2
  End If
 NA = 1
 For L2 = 2 To LMax 'pour chaque article niveau 2
    If L1 <> L2 Then
       N = 0
       For C1 = 2 To Cmax
          If Tableau(L1, C1) <> "" Then
             If Tableau(L2, C1) <> "" Then
                N = N + 1 ' nbre composant
                Sheets(Resultat).Cells(LS, 3 + N) = Tableau(1, C1)  ' composant commun
             End If
          End If
       Next
       If N <> 0 Then
          Sheets(Resultat).Cells(LS, 3) = N
          Sheets(Resultat).Cells(LS, 1) = Tableau(L1, 1)
          Sheets(Resultat).Cells(LS, 2) = Tableau(L2, 1)
          LS = LS + 1
       End If
    End If
 Next L2


Next L1
Application.StatusBar = "Traitement teminé"
Application.ScreenUpdating = True

End Sub
Sub RazResultat()
 Dim NumF, Resultat
  
 For NumF = 1 To 10
  Resultat = "Resultat" & NumF
  Sheets("Resultat" & NumF).Activate
  Cells.ClearContents
 Next
End Sub

Merci beaucoup GIBI pour ta réponse. ;);)
C'est exactement ce que je voulais.
Tu est vraiment très fort!!!!!!!!!!!!!!!!
Sinon cela n'est peut-être pas possible car comme tu le dis il n'y a pas de stockage mais une lecture directe, par rapport à ta 1ère version, les articles sont en double.
Par exemple il y a une ligne avec A et B et une autre identique avec B et A.
Et-il possible de faire comme pour la 1ère version où les doublons d'apparaisait pas.
Cordialement
Et encore un grand MERCI
 

GIBI

XLDnaute Impliqué
Re : Recherche nombre composants communs matrice croisée

Bonsoir,

je suis allé un peu vite : il faut modifier une ligne

For L2 = 2 to LMax 'pour chaque article niveau 2
en
For L2 = L1 + 1 To LMax 'pour chaque article niveau 2


Avec mes excuses

GIBI
J'ai modifié la code dans le précédent message
 
Dernière édition:

esstin

XLDnaute Nouveau
Re : Recherche nombre composants communs matrice croisée

Bonsoir,

je suis allé un peu vite : il faut modifier une ligne

For L2 = 2 to LMax 'pour chaque article niveau 2
en
For L2 = L1 + 1 To LMax 'pour chaque article niveau 2


Avec mes excuses

GIBI
J'ai modifié la code dans le précédent message

C'est PARFAIT
merci merci beaucoup
Ca marche nickel
Chapeau!!!!!!!!!!!! Tu es un génie:):)
 

Discussions similaires

Réponses
8
Affichages
499

Statistiques des forums

Discussions
312 493
Messages
2 088 955
Membres
103 989
dernier inscrit
jralonso