[RESOLU] [VBA] Remplacement valeur via listbox

Remplacement valeur via listbox [RESOLU] [VBA] - VB/VBA/VBS - Programmation

Marsh Posté le 17-04-2014 à 19:50:27    

Bonjour à tous,
 
Voici ma demande :
 
Je souhaite selon l'information d'une cellule la remplacer par une autre via une listbox.
 
Pour être clair, lorsque je clique sur un bouton :
 1) une macro se lance avec boucle
 2) La donnée de la cellule est stockée (ex : 011601615601 Tarte aux pommes XDDFSFF54546).
C'est là que je souhaite  
3) Afficher une listbox avec des choix (ex: Tartes aux pommes ou Fenêtres ou Avion ou Magasin) , choisir "Tartes aux pommes"
4) La valeur de la cellule change et passe à la cellule suivante.
 
Est-ce possible ou pas?
 
Merci pour vos réponses.


Message édité par vb_user le 06-05-2014 à 11:29:33
Reply

Marsh Posté le 17-04-2014 à 19:50:27   

Reply

Marsh Posté le 18-04-2014 à 09:38:00    

 
           Bonjour,
 
           pas clair du tout !
 
           Et une ListBox est utile en saisie manuelle, pas d'intérêt dans un code.
 
           Il y a des fonctions texte s'il est seulement question d'extraire le texte entre le premier et le dernier espace …
 

Reply

Marsh Posté le 18-04-2014 à 10:15:03    

Je fais des extractions de mon compte bancaire.
Et je me retrouve avec des lignes contenant des chiffres et des lettres.
Mon but est de reformater la colonne libellée.
Donc mon document excel, j'ai un bouton que j'ai appelé "Reformatage_fichier", il analyse ligne par lignes les libellés et reformate mes lignes via un Case Select.  
Je voudrais changer la totalité du contenu de la cellule par un nouveau texte. Le problème est que selon les dates, le libellé sera différent. Mais avec une listbox, je pourrai sélectionner le nouveau texte qui correspond aux libellés.


Message édité par vb_user le 18-04-2014 à 10:23:58
Reply

