Faire une condition de recherche avec un bouton option

Les 2 ème problème rencontré dans mon message précédent peut être considéré comme résolu, à moins que vous vouliez le corriger.


Pour le formulaire AjouterHonda, les 2 méthodes fonctionnent.
Toutefois, l'ajout par la méthode Bart génère 3 #REF! dans les colonnes suivantes. 04_99_TTC, 10_99_TTC, 10_2022_TTC.
C'est un peu normal, il n'ont pas leur "équivalent" en hors taxe dans ce formulaire.
Je n'ai pas trouvé comment corriger cela par votre méthode de codage. J'ai réussi via ma méthode.

NB : veuillez ne pas écraser la ligne 1497 de la référence 40215 ME9 003.
Merci d'avance.

2025 07 12 185936

J'ai essayé de mettre ça, sans succès.

                    ' pour éviter les #REF dans les cellules car calculées par le module4  de BsAlv
                    '  ColumnRange("AB") = ""     ' colonne AB     04_99_TTC
                    '    Range("AC") = ""     ' colonne AC     10_99_TTC
                    '   .ColumnRange("AC") = ""     ' colonne AC     10_99_TTC
                    '   .ColumnRange("AD") = ""     ' colonne AD     10_2022_TTC
               End If
          Next
     End With

J'ai élargi un peu le formulaire et sa ListBoxResultat car les numéros de ligne étaient en partie masqués.

re,

je continue avec le fichier de hier 20:02 et je commence avec votre premier poste.

Au début de la macro "Mon_Image(Optional N° As Integer)", j'ai modifié ceci. Donc je lis le contenu du tableau dans une matrice, je sais le numéro du listrow (Textboxnumligne décalé) et maintenant je calcule le numéro de la "ListColumn" Image1, juste en lisant son index dans le TS ! De nouveau, ce numéro de la listcolumn est le numéro de la colonne décalé de 1 parce que le TS commence en colonne B. Avec cela, plus tard dans la macro, ce n'est que ceci >>> .TextBoxNombreImage = aHonda(Ligne, Col_Image1)

With Range("tableau1").ListObject       'avec notre tableau structuré
          aHonda = .DataBodyRange.Value2     'matrice avec le contenu du tableau1
          Ligne = --.TextBoxNumLigne.Text - .Range.Row     'lire N° du listrow dans ce textbox (décalage avec le numéro de la ligne avec les entêtes (maintenant le listobject comme référence
          Col_Image1 = .ListColumns("Image1").Index     'le numéro du "listcolumn" Image1 = le numéro de la colonne mais aussi décalé de 1, cad en réalité colonne 71 mais dans le TS listcolumn 70
     End With

problème suivant, cela concerne une construction avec "With ... End With" (https://www.wallstreetmojo.com/vba-with/ ou autres). Cela est vraiment facile quand on doit faire plusieurs choses au même object, variable, ... . Donc dès qu'on voit uniquement un point devant quelque chose, on doit chercher plus haut dans la macro pour le "With"-précédent. C'est pourquoi l'indentation de la macro rend tout cela plus facile/lisible. Bon, dans l'exemple ici, c'était spécial, si on cherche plus haut dans la macro, on avait un "End With" qui fermait donc une construction "With ... End With" mais comme on peut imbriquer plusieurs constructions pareils, on peut encore chercher plus haut, mais malheureusement, il n'y avaient pas des autres. Donc VBA ne savait pas quoi faire avec le ".row" dans "If c.Row > .row + 10". Solution, j'ai déplace le "End With" après cette ligne et modifié le if ... else ... endif. C'est important que vous vous habituez à cette construction, parce qu'elle est vraiment facile, puissant et rend le total plus lisible !

 If c.Row > 10 Then Application.Goto c.Cells(1).Offset(-10), 1 Else Application.Goto .DataBodyRange.Cells(1), 1
          Application.Goto c.Cells(1)
          MsgBox "La ligne a bien été dupliquée." & vbCrLf & vbCrLf & "il faut à présent ajuster les informations et ensuite cliquer sur SAUVEGARDER.", vbInformation, "LIGNE DUPLIQUÉE"
     End With

oei 18:37, vous avez modifié quelque chose à un autre endroit, pas dans "CB_Dupliquer" de "ModificationHonda". C'était où? Sinon, vous faites la même chose qu'ici. Maintenant, je vois aussi le "End With" presque invisible en dessous votre capture d'écran ...

oei, je vois que ma construction "Ligne = --.TextBoxNumLigne.Text - .Range.Row" dans ma première correction ici dessus était aussi erroné parce que référant à une mauvaise "With"

Dupliquer se fait bien dans une nouvelle ligne en dessous le tableau, l'userform change de couleur Bizarre, colonnes AB:AD se remplissent avec des anciennes formules référant aux taux de TVA dans un autre fichier ! J'ai appliqué les formules existantes sur ces 3 colonnes, puis j'ai fait un nouveau duplicate et les formules se copient bien. Espérons que tout va bien avec cela.

Le sauvegarde de "modificationHonda" est aussi bien (sans bug).

"AjouterHonda" avec les nouvelles colonnes, c'est pour plus tard ...

Votre poste hier 19:15

problème 2, je pense aussi

Ces colonnes utilisent des données du tableau1 d'un fichier "Honda - 2025_C.xlsm" du dossier "D:\C_X_Pieces_Honda". Donc à un certain moment, quelqu'un (pas moi, car je n'ai pas un "D:\C_X_Pieces_Honda" a utilisé cette formule dans ces colonnes et comme c'est un tableau structuré, l'avantage (qui est ici un inconvéniet), TS utilise cette formule pour la nouvelle ligne. Bon, ces 3 colonnes ont des formules similaires à "=G1503*(1+TVA_Avr99)", j'ai fait F2 dans une bonne cellule, puis Excel revient avec l'écran ici dessous (avec texte français, remplacer toutes les cellules de cette colonne avec cette formule), on clcique dessus et toute la colonne aura la même formule et la prochaine fois qu'on ajoute une ligne, cette formule est utilisée !. J'avais déjà fait cela, une dixaine de lignes plus tôt dans ce poste. Bon, normallement cette erreur ne peut plus se reproduire et donc dans la méthode "papicx", vous ne devez plus écraser ces 3 cellules (avec formules). C'est vrai qu'il n'y a pas d'équivalent "hors taxe" dans le formulaire, mais l'équivalent sont les colonne G, F et P.

image

Je pense que la méthode "papicx" colle les données numérique comme texte dans le tableau, par exemple "ActiveCell.Offset(0, 1) = TextBox_Quantité ' colonne C Quantité", TextBox_Quantité est un string, donc texte, c'est un inconvenient. Voir cellule E1502, là c'est 432 en texte que papicx a collé et s'il l'avait comme numérique, Excel aurait appliqué le format numérique en le transformant visuellement en "432,00€"

D'ailleurs, columnrange est une propriété inconnue pour un range ou un listobject, c'est plutôt pour un tableau croisé dynamique etc

bon, je ne touche pas la ligne 1497

okay, l'enlargement du "listboxresultat" et si vous voulez, on peut même ajouter quelque colonnes supplémentaires si nécessaire ! Je ne sais pas s'il y a encore des choses spéciales à montrer dans ce listbox ?

Quand on clique sur Dupliquer, la copie se fait bien et j'invite la personne à faire les ajustements nécessaires.

Le fond du formulaire change de couleur pour bien faire voir qu'elle a changé de procédure.

Les boutons nouveau et dupliquer sont désactivés pour ne pas faire une copie de copie et risquer un blocage.

bon, je pense que j'ai répondu à tout.

Vous m'avez envoyé vos images "zippé",je suppose que je dois les copier dans un dossier à moi, dès que vous commencez avec vos images. Sinon, avez-vous un "zip" plus actuel dès que vous auriez un problème à ce moment ?

Bonjour Bart,

merci encore de toutes ces explications très instructives. En relisant plusieurs fois attentivement, le code dans la page de gauche et votre texte dans la page de droite, j'arrive à comprendre mais de là à les reproduire pour un cas similaire... ce n'est pas gagné.

C'est vraiment gentil à vous de vouloir me tirer vers le haut. Je garde précieusement toutes ces explications dans un coin.

J'ai supprimé toutes les lignes de test précédentes.


coté duplication, ça créé bien une ligne en avant dernière. Mais on s'en moque, du moment que ça fonctionne, c'est bon.

2025 07 13 175020

j'ai fait F2 dans une bonne cellule, puis Excel revient avec l'écran ici dessous (avec texte français, remplacer toutes les cellules de cette colonne avec cette formule)

Je ne connaissais pas cette manipulation ( F2), mais la traduction française sur ma version d'excel est : effacer toutes les cellules de cette colonne avec cette formule) ce qui est déstabilisant. Je ferai l'essai sur un fichier qui n'a plus d'importance plus tard pour voir ce qui se passe.


Je pense que la méthode "papicx" colle les données numérique comme texte dans le tableau, par exemple "ActiveCell.Offset(0, 1) = TextBox_Quantité ' colonne C Quantité", TextBox_Quantité est un string, donc texte, c'est un inconvénient. Voir cellule E1502, là c'est 432 en texte que papicx a collé et s'il l'avait comme numérique, Excel aurait appliqué le format numérique en le transformant visuellement en "432,00€"

Je suis d'accord que cette façon de faire n'est pas correcte, mais elle fonctionne.
Vous serez d'accord avec moi qu'une quantité de pièces ne peut avoir de décimale.
Ne sachant pas contourner/empêcher le code des nombres d'appliquer des décimales, j'avais fait cela.

D'ailleurs, nous avons le cas dans la colonne des cylindrées cyl_500 , colonne AG, qui enregistre "500,00" dans une colonne censée être en standard.
Je retrouve des valeurs "500,00" en numérique avec 2 décimales quand je les découvre.
Je n'arrive pas à trouver la circonstance exacte qui fait cela.
Je vais faire des tests pour tenter de débusquer quand cela se produit.

Ce qui est curieux, c'est que cela se produit que sur cette colonne. Les colonnes cyl_500 et cyl_500 ne sont pas impactées par ce dysfonctionnement.


Serait il possible depuis la page Feuil3(Honda) de créer une macro qui efface le filtrage qui a été créé par le formulaire de recherche ?
actuellement, je dois relancer le formulaire de recherche et cliquer sur le bouton "Fermer".

2025 07 13 182739
Private Sub CommandButtonEnleverFiltrage_Click()
     ' enlève le filtrage fait par le formulaire de recherche

End Sub

ce fichier, cette version 13 B contient plusieurs images supplémentaires et qq références aussi.


Les photos... à mettre dans un sous dossier Photos sous le fichier Excel.

re,

j'ai maintenant mon propre dossier "D:\C_D_Pieces_Honda\Photos" et cela à l'air de fonctionner

Concernant la traduction "déstabilisant", cela sonne pire en français qu'en néerlandais, donc pourque vous soyez plus à l'aise, faites des essais dans un autre fichier. Je ne sais pas pourquoi, mais de temps en temps, quand je change une formule dans une colonne d'un TS, je ne vois pas directement ce message, mais je dois faire F2 et puis Enter dans cette cellule et puis je vois le message et je clicque dessus.

Concernant ce string ou valeur numérique, avec ma méthode et avec un "N" dans la colonne AG de la feuille "Liste", un texte est traduit en numérique et collé dans la cellule et c'est le formattage de la cellule qui montrera des integers en cas de "Quantité" ou éventuellement un format monétaire. Donc avec la méthode "Papicx" si on fait par exemple ActiveCell.Offset(0, 3) = val(TextBox_DPC_HT_€.text) (je ne l'ai pas testé, peut-être il faut encore échanger les points et les virgules), on atteint la même chose. Bon, mais pour le moment, c'est une discussion moins importante. Savez qu'un texte s'aligne à gauche et un numérique s'aligne à droit dans une colonne sans alignement, donc élargez la colonne (par exemple 2 fois le largeur originale et on voit directement les 2)

Le bouton "Enlever filtrage" fonctionne maintenant et j'ai ajouté une alternative dans la macro. Quand on sait le nom du tableau et de sa colonne, c'est plus facile à faire des choses de telle manière et si on ajoute ou supprime des colonnes, on n'a rien à changer en VBA. Il y a 2 problèmes, VBA n'aime pas vraiment les accents, donc, j'ai eu un problème lorsque je donnais un fichier à une personne et qu'elle me le redonnait que VBA avait remplacé tous les charactères spéciaux par quelque chose différente, ambétant !!! 2ième problème, une macro dans le module d'une feuille est de temps en temps moins intelligente. Par exemple avec de plage nommées des tableaux structurés, souvent on doit y ajouter la feuille pour que cela fonctionne, c'est pourquoi, j'ai ajouté "Me." comme préfix, pour dire que c'est la feuille elle-même. Si je mets la macro dans un module ordinair, cela n'était pas nécessaire. Donc moi, je n'ai que les macros des évenements dans les modules des feuilles (à part des exceptions). Je vois que vous utilisez des boutons "Formes", ils ont le désavantage que la macro doit se trouver dans le module de la feuille. Si vous utilisez une forme comme bouton, vous pouvez utiliser toute votre créativité (ajouter des images etc) et mettre sa macro dans une module ordinaire ... (voir votre photo = enlever filtrage, petite plaisanterie)

Pour le "cyl_500", j'ai modifié le formattage des colonnes AE:AG du tableau en "Texte". Comme-ça, Excel n'essayera pas à être plus intelligent que nécessaire en transformant un texte "numérique" en une valeur numérique. J'ai fait la même chose pour les colonnes AM:AU, peut-être vous pouvez modifier encore des autres colonnes qu'excel ne peut pas toucher pour éviter votre experience "Je n'arrive pas à trouver la circonstance exacte qui fait cela.."

image

Bonjour Bart,

Concernant la traduction "déstabilisant", cela sonne pire en français qu'en néerlandais,

comme il y avait une erreur dans la colonne BK qui appliquait la tva_BK plutôt que la tva_actuel, je me suis risqué sur le dernier fichier de ce jour et, comme je le pensais, c'est la traduction française qui est fausse. Ce n'est pas la première fois que je vois ça.

En fait, il écrases les autres cellules de la colonne par la nouvelle formule de la cellule sélectionnée.
J'avais bien sûr commencer par vérifier les codes VBA dans les 2 formulaires et ils sont bons depuis longtemps.


Il y a 2 problèmes, VBA n'aime pas vraiment les accents, donc, j'ai eu un problème lorsque je donnais un fichier à une personne et qu'elle me le redonnait que VBA avait remplacé tous les charactères spéciaux par quelque chose différente, ambétant !!!

ok, cela nous avait été signalé il y a quelques temps. Je vais voir pour supprimer les accents des TextBox et autres.


Je vois que vous utilisez des boutons "Formes", ils ont le désavantage que la macro doit se trouver dans le module de la feuille. Si vous utilisez une forme comme bouton, vous pouvez utiliser toute votre créativité (ajouter des images etc) et mettre sa macro dans une module ordinaire ... (voir votre photo = enlever filtrage, petite plaisanterie)

Je ne comprends pas vraiment de quoi on parle. pour mes boutons, j'ai utilisé "insertion / controle ActiveX" et j'ai fait les macros comme j'ai pu.
je ne vois aucune "réaction" de la photo quand je supprime le filtrage. J'ai du mal comprendre votre explication...
Je ne trouve pas où sont les codes VBA correspondant à la photo.


Pour le "cyl_500", j'ai modifié le formattage des colonnes AE:AG du tableau en "Texte". Comme-ça, Excel n'essayera pas à être plus intelligent que nécessaire en transformant un texte "numérique" en une valeur numérique.

il me semble que Excel ne transforme durablement en texte que les cellules vides au préalable... On verra bien. Merci tout de même de cette attention.


curieusement, la mise en forme automatique qui colorise la ligne en vert clair, ne fonctionne pas très bien.
à chaque retour de fichier je découvre une liste impressionnante de MFC avec des lignes sélectionnées différentes.
peut-on "fixer" ce défaut ou bien faire tout autrement ?


J'ai une demande, tout autre.
Je voudrais "retarder" une fermeture d'un futur formulaire de 1 à 2 secondes, idéalement 1,5.
existe une telle fonction dans VBA avant le "unload.me" pour fermer ?

Merci d'avance.

Bonjour Bart,

J'ai supprimé tous les accents des titres de colonne du tableau1 et modifié les codes VBA en relation.
idem des formulaires et du tableau19 bien entendu.
Apparemment, je n'ai rien oublié puisque tout fonctionne.

Je suis parti de votre dernier fichier, bien sûr.

re,

je vous reponds plus tard, mais concernant la pause de 1.5 sec, Excel a son "Wait" et son "Sleep"avec leur propres avantages et inconvenients. (https://analystcave.com/vba-sleep-vs-wait/)

Sleep fonctionne en millisecondes, donc votre 1.5 sec est possible, mais excel semble s'endormir, ne réagit plus sur n'importe quoi. Si ce délai n'est pas grand, ce n'est pas un problème, mais si vous dites qu'excel doit s'endormir pendant plusieurs secondes, cela a l'air que votre ordinateur est vraiment en coma. (macro "delai3")

Wait est moins radical mais ne connait pas des miliisecondes, c'est minimum en secondes. C'est comme la trotteuse d'une horloge qui avance seconde par seconde. Siv vous voulez attendre 2 secondes et vous faites cela juste au moment où la trotteuse avance ou vous faites cela juste avant la trotteuse avance la prochaine fois, le résultat est le même : au 2ieme mouvement de la trotteuse, le"wait" est fini. Donc un wait de 2 secondes peut prendre entre 1 et 2 secondes et si on le fait 100 fois par exemple, une moyenne de 1.5 sec. Si cet écart ne vous embête pas, voilà votre solution facile (macro "delai1"),

Si vous voulez "exactement" 1.5 sec, il faut utiliser "timer", qui vous montre les secondes cumulées pendant la journée, donc une valeur double entre 0 et 86.400 (24 * 60 * 60). Si on dépasse minuit, timer saute de 86400 à 0, cela est embêtant à ce moment. Mais pour le reste, le résultat sera 1.5 secondes , (macro "delai2"). Timer a aussi une précision de quelques dizaines de millisecondes, donc oubliez son 3ième chiffre (les millisecondes). Si la cellule J3 vous montre 1.521 secondes, ces 21 millisecondes, c'est pour la plupart une erreur de mesure.

Il y a encore une autre méthode si on veut vraiment mesurer en millisecondes sans cette erreur d'une dizaine de millisecondes, c'est avec des ticks, mais c'est trop sophistique pour ici !

Bon en PJ, 3 macros.

Et pour votre userform, je propose

  • oubien de copier la macro "Attendre" vers un module normal (lequel, à vous le choix) de votre fichier et puis dans le userform, vous ajouter une ligne "Attendre 1.5" comme dans la macro "M_delai2" juste avant votre "Unload me" >>> le delai sera 1.5 sec exact
  • oubien simplement ajouter "Application.Wait Now + TimeSerial(0, 0, 2)" avant votre "Unload me" (comme dans la macro "M_delai1") >>> alors le delai sera entre 1-2 secondes et en moyenne votre 1.5 sec.
8papicx.xlsb (19.37 Ko)

Bonsoir,

Vous êtes tout simplement génial. J'ai vu, je vais tester au moment où ce sera nécessaire mais je pense que le Attendre 1.5 sera ce choix, sauf si des dysfonctionnements sont constatés.

Merci bien.


Rechercher des sujets similaires à "condition recherche bouton option"