Gestion de la compatibilité de références

En faisant des tests (un peu brutaux je l'avoue), j'ai eu un message d'erreur. Je pense que c'est un cas isolé mais y a t'il un moyen de le supprimer. Ce n'est qu'un détail au vu du travail exceptionnel que vous avez réalisé.

Le test : suppression des 3 croix entourées ci-dessous en une seule fois.

image

J'obtiens :

image

Merci par avance,

David

Merci beaucoup. Je vais maintenant l'intégrer à mon fichier complet. Je vous tiendrai au courant. David

Bonjour Steelson,

Merci encore pour votre aide précieuse. Cela fait de nombreuses améliorations que je vous demande. Si toutefois vous ne souhaitiez plus les traiter, je comprendrais. Je vais regarder de mon côté si je peux résoudre les améliorations ci-dessous mais j'ai bien peur d'y passer 20 ans... J'ai d'ores et déjà analysé le code ce matin et ça m'a été très formateur.

Après différents tests, voici ce que j'ai besoin d'améliorer :

Il est possible que j'ai des références qui soient présentes dans l' onglet "Tableaux" et qu'elles ne soient pas forcément présentes dans l' onglet "Compatibilités".

Après essai de cette possibilité (j'ai ajouté les Ref 15 à 18 uniquement dans l'onglet "tableaux"), j'obtiens :

image

Autrement, lorsque je veux insérer des lignes dans les tableaux, j'obtiens:

image

Dernière question :

Savez-vous s'il est possible de mettre le nom de l'onglet en tant que variable ? En effet, cela me permettrait de le voir immédiatement en début de code et il est rappelé 3 fois dans le code.

image

Je vous remercie par avance et je vous souhaite un bon weekend,

David

Bonjour,

Cela fait de nombreuses améliorations que je vous demande. Si toutefois vous ne souhaitiez plus les traiter, je comprendrais. Je vais regarder de mon côté si je peux résoudre les améliorations ci-dessous mais j'ai bien peur d'y passer 20 ans... J'ai d'ores et déjà analysé le code ce matin et ça m'a été très formateur.

pas de soucis de ce côté, c'est très intéressant, mais le code se complexifie (tu as raison de l'annoter)

Il est possible que j'ai des références qui soient présentes dans l' onglet "Tableaux" et qu'elles ne soient pas forcément présentes dans l' onglet "Compatibilités".

ok, j'ai ajouté un "On Error GoTo suite" pour prendre en compte une référence absente dans le tableau croisé

mais quid des dépendances qui ne seraient pas dans les tableaux de choix ?

Savez-vous s'il est possible de mettre le nom de l'onglet en tant que variable ? En effet, cela me permettrait de le voir immédiatement en début de code et il est rappelé 3 fois dans le code.

c'est fait, j'ai défini un objet TableauCroise

Bonjour Steelson,

c'est à nouveau moi...

J'ai passé un peu de temps pour intégrer ce que nous avons fait dans mon fichier complet (qui comprend déjà quelques macros). Je rencontre quelques difficultés et je me rends compte que mon niveau en VBA excel est très limité mais je ne me décourage pas et je sais que je vais progresser rapidement.

1) Lorsque je clic successivement sur les références 16 et 17 j'obtiens :

image

Je ne comprend pas pourquoi.

2) Lorsque j' insert une nouvelle ligne dans un tableau de choix, j'obtiens:

image

Autrement, pouvez-vous m'expliquer cette partie de code :

image

Je comprend qu'il y a un croisement de données mais je n'arrive pas à comprendre clairement le fonctionnement.

Que veut dire ref = "" ?

Merci par avance,

David

Bonjour,

1-

Set TableauCroise = Sheets("Compatibilités")

TableauCroise est le nom virtuel de la feuille "Compatibilités", pour changer le nom de la feuille c'est là qu'il faut le faire en remplaçant Compatibilités

Data = TableauCroise.ListObjects(1).ListColumns(ref).DataBodyRange.Value

Data va récupérer dans le premier tableau ListObject(1) de la feuille, les données de la colonne dont le titre est égal à Ref , il faut bien sûr que Ref ne soit pas vide, c'est pourquoi j'ai mis juste avant un on error goto suite dans le cas où bien la référence n'existe pas comme en C20 de l'exemple, ou bien la ref n'existe pas dans le tableau comme tu demandais (Ref16 et suivants).

Et en effet il y a un bug, je vais regarder cela demain ...

2-

je n'ai pas reproduit d'erreur

je vais compléter ma réponse demain sur ce point

Merci Steelson pour ces réponses. Effectivement, je n'avais pas saisi le lien entre les désignations "Ref" et "Des" des tableaux et du code VBA. C'est beaucoup plus clair pour moi.

Pour le point 2, j'obtiens le message le message indiqué dans mon post précédent en faisant un clic droit sur un tableau > insérer > lignes de tableau en haut. Si j' inserts une ligne complète dans la feuille excel, j'obtiens:

image

Prenez votre temps pour la réponse, pas de souci.

David

Suite du point 1

c'est pourquoi j'ai mis juste avant un on error goto suite dans le cas où bien la référence n'existe pas comme en C20 de l'exemple, ou bien la ref n'existe pas dans le tableau comme tu demandais (Ref16 et suivants).

hé bien c'est justement la gestion de cette absence qui pose problème quand il y a plus d'une référence absente du tableau

in fine, il faut mettre ceci, avec en plus un redimensionnement de data pour être bien sûr de le vider :

ReDim data(1 To 1, 1 To 1)
On Error Resume Next ' si Ref n'est pas dans le tableau croisé
data = TableauCroise.ListObjects(1).ListColumns(ref).DataBodyRange.Value '===> Nom onglet peut être à modifier

au passage, j'ai tout mis en déclaration explicite obligatoire pour bien vérifier qu'il n'y avait pas d'autres points

Pour le second point, il fallait que je restreigne la recherche des références à une seule colonne du tableau. Or quand on ajoute une ligne au tableau, il allait chercher les références possibles dans les 3 colonnes

For Each tbl In ActiveSheet.ListObjects

    If Not Application.Intersect(Target, tbl.ListColumns(num_col_ref).DataBodyRange) Is Nothing Then
        ref = Application.Intersect(Target, tbl.ListColumns(num_col_ref).DataBodyRange).Value 'Références
        des = Application.Intersect(Target, tbl.ListColumns(num_col_ref).DataBodyRange).Offset(0, 1).Value  '===> Désignations = décalage par rapport à la colonne des références
        Exit For
    End If

    If Not Application.Intersect(Target, tbl.ListColumns(num_col_choix).DataBodyRange) Is Nothing Then
        ref = Application.Intersect(Target, tbl.ListColumns(num_col_choix).DataBodyRange).Offset(0, 1).Value '===> décalage par rapport à la colonne des choix
        des = Application.Intersect(Target, tbl.ListColumns(num_col_choix).DataBodyRange).Offset(0, 1).Value '===> décalage par rapport à la colonne des choix
        Exit For
    End If

Next

Pour répondre à ta question, je mets ceci pour initialiser

ref = "": des = ""

même si ce n'est pas réellement utile ... quoique si je l'avais fait avec data en mettant ReDim data(1 To 1, 1 To 1) j'aurais peut-être en partie éviter l'erreur

Donc c'est toujours plus sain d'initialiser les variables.

Ensuite je teste si ref n'est pas nul

If ref <> "" Then

ce qui correspond à une ligne du tableau où la deuxième colonne est vierge

Mais comme j'ai dit, c'est quand même un peu compliqué ...

Bonjour Steelson,

Je vous remercie de m'avoir répondu aussi rapidement. J'avoue que j'avais hâte de voir les solutions. Je n'aurais pas trouvé, c'est certain.

Que vous l'avez dit, c'est compliqué, mais je pense que vous êtes arrivé au résultat souhaité. J'espère que j'arriverai rapidement à coder ce que je veux comme vous le faite.

Je vais continuer à l'intégrer dans mon fichier complet. Je vous tiendrai au courant.

Un grand merci une nouvelle fois.

David

Bonjour Steelson,

Je viens d'intégrer la macro dans mon fichier complet et ça fonctionne très bien d'après les tests que je viens de réaliser.

J'ai deux nouvelles questions mais si vous ne pouvez pas y répondre, ce n'est pas grave, je dois voir une personne demain qui devrait pouvoir le faire.

1 - Lorsqu'on est dans le cas d'une association de références "AS", si on sélectionne une case, une ou plusieurs autres cases peuvent être cochées automatiquement (c'est génial d'ailleurs). Dans ce cas, est-il possible d'avoir un message box indiquant les cases cochées automatiquement ?

2 - Toujours dans le cas de l'association, si je souhaite supprimer une croix placée automatiquement dans l'onglet "Config_2-3", ce n'est pas possible et c'est très bien. Est-il également de mettre un message box pour indiquer que cette option est liée à "x" ?

Votre image de profil est totalement différente ;-)

David

C'est jouable .... wahou, le code va dépasser le plafond fatidique d'une feuille A4 !

Je me demandais s'il ne fallait pas faire un onglet "log" ? bon on va s'en tenir aux commentaires ...

Je suis désolé parce que je ne connais pas l'utilisation d'un onglet "log". Je vous laisse en juger. David

Incroyable ! C'est top !

Qu'est ce que j'aimerai pouvoir faire ce que je veux avec VBA de cette façon.

Merci beaucoup Steelson

Dans les tests, j'ai été surpris de voir plusieurs messages ! en fait c'est tout simplement lié au fait que la macro événementielle se réactive à chaque changement opéré, c'st ce qui permet de descendre la nomenclature en automatique. Donc je ne peux malheureusement pas regrouper.

J'ai également remarqué cela mais ce n'est pas un problème parce que je pense qu'il n'y aura pas plus de 3 références à la fois. Si il devait y en avoir plus, il n'y aura pas beaucoup de cas. Ça fonctionne très bien.

Bonne soirée,

David

Bonjour Steelson,

Après de nouveaux tests, la macro fonctionne à merveille. Merci encore.

J'ai une nouvelle demande mais qui n'est plus en lien avec ce sujet. Je vais donc en créer un nouveau.

David

Rechercher des sujets similaires à "gestion compatibilite references"