Matrice de saisie, références, maintien à jour automatique

Blitzz

XLDnaute Nouveau
Bonjour et merci d'avance à ceux qui m'apporteront un peu de soutien.

Je viens de m'inscrire sur ce forum, qui je trouve est une réelle mine d'information ! Je l'ai parcouru avec attention, mais malheureusement je n'ai pas trouvé de quoi répondre à mon problème actuel...

Voici le problème exposé (en essayant de le généraliser) :

Mon classeur Excel est composé de trois onglets :

L'onglet 1 liste des informations concernant un type d'entité (A), avec en colonne les différent attributs concernant cette entité (identifiant, nom, ...)

L'onglet 2 liste lui aussi des informations pour un autre type d'entité (B).

L'onglet 3 affiche une matrice, avec en ligne les identifiants des entités A (référence vers l'onglet 1), et en colonne les identifiants des entités B (référence vers l'onglet 2). Le contenu de la matrice est une zone de saisie, permettant de renseigner des dépendances entre des entités A et des entités B.

Le coeur du problème est que je souhaiterais que la matrice de l'onglet 3 reste cohérente et soit mise à jour automatiquement, lorsque des modifications sont apportées dans les listes des onglets 1 et 2.

Par exemple :
- lorsque l'on ajoute ou supprime des lignes dans ces onglets, il faudrait qu'elles soient automatiquement répercutées au niveau des lignes et des colonnes de la matrice, et que le contenu saisi dans la matrice reste associé aux bonnes lignes/colonnes.

Ci-joint un tableur qui illustre mon propos.

Si vous pouviez m'éclairer de votre expérience, et me dire ce qui est de l'ordre du faisable avec Excel/macros, ça me serait d'une très grande utilité ! :)
 

Pièces jointes

  • Matrice_A-B.xls
    18.5 KB · Affichages: 100
Dernière édition:

Blitzz

XLDnaute Nouveau
Re : Matrice de saisie, références, maintien à jour automatique

Personne n'a d'idée ?

Je m'apprête à me lancer dans du code VBA parcourant les listes des onglets 1 et 2 à chaque modif et faisant ensuite les répercussions dans l'onglet 3, mais ça me semble fastidieux... D'autant plus que je maîtrise mal VBA !

N'y aurait-il pas des fonctions Excel qui pourraient me faciliter la tâche ???
Par exemple, j'ai déjà trouvé transpose() pour passer mes identifiants de l'onglet 2 en colonne sur l'onglet 3...
 

GIBI

XLDnaute Impliqué
Re : Matrice de saisie, références, maintien à jour automatique

Bonjour,

Personne ne répond car la réponse est trop évidente et nous aimons les challenges

toujours sommeprod en B2 tu écris et aprés tu duplique

=SI(SOMMEPROD(($A2='Entités A'!$A$2:$A$22)*('Matrice A-B'!B$1='Entités B'!$A$2:$A$22)*1)<>0;"X";"")

au travail!

GIBI
 

Blitzz

XLDnaute Nouveau
Re : Matrice de saisie, références, maintien à jour automatique

Bonjour GIBI et merci pour ton aide.

Mais en fait ce que tu proposes ne correspond pas à mon problème.

J'essaye de m'expliquer plus clairement :
la matrice A-B est un tableau de saisie : les "X" sont saisis par l'utilisateur et ne correspondent à aucune formule. Ce que je souhaite mettre à jour automatiquement dans cette matrice, ce sont les intitulés des colonnes et des lignes, pour qu'ils correspondent toujours à la liste des entités A et des entités B décrites dans les 2 autres onglets. Et si une nouvelle entité est ajoutée dans l'onglet 1 ou 2, il faut qu'une nouvelle ligne (ou une nouvelle colonne) s'ajoute automatiquement dans ma matrice de saisie, et que les X déjà saisis auparavant soient décalés en conséquence...

Est-ce suffisamment complexe ? Sinon, je dois bien pouvoir rajouter encore un peu de complexité, pour que ça fasse un vrai challenge à relever. ;)
 

GIBI

XLDnaute Impliqué
Re : Matrice de saisie, références, maintien à jour automatique

Bonsoir,

Comme je n'avais rien compris, voici une macr VBA qui va mettre à jour la matrice :

Remarque : les listes A et B doivent être triées en croissant


Sub MaJ()
Dim L As Long, L2 As Long, C2 As Long, NbrLig As Long

' ajout des nouvelles lignes

NbrLIG_A = Worksheets("Entités A").Range("A65536").End(xlUp).Row

L2 = 2
L = 2

While L <= NbrLIG_A
If Worksheets("Entités A").Cells(L, 1).Value < Worksheets("Matrice A-B").Cells(L2, 1).Value _
And Worksheets("Matrice A-B").Cells(L2, 1).Value <> "" Then
'inserer une ligne
Worksheets("Matrice A-b").Rows(L2).Insert
Worksheets("Matrice A-b").Cells(L2, 1).Value = Worksheets("Entités A").Cells(L, 1).Value
L2 = L2 + 1
L = L + 1
ElseIf Worksheets("Entités A").Cells(L, 1).Value = Worksheets("Matrice A-B").Cells(L2, 1).Value Then
L2 = L2 + 1
L = L + 1
ElseIf Worksheets("Matrice A-B").Cells(L2, 1).Value = "" Then
'ajouter une ligne
Worksheets("Matrice A-b").Rows(L2).Insert
Worksheets("Matrice A-b").Cells(L2, 1).Value = Worksheets("Entités A").Cells(L, 1).Value
L2 = L2 + 1
L = L + 1
Else
While Worksheets("Entités A").Cells(L, 1).Value > Worksheets("Matrice A-B").Cells(L2, 1).Value
L2 = L2 + 1
Wend
End If

Wend

' ajout des nouvelles Colonnes

NbrCol_B = Worksheets("Entités B").Range("A65536").End(xlUp).Row

L2 = 2
L = 2

While L <= NbrLIG_A
If Worksheets("Entités A").Cells(L, 1).Value < Worksheets("Matrice A-B").Cells(L2, 1).Value _
And Worksheets("Matrice A-B").Cells(L2, 1).Value <> "" Then
'inserer une ligne
Worksheets("Matrice A-b").Rows(L2).Insert
Worksheets("Matrice A-b").Cells(L2, 1).Value = Worksheets("Entités A").Cells(L, 1).Value
L2 = L2 + 1
L = L + 1
ElseIf Worksheets("Entités A").Cells(L, 1).Value = Worksheets("Matrice A-B").Cells(L2, 1).Value Then
L2 = L2 + 1
L = L + 1
ElseIf Worksheets("Matrice A-B").Cells(L2, 1).Value = "" Then
'ajouter une ligne
Worksheets("Matrice A-b").Rows(L2).Insert
Worksheets("Matrice A-b").Cells(L2, 1).Value = Worksheets("Entités A").Cells(L, 1).Value
L2 = L2 + 1
L = L + 1
Else
While Worksheets("Entités A").Cells(L, 1).Value > Worksheets("Matrice A-B").Cells(L2, 1).Value
L2 = L2 + 1
Wend
End If

Wend

' ajout des nouvelles Colonnes

NbrLig = Worksheets("Entités B").Range("A65536").End(xlUp).Row

C2 = 2
L = 2

While L <= NbrLig
If Worksheets("Entités b").Cells(L, 1).Value < Worksheets("Matrice A-B").Cells(1, C2).Value _
And Worksheets("Matrice A-B").Cells(1, C2).Value <> "" Then
'inserer une ligne
Worksheets("Matrice A-b").Columns(C2).Insert
Worksheets("Matrice A-b").Cells(1, C2).Value = Worksheets("Entités B").Cells(L, 1).Value
C2 = C2 + 1
L = L + 1
ElseIf Worksheets("Entités B").Cells(L, 1).Value = Worksheets("Matrice A-B").Cells(1, C2).Value Then
C2 = C2 + 1
L = L + 1
ElseIf Worksheets("Matrice A-B").Cells(1, C2).Value = "" Then
'ajouter une ligne
Worksheets("Matrice A-b").Columns(C2).Insert
Worksheets("Matrice A-b").Cells(1, C2).Value = Worksheets("Entités B").Cells(L, 1).Value
C2 = C2 + 1
L = L + 1
Else
While Worksheets("Entités A").Cells(L, 1).Value > Worksheets("Matrice A-B").Cells(L2, 1).Value
L2 = L2 + 1
Wend
End If

Wend

MsgBox "Matrice mise à jour"

End Sub


il suffit d'inserer la macro via OUTILS/Macro/macro depuis créer et de recopier le code ci-dessus

bonne nuit

GIBI
 

Discussions similaires

Réponses
12
Affichages
454

Statistiques des forums

Discussions
312 963
Messages
2 093 996
Membres
105 906
dernier inscrit
aifa