IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Comment ne pas écraser une formule? [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 63
    Points : 44
    Points
    44
    Par défaut Comment ne pas écraser une formule?
    Bonjour à tous,

    j'ai un petit problème avec un tableau faisant appel à la fonction rechercheV

    voila : j'ai un tableau de deux colonnes. Dans la premiere, chaque cellule est en fait une liste déroulante avec plusieurs valeurs. La deuxieme colonne fait elle appel à la fonction recherchev pour aller prendre dans un autre tableau la valeur correspondante à celle choisie dans la liste déroulante.
    Jusque là pas de problème. Le fichier joint illustre ce que je viens de décrire.

    Là on cela se complique, c'est que j'aimerai que l'on puisse modifier manuellement les valeurs de la colonne B. Par exemple, dans le fichier joint, on a en A1 : Valeur B et en B1 : 12. Il faudrais que l'on puisse modifer le 12 manuellement (en 45 par exemple), tout en gardant la cellule A1 inchangée (Valeur B). Puis par la suite, il faudrais que si l'on change A1 en sélectionnant valeur A, la cellule B1 fait de nouveau appel à la fonction RechercheV (et affiche 10).

    Le problème est que lors de l'entré manuelle, on écrase la formule de la cellule, et on la rend donc "inutilisable" par la suite. Y'a-t-il donc une astuce pour contourner cela. J'avais pensé à stocker la formule dans une autre cellule, puis "envoyer" la valeur de celle-ci en B1. Cela permettrait de pouvoir modifier B1 à volonté puisqu'aucune formule n'y est écrite.

    J'espère avoir été clair dans ma demande. n'hésitez pas à me demander des précisions si besoin. D'avance merci pour vos réponses !
    Fichiers attachés Fichiers attachés

  2. #2
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    bonjour,

    tu ajoute une colonne(X) dans laquelles tu pourra mettre ta valeur manuelle

    tu change la formule de la deuxieme colonne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    =SI(X1<>"";X1;Recherchev....)
    tu ajoute dans l'événement change de la feuille

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns(1)) Is Nothing Then Cells(Target.Row, 2).Clear
    End Sub
    a adapter selon ta mise en forme bien sur
    Alleï Bonjour chez vous!

  3. #3
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Bonjour,

    si je comprend bien ta proposition, il faut donc une nouvelle colonne réservée aux entrées manuelles de l'utilisateur? N'y-at-il pas moyen de faire cela dans la 2eme colonne (pour garder un format de tableau à 2 colonnes)?

    De plus, l'évenement que tu m'as proposé supprime bien la valeur de la 2eme colonne, mais sa formule aussi. La recherche verticale dans le tableau ne peut donc plus être effectué.

    J'espère que je ne suis pas passé à coté de qqch ds ta réponse, si c'est le cas je m'en excuse d'avance.

    Merci

  4. #4
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    on peux imaginer se passer de la formule dans la colonne b

    tu peux simplement changer le code de l'évenement change de la feuille
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns("A:A")) Is Nothing Then
        Target.Offset(0, 1) = Application.WorksheetFunction.VLookup(Target, [Tableau], 2, False)
    End If
    End Sub
    donc, pour chaque changement dans la colonne a il va chercher la correspondance dans le tableau
    Alleï Bonjour chez vous!

  5. #5
    Expert éminent sénior Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Points : 31 877
    Points
    31 877
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim c As Range
    If Target.Column = 1 Then
        If Target.Count = 1 Then
            Set c = Range("Tableau").Columns(1).Find(Target.Value, LookIn:=xlValues, lookat:=xlWhole)
            Application.EnableEvents = False
            If Not c Is Nothing Then
                Target.Offset(0, 1).Value = c.Offset(0, 1).Value
                Set c = Nothing
            Else
                Target.Offset(0, 1).ClearContents
            End If
            Application.EnableEvents = True
        End If
    End If
    End Sub
    Cordialement.
    J'utilise toujours le point comme séparateur décimal dans mes tests.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    D'accord, compris !

    cela marche tres bien, merci beaucoup pour ton aide. Il y'a juste un petit souci (propre à mon cas), c'est que dans mon fichier (dont le fichier exemple n'était qu'un extrait) il y a en colonne A d'autres cellules que celles contenant des listes déroulantes. Et il ne faudrait donc pas que l'évenement se déclenche si celles-ci sont modifiées. Il faudrait rajouter à ton code une condition pour vérifier que la cellule de la colonne A est une liste déroulante

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns("A:A")) Is Nothing Then
    If Intersect(Target, Columns("A:A")) Is (LISTE DEROULANTE) Then
        Target.Offset(0, 1) = Application.WorksheetFunction.VLookup(Target, [Tableau], 2, False)
    End If
    End If
    End Sub
    Est-ce que tu sais comment coder cette condition (ou qqun d'autre?)

    En tt cas merci pour ta réponse, cela m'a permis de bien avancer

  7. #7
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    si cela fait partiee d'un tableau, je suppose que l'on peux siomplment restreindre le champs d'application

    du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Not Intersect(Target, Range("A2:A10")) Is Nothing Then
    Alleï Bonjour chez vous!

  8. #8
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Malheuresement non, le champ d'application n'est pas établi
    La feuille Excel que je programme crée des lignes au fur et à mesure, en fonction de différentes entrées de l'utilsateur. Aucun moyen donc de prévoir à l'avance où seront les listes déroulantes (cela peut etre aussi bien de A2 à A10, que de A12 à A15 puis de A18 à A23)
    La seule certitude est qu'elles sont tjrs situées ds la première colonne
    Toute la difficulté est donc là...

  9. #9
    Membre expérimenté Avatar de mayekeul
    Inscrit en
    Août 2005
    Messages
    1 369
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 1 369
    Points : 1 665
    Points
    1 665
    Par défaut
    alors, on peux contourner

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Columns("A:A")) Is Nothing Then
        Dim C As Range
        Set C = Range("Tableau").Find(Target)
        If Not C Is Nothing Then
            Target.Offset(0, 1) = C.Offset(0, 1)
        End If
    End If
    End Sub
    Alleï Bonjour chez vous!

  10. #10
    Membre du Club
    Inscrit en
    Mars 2010
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Ca fonctionne parfaitement!

    Merci beaucoup pour ton aide mayekeul, tu m'as vraiment bien fais avancer sur mon fichier.

    Cordialement

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Comment ne pas utiliser une #table
    Par elsuket dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 06/06/2007, 15h19
  2. [SQL] Comment ne pas exécuter une clause WHERE si une var est nulle
    Par charlysquare dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 01/05/2006, 21h12
  3. Ne pas écraser la formule est-ce possible ?
    Par boosty dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 25/04/2006, 14h40
  4. [][Excel] Comment ne pas détruire les formules ?
    Par flyangelNext dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/07/2003, 11h38
  5. Comment ne pas rejouer une animation après un clic ?
    Par mmmmhhh dans le forum ActionScript 1 & ActionScript 2
    Réponses: 4
    Dernier message: 04/09/2002, 16h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo