Manipulation chaines de caractères (Mid/Replace)
Bonjour,
Hors sujet:
Jean Paul : Peut-tu jeter un oeil au mMessage en MP. Merci.
A+
Jean-Paul,
OK donc en gros si je voulais in itialiser ailleurs j'irai poser un Init = True ?
Et pour ma seconde question une idée pour afficher l'un ou l'autre tableau en fonction du ComboBox4 ? Avant je faisais un Left. S'il renvoyait PN ou Class j’affichais l'un ou l'autre des tableaux mais avec ta méthode, le Left renvoie la valeur (0025) et non le contenu du Combox (PN25) du coup à part tester toutes les valeurs une par une je ne vois pas quoi faire d'autre, une idée peut-être ?
En faisant valeur par valeur cela fonctionne mais ça fait une grosse liste car je fais ce genre de code:
'Raccordements EN
If ComboBox_PN_Class = "0025" Or ComboBox_PN_Class = "0032" Or ComboBox_PN_Class = "0040" Then
Adresse_Valeurs = M3_XlTools.GetTheValue(ComboBox_Raccordement_Entrée.Tag, "Valeurs")
If Adresse_Valeurs > vbNullString Then
ComboBox_Raccordement_Entrée.List = Range(Adresse_Valeurs).Value
End If
End IfUne idée peut-être pour que je capte ce que contient la Box et pas la valeur qu'il renvoie ?
Salut,
OK donc en gros si je voulais in itialiser ailleurs j'irai poser un Init = True
Voilà t'as tout compris, pour le reste je regarde demain.
OK j'ai avancé, j'ai trouvé comment chercher le texte dans le ComboBox et non pas la valeur que cela renvoie avec un ComboBox.Text du coup ce soucis est résolu.
Maintenant reste à chercher comment renvoyer vers le tableau 1 ou le tableau 2 en fonction du contenu du ComboBox. J'ai tenté de mettre deux tag dans le ComboBox séparés par un ; avec le code ci-dessous mais cela ne semble pas fonctionner. Ça avance quand même !
'Raccordements EN
If Left(ComboBox_PN_Class.Text, 2) = "PN" Then
Adresse_Valeurs = M3_XlTools.GetTheValue(ComboBox_Raccordement_Entrée.Tag, "Valeurs_EN")
If Adresse_Valeurs > vbNullString Then
ComboBox_Raccordement_Entrée.List = Range(Adresse_Valeurs).Value
End If
End If
'Raccordements ASME
If Left(ComboBox_PN_Class, 5) = "Class" Then
Adresse_Valeurs = M3_XlTools.GetTheValue(ComboBox_Raccordement_Entrée.Tag, "Valeurs_ASME")
If Adresse_Valeurs > vbNullString Then
ComboBox_Raccordement_Entrée.List = Range(Adresse_Valeurs).Value
End If
End IfSalut, la j'avoue être un peu perdu, pourquoi vouloir changer de tableau pour la liste déroulante 4 ?
Donnes moi le fonctionnement souhaité exemple :
- vt_Produits = cmbProducts
- vt_Fermeture = cmbClosure
- ...
Et le format de la zone de texte finale ex:
- cmbProducts sur deux lettres
- cmbClosure sur une lettre
- " "
- ...
Normalement chaque liste déroulante te renvoie l'item sélectionné, donc pas besoin de faire de manipulations supplémentaires.
En fait c'est un petit utilitaire pour le taff qui permet de créer une désignation auto en fonction de paramètre sélectionnés. Et au niveau du ComboBox raccordement Entrée et Sortie, il y a deux table possible selon la norme utilisée.
Je te remet le fichier que j'ai modifié. L'excel reste affiché et j'ai réactiver la croix pour quitter afin que tu ne galère pas avec le fichier.
En gros dans le "ComboBox_PN_Class" si tu sélectionnes une valeur qui commence par PN, tu vas chercher la table "Table_Raccordements_EN" et si tu sélectionnes une valeur qui commence par Class, tu vas chercher la table "Table_Raccordements_ASME".
J'ai une solution en mettant deux ComboBox l'un sur l'autre et en masquant l'un mais avant de faire ce bidouillage je voulais savoir si on peut pas le faire avec un même ComboBox.
Version sans les images, pour que tu n'ais pas de bug par défaut de lien
Salut,
Tu n'a pas répondu à ma question.
Avec quelle table charges-tu le comboBox4 ? (Actuellement c'est avec le tableau "Table_PN_Class")
ComboBox_PN_Class.ColumnWidths = "1 pt;0 pt". Y'a rien qui te titille là ?
Aucunes valeurs du tableau "Table_PN_Class" ne correspond au tableau "Table_Raccordements_EN" ni au tableau "Table_Raccordements_ASME". Je ne vois pas comment tu veux faire la liaison.
Répond à la question du post précédent car là je suis un peu perdu...
Bonjour Jean-Paul,
1) J'avais pas trop le temps hier j'essaie de te faire cela ce soir.
2) Le Combobox4 est bien chargé avec le tableau "Table_PN_Class"
3) Bah non ComboBox_PN_Class.ColumnWidths = "1 pt;0 pt" fait que j'affiche la colonne 1 dans le ComboBox et masque la 2 cela fonctionne parfaitement ? Qu'est-ce qui ne va pas ?
4) C'est normal car cela n'a rien à voir. Le tableau "Table_PN_Class" me sert à lister le ComboBox4 (Class_PN) et remplir la désignation du bas. Par contre en fonction de ce que je choisis dans ce ComboBox les ComboBox "Raccordement_Entrée" et "Raccordement_Sortie" seront remplis différemment:
- Si on choisit une valeur démarrant par PN -> Alors on utiliser la table Table_Raccordements_EN dans les ComboBox Raccordement
- Si on choisit une valeur démarrant par Class -> Alors on utiliser la table Table_Raccordements_ASME dans les ComboBox Raccordement
Alors avant j'y arrivait facilement car j'utilisais pas le xltool et les Tag, mais la avec ta version je ne vois pas du tout comment je peux faire. C'est pour cela que j'ai essayé ce code en mettant deux tag dans les propriétés du ComboBox "Raccordement_Entrée" mais cela ne fonctionne pas.
'Raccordements EN
If Left(ComboBox_PN_Class.Text, 2) = "PN" Then
Adresse_Valeurs = M3_XlTools.GetTheValue(ComboBox_Raccordement_Entrée.Tag, "Valeurs_EN")
If Adresse_Valeurs > vbNullString Then
ComboBox_Raccordement_Entrée.List = Range(Adresse_Valeurs).Value
End If
End If
'Raccordements ASME
If Left(ComboBox_PN_Class, 5) = "Class" Then
Adresse_Valeurs = M3_XlTools.GetTheValue(ComboBox_Raccordement_Entrée.Tag, "Valeurs_ASME")
If Adresse_Valeurs > vbNullString Then
ComboBox_Raccordement_Entrée.List = Range(Adresse_Valeurs).Value
End If
End IfLa seule solution que je vois actuellement et deux ComboBox superposés et afficher celui qui m'intéresse, mais je voulais d'abord voir avec toi s'il y a une solution meilleur que cette dernière car superposé je suis pas ultra fan.
Re,
ComboBox_PN_Class.ColumnWidths = "1 pt;0 pt" fait que j'affiche la colonne 1 dans le ComboBox et masque la 2 cela fonctionne parfaitement ? Qu'est-ce qui ne va pas ?
Je n'était pas bien réveillé, désolé.
4) C'est normal car cela n'a rien à voir. Le tableau "Table_PN_Class" me sert à lister le ComboBox4 (Class_PN) et remplir la désignation du bas. Par contre en fonction de ce que je choisis dans ce ComboBox les ComboBox "Raccordement_Entrée" et "Raccordement_Sortie" seront remplis différemment:
Là je comprends mieux...
Alors avant j'y arrivait facilement car j'utilisais pas le xltool et les Tag, mais la avec ta version je ne vois pas du tout comment je peux faire. C'est pour cela que j'ai essayé ce code en mettant deux tag dans les propriétés du ComboBox "Raccordement_Entrée" mais cela ne fonctionne pas.
Je regarde cela en rentrant, là je suis un peu à la bourre.
Bonne programmation.
Salut,
Bon de retour, je viens de regarder tout cela, voici les modification à faire :
Tout d'abord tu modifie le Tag des cmbEN et cmbASME comme ceci : ListValues:=vt_EN;DefaultValue:=Veuillez d'abord entrer la classe de pression.
Dans la procédure Initialize du formulaire tu modifie la boucle comme ceci :
'...
For Each localControl In Me.Controls
Select Case TypeName(localControl)
Case "ComboBox"
Dim ListValuesAddress As String
Dim ListDefaultText As String
ListValuesAddress = XlTools.GetTheValue(localControl.Tag, "ListValues")
ListDefaultText = XlTools.GetTheValue(localControl.Tag, "DefaultValue")
If ListValuesAddress > vbNullString Then
localControl.List = Range(ListValuesAddress).Value
End If
If ListDefaultText > vbNullString Then
localControl.Text = ListDefaultText
End If
End Select
Next localControl
'...Et pour finir tu modifie le code que j'ai passer de la procédure Change du cmbPN vers la procédure Click du même ComboBox comme ceci :
Private Sub cmbPN_Click()
GetControlChange cmbPN, 5, "000"
If InStr(1, cmbPN.Column(1), "PN", vbTextCompare) = 1 Then
Dim localTabName As String
localTabName = "vt_EN"
ElseIf InStr(1, cmbPN.Column(1), "Class", vbTextCompare) = 1 Then
localTabName = "vt_ASME"
End If
With cmbEN
.Clear
.List = Range(localTabName).Value
.ListIndex = -1
End With
With cmbAsme
.Clear
.List = Range(localTabName).Value
.ListIndex = -1
End With
End SubVoilà ça devrait faire le boulot.
Maintenant quelques petites réflexions :
- Pourquoi renommer les modules avec M1_, M2_, M3_... cela ne fait qu'alourdir ton code.
- Pourquoi supprimer le test de vérification du chemin des miniatures, tu peux l'adapter, mais en informatique il penser à gérer les exceptions avant qu'elles n'arrivent. Si ton chemin n'existe plus, alors plantage de l'application.
Je n'ai pas regarder ton fichier en détail, si j'ai un moment j'y jetterais un coup d’œil.
Bonne Programmation.
Bonsoir Jean-Paul,
OK je vais regarder ça tranquillement car en lisant rapidement je n'y comprend rien. Par contre il n'y a pas de cmbEN et cmbASME je pense que tu parles des cmbEntrée/cmbSortie je vais voir si ça fonctionne.
Pour les réflexions, les M1,M2... c'estjuste une histoire de structuration, une habitude pour savoir l'ordre d’exécution des modules, c'est un petit code donc "alourdir" c'est un peu fort comme terme je trouve surtout vu la vitesse d’exécution d'un ordinateur actuel.
Test de vérif pas supprimé, je ne l'ai pas encore ajouté simplement mais il est dans ma check liste et oui il sera mis, par contre je vire toujours les "on error resume next", je ne vois clairement pas l’intérêt de by-passer un plantage. Je préfère qu'il plante et que je sache où pour corriger.
EDIT: Erreur Sub ou fonction non définie sur le "GetControlChange"
Re,
Sur ta réponse:
Bon la procédure Initialize ne fonctionne pas correctement. J'ai la liste déroulante dans les cmb_Entrée/Sortie au lieux d'avoir la valeur pas défaut (Le texte)
Ensuite le GetControlChange me renvoi une erreur j'ai cherché sur le net je ne trouve aucun trace de cette fonction doc ne sais pas quoi faire.
Sur mon message d'hier:
Mon code fonctionne correctement j'avais oublié un .text dans le code que j'avais posé ici précédemment. Cela affiche donc bien les bonnes liste en fonction du cmbPN_Class.
Salut,
J'ai la liste déroulante dans les cmb_Entrée/Sortie au lieux d'avoir la valeur pas défaut (Le texte)
J'étais donc bien réveillé ce jour là ColumnWidth= "1 pt; 0 pt" cache bien la deuxième colonne qui est la colonne du texte. Tu dois afficher la colonne 2 est renvoyer la colonne 1. donc :
'...
ColumnWidths = "0 pt" ' // Cache la première colonne la deuxième est de longueur par défaut.
ColumCount = 2 ' // Deux colonnes
BoundColumn = 1 ' // C'est la colonne 1 qui est renvoyée sur sélectionEn fait si tu avais Renseigné ColumnWidths = "-1 pt; 0 pt", Cela aurait fonctionné, Mais avec "1 pt; 0 pt" tu te retrouve avec une colonne de 1 point et une cachée"
Mon code fonctionne correctement j'avais oublié un .text dans le code que j'avais posé ici précédemment.
Je comprends que certaines personnes ne veulent pas mettre le code définitif sur la toile, Donc si tu poste un exemple, une bonne habitude consiste a reprendre toujours le même code, une fois que celui-ci correspond au fonctionnement souhaité alors là tu le bascule dans ton application.
Il faut aussi bien comprendre aussi que nous ne sommes pas dans votre tête. Si dans ton classeur tes contrôles sont nommés (ex: cmbEntree et pas ComboBox7) Alors tu dois prendre une minute pour les nommés sur ton classeur exemple, cela évitera les erreurs, et les pertes de temps.
Et donc du coup tout fonctionne comme tu le souhaite ?
Salut Jean-Paul,
Oui c'est jamais évident, que ce soit de s’expliquer ou de répondre à quelqu'un, j'ai souvent le soucis sur un forum informatique ou contrairement à ici je suis acteur plutôt que novice.
Tout fonctionne à merveille désormais, il me reste à mettre les vérifications d'usage (Dossier image, ne pas valider si cmb non remplit etc..) et revoir aussi la gestion des bouton en regardant ton code, elle est différente de la mienne mais semble bien plus simple.
En tout cas un énorme merci pour le temps que tu as passé à m'aider, le WriteOnReference et le GetTheValue sont des outils vraiment géniaux une fois qu'on a compris le principe. Sur certains de mes macros ça va facilement diviser par 4/5 le nombres de lignes. Difficle à comprendre sur le coup mais ca valait la peine de passer quelques nuit à les étudier et les tester
Salut,
C'est toujours un plaisir de pouvoir aider.
Bonne programmation.
Merci, c'est de mon côté toujours un plaisir de progresser grâce à des personnes comme vous ;)
Bonjour Jean-Paul,
J'ai une question qui suit un peu ce sujet. Le XLTool que tu m'as donné peut-il fonctionner pour une liste déroulante (Validation de données) dans une cellule qui renverrai une valeur en fonction de la sélection ? Je t'ai mis un fichier en pièce jointe. J'aimerai passer en VBA pour trouver la valeur équivalente en fonction d'une validation de données pour qu'elle soit utilisable sur des macros.
Cordialement.
Solution plus simple trouvée en créant une liste matière pour la colonne 1 et liste onglet en colonne 2.
If Not Application.Intersect([Matière], Range(Target.Address)) Is Nothing Then
Set Recherche = [Liste_Matière].Find(What:=[Matière], LookAt:=xlWhole)
Ligne = Recherche.Row
Colonne = [Liste_Onglet].Column
Données.Range("A5") = Gestion.Cells(Ligne, Colonne).Value