Marsh Posté le 18-04-2014 à 11:55:43    

 
           Sans voir le code (avec l'icône dédiée pour le baliser) ni d'exemples précis, toujours un peu flou !
 
           ListBox -> saisie manuelle, pas dans le cadre d'un automatisme …
 

Reply

Marsh Posté le 23-04-2014 à 15:58:23    

voici le code mon bouton :
--------------------------------------------------------------------
Sub Replace_btn_Click()
 
    Dim i As Integer
    Dim Valcel As Variant
    Dim max_boucles As Integer
    Dim IndexTab As Integer
    Dim Info As Integer
    Dim TabRech
    Dim NbCellTab As Integer
   
    max_boucles = 40 'limite de répétitions de la boucle est définie
    On Error Resume Next
     
      'Alimente les éléments du tableau
        TabRech = Array("VIRMT COMPTE ", _
        "CARTE ", ...)
 
     
    NbCellTab = UBound(TabRech)
 
    For i = 2 To 39 'Boucles prévues : 39
         
        Range("A" & i).Select
        If (i > max_boucles) Or (Range("A" & i).Value = "" ) Then 'Si A1 est vide ou contient un nombre < 7, diminution du nb de boucles
           Exit For 'Si condition vraie, on quitte la boucle For
        End If
        Valcel = Range("A" & i).Value
       
        For IndexTab = 0 To NbCellTab
            Info = InStr(Valcel, TabRech(IndexTab))
             
            Select Case TabRech(IndexTab)
               Case TabRech(0)
                    ActiveCell.Replace What:=TabRech(0), Replacement:="VIRMT-", _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
                        False, ReplaceFormat:=False
                    Cells.Find(What:=TabRech(0), After:=ActiveCell, LookIn:= _
                        xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
                        xlNext, MatchCase:=False, SearchFormat:=False).Activate
               Case TabRech(1)
      ...
      Case TabRech(2)
      ...
                 
            End Select
             
        Next
    Next
 
End Sub
 
--------------------------------------------------------------------
C'est cette partie qui m'ennnuie :
 Select Case TabRech(IndexTab)
               Case TabRech(0)
                    ActiveCell.Replace What:=TabRech(0), Replacement:="VIRMT-", _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
                        False, ReplaceFormat:=False
                    Cells.Find(What:=TabRech(0), After:=ActiveCell, LookIn:= _
                        xlFormulas, LookAt:=xlPart, SearchOrder:=xlByRows, SearchDirection:= _
                        xlNext, MatchCase:=False, SearchFormat:=False).Activate
 
            End Select
 
Car je suis obligé à chaque ligne d'extraction, d'alimenter manuellement mon tableau + mon select.
 
Aujourd'hui j'ai mis 15 éléments dans mon tableau avec le select (qui lancement l'opération de remplacement du libellé) qui s'accompagne; Le problème est que les dates changent. On aura pour le 15/04 une opération avec BLABLA 15/04 BLABLA et le lendemain BLABLA 16/04 BLABLA et le renommage devient caduc.
 
est-ce plus précis?

Reply

Marsh Posté le 23-04-2014 à 19:40:32    

 
           Heu … En clair, sans décodeur ?
 

Reply

Marsh Posté le 23-04-2014 à 20:58:43    

Au vu des efforts pour formuler vos réponses, je pense me débrouiller par moi-même.

Reply

Marsh Posté le 24-04-2014 à 13:54:47    

 
           La qualité des réponses dépend de la qualité de la présentation !
 
           Dans  l'initiale comme celle de l'avant dernier message - du reste déjà où est le rapport entre les deux ?  :sarcastic:  -
           ce n'est franchement pas évident à décrypter, en particulier dans l'avant dernier message …
 
           L'effort doit être du côté du demandeur et du reste, aucun autre intervenant ne s'est manifesté …
           Ne pas s'étonner alors que des sujets de ce genre restent sans réponse !
 
           A consulter …
 
           

Reply

Marsh Posté le 24-04-2014 à 17:45:07    

J'ai essayé d'être le plus précis possible !
 
Je vais tenter de l'être encore plus.
 
Sur Excel :
 
Colonne A : Contient des libellés de type (VIRT BLABLA, CB  120414,...)
 
J'ai créé un bouton via le menu "Développeur" auquel je lui ai rattaché une macro.
 
Aujourd'hui dans ma macro, j'ai créé une variable tableau qui recense un certains nombre de libellé sur mon code :  
    'Alimente les éléments du tableau
        TabRech = Array("VIRMT COMPTE ", _
        "CARTE ", ...)  
 
Ensuite je lance un select case qui remplace le texte de la cellule active :
       Select Case TabRech(IndexTab)
               Case TabRech(0)
                    ActiveCell.Replace What:=TabRech(0), Replacement:="VIRMT-", _
                        LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:= _
                        False, ReplaceFormat:=False  
 
Le truc que je voulais faire c'était d'automatiser le script (renommer les libellés de manière + clair)  au maximum. La seule idée qui m'est venue au lieu d'alimenter mon tableau puis ajouter le case correspondant, était d'ouvrir une fenêtre de type popup mais contenant une liste de libellé à choisir et une fois le choix fait. La cellule active était modifié selon mon choix sur la listbox.

Reply

Marsh Posté le 24-04-2014 à 17:58:01    

 
           Je suis peut-être bouché mais je ne vois pas comment avec une ListBox (à moins que cela n'en soit pas une !) …
 
           Si tous les libellés sont du genre "011601615601 Tarte aux pommes XDDFSFF54546" à transformer en "Tarte aux pommes",
           suffit soit juste de supprimer la référence avant le premier espace et celle après le dernier espace
           ( est-ce vraiment si difficile à formuler ? Quel effort ‼  :sarcastic: )  
           soit de comparer la présence d'un mot au sein d'une liste par exemple dans une variable tableau …
 
           Bref, en donnant des exemples de libellés sources puis leurs correspondances après modification …
 
           Pourquoi la cellule active ?
 

Reply

Marsh Posté le 24-04-2014 à 17:58:01   

Reply

Marsh Posté le 24-04-2014 à 18:32:48    

J'ai pris le choix d'une listbox qui me semblait simple dans ma reflexion.
 
--------------------------------------------------------------------
suffit soit juste de supprimer la référence avant le premier espace et celle après le dernier espace  -----------------------------------------------
ça c'est si le libellé est toujours le même sauf que pour certains libellés ont uen composition particulière  : ex : CB *46454 03042014 PAYPAL 91PARIS ou  CB *46454 03042014 XMSXS APPLE 02 PARIS 2e.
Comment feras-tu?  
Si dans le 1ere exemple, avec une commande de type split avec séparateur " " (espace) , je vais récupérer CB + PAYPAL, ca donnera Decoupe(0) + Decoupe(3)
Alors que dans le 2e exemple,  avec une commande de type split avec séparateur " " (espace) , je vais récupérer CB + APPLE, ca donnera Decoupe(0) + Decoupe(4)
Pour le déterminer de manière automatique, c'est compliqué.
 
Pourquoi la cellule active ? => avec Excel, dans le code, il faut activer la cellule avec NomCellule.Activate pou sélectionner la cellule sur laquelle on souhaite travailler.
 

Reply

Marsh Posté le 24-04-2014 à 19:41:44    

 
           Un bon code n'utilise pas ces affreux ralentisseurs  Select  &  Activate  !   Exemple ici
 
           Sinon solution sans code en utilisant le B-A-BA d'Excel !
 
           Dans une feuille de paramétrage du classeur ou dans un coin d'une feuille qui ne risque pas d'être effacé,
           saisir dans une colonne quelques libellés type. Sélectionner les saisies puis nommer cette liste par exemple LIBELLES …
           Ensuite, sélectionner la colonne source des libellés à modifier puis cliquer sur  Validation…  
           soit sur son icône soit via un menu (tout dépend de la version d'Excel, rechercher dans l'aide si besoin) …
           Y autoriser une Liste en spécifiant la Source =LIBELLES …   Décocher les options si besoin dans les autres onglets.
 
           Lorsqu'une cellule est sélectionnée dont la validation a été définie, une flèche apparaît afin d'ouvrir la liste …
           Quand un libellé ne figure pas, l'ajouter dans la zone du nom LIBELLES …
 

Reply

Marsh Posté le 05-05-2014 à 14:24:07    

Bonjour,
 
Désolé pour la réponse tardive.
 
Je ne souhaite pas utiliser le système de liste, je préfère l'automatisation.
 
J'ai regardé ton lien. Mais je ne vois pas par quoi les remplacer?
 
Te faut-il un bout de code pour voir ce qui pourrais les remplacer?

Reply

Marsh Posté le 05-05-2014 à 16:43:52    

 
           Bonjour,
 
           le lien sert juste à démontrer l'inutilité et le ralentissement de Select
 
           Utiliser une ListBox n'est pas de l'automatisation et la Validation est plus simple à mettre en œuvre !
 
           Sinon il y a plusieurs manières de l'effectuer : utiliser un filtre par libellé type, l'opérateur Like ou encore la fonction Instr
           Tout dépend de l'architecture de la feuille de calculs, du tableau des libellés type et du code déjà entrepris …
 

Reply

Marsh Posté le 06-05-2014 à 09:08:17    

J'ai oublié de préciser que j'ai abandonné l'idée de la listbox.
Je pense retravaillé mon code pour travaillé comme tu le dis sur la feuille complète plutôt que cellule par cellule.
 
Autre demande :
J'aimerai mettre dans ma feuille, un code me permettant de connaitre la dernière cellule non vide tout en évitant de planter mon document, si l'opération est trop longue.
 
Merci pour tes réponses.

Reply

Marsh Posté le 06-05-2014 à 09:42:19    

 
           Opération longue ? C'est instantané !
           Au moins trois méthodes pour trouver la dernière cellule non vide mais tout dépend par rapport à quoi ?
 
           Une colonne (infos ici et exemple là),
           la plage utilisée (via la méthode UsedRange et la propriété Count ou encore via la méthode Find), … ?
 
           De la précision nait la solution !
 

Reply

Marsh Posté le 06-05-2014 à 09:48:19    

Pour deux choses :
- Connaitre le début et la fin d'un tableau, exemple de résultat A1:D30.
- Connaitre la dernière cellule d'une colonne précise.

Reply

Marsh Posté le 06-05-2014 à 09:59:44    

 
           Pour le tableau, il y a la propriété Address, la propriété Range, …  - tout dépend si c'est un tableau déclaré
           et de la version d'Excel … -  et avec la fonction  Split  sur le ":" pour séparer début & fin …
 
           Pour la colonne c'est soit avec la propriété  End  comme dans les liens de mon précédent message
           soit via la méthode  Find  …
 

Reply

Marsh Posté le 06-05-2014 à 10:00:25    

Pour la 2e demande, j'ai vu ton lien. C'est parfait. Je m'attentait à une boucle de type For... qui lorsqu'il y a trop de donnée pourrait planter mon document. Tu as raison , c'est très rapide.
 
En revanche pour la 1ere, il faut plusieurs commandes?
Merci de ta réponse.

Reply

Marsh Posté le 06-05-2014 à 10:08:19    

 
           En fait pour la première je suis dans le brouillard par manque d'informations concrètes !
           Ne pas oublier que je suis en aveugle, donc sans précision, je ne vais pas sortir la liste des possibles …
           En VBA il y a souvent différentes méthodes pour une même problématique sans compter la version ou le contexte !
 
           Tableau : déclaré dans Excel (version ?) ou pas ? Ou un simple bloc contigu de saisies ?
 
           Sinon mettre un lien sur un classeur exemple …
 

Reply

Marsh Posté le 06-05-2014 à 10:26:23    

Non pas du tout.
Je parle d'une feuille Excel classique avec des données.
Pas d'un tableau excel créé via un code.
j'utilise Excel 2010 pourinfo.
Dans mon cas, je récupère un fichier txt que j'importe dans excel. Mais le tableau peut contenir 10 lignes comme il peut en contenir plus. Et avec cette commande, je pourrais connaitre les coordonnées exactes du tableau.

Reply

Marsh Posté le 06-05-2014 à 10:33:24    

 
           Toujours un peu flou mais j'en déduis donc l'adresse de début est forcément connue :  A1  !
 
           Donc dans le cas d'un bloc contigu,  [A1].CurrentRegion.Address  renvoie ses coordonnées.
 
           Info dans un lien et dans mes messages, suffit d'assembler …

Reply

Marsh Posté le 06-05-2014 à 10:41:11    

Ok merci pour l'information.  
 
Je vais mettre la feuille en résolu.
 
Même si les débuts ont été difficiles, merci pour ton aide.

Reply

Marsh Posté le 06-05-2014 à 10:48:39    

Dernière question....comment marquer en résolu?
 
Je suis aller sur ce lien  : http://wiki.atlas.doctissimo.fr/pa [...] Id=2491028
 
Mais je n'ai pas le "Marquer comme résolu" à coté de mon imprimante comme sur l'eemple., j'ai rien.

Reply

Marsh Posté le 06-05-2014 à 10:53:03    

 
           Cela dépend des forums, ici il n'y a pas un tel bouton …
 
           Modifier le titre du sujet du premier message en y insérant [Résolu] par exemple et merci d'y avoir pensé.
 

Reply

Marsh Posté le 06-05-2014 à 11:50:16    

C'était bien ça. Modification du premier message.
Bonne journée à toi.

Reply

Marsh Posté le 06-05-2014 à 11:54:44    

 
          Merci, à toi aussi.
 
         N'hésite pas à revenir en présentant tenants & aboutissants.  :sol:  
 

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed