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 :

Attribuer une valeur à une variable en fonction d'une autre [XL-2010]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 18
    Points
    18
    Par défaut Attribuer une valeur à une variable en fonction d'une autre
    Bonjour,

    J'ai un fichier global avec le nom des villes et le code postal.

    Dans un onglet test2, je selectionne une liste de ville.

    Comment attribuer le code postal correspondant à cette liste sous vba?

    J'ai pensé à la fonction index mais ça n'aboutit pas, d'autant plus qu'il faudra une sorte de boucle qui va parcourir la liste des villes!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub associer()
     
    'je cherche mes donnees dans l'onglet "fichier global". La cellule "A" correspond à mon code postal et cellule "B" à ma ville
     
         Sheets("test2").Select
         codepostal = Application.WorksheetFunction.Index(Sheets("fichier_global").Range("A2:L65536"), 1, 1)
    End Sub
    Merci pour votre aide

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Une piste avec le code suivant (adaptez la valeur de la variable Ville à votre usage)
    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
    Sub associer()
    Dim S As Worksheet
    Dim Ville As Variant
    Dim CodePostal As Variant
    '---
    Ville = "mars"  'Recherche de la ville "mars" (à adapter)
    '---
     
    'Je cherche mes donnees dans l'onglet "fichier global"
    Set S = Sheets("fichier_global")
    'La cellule "A" correspond à mon code postal et cellule "B" à ma ville
    With Application.WorksheetFunction
      CodePostal = .Index(S.[a:a], (.Match(Ville, S.[b:b], 0)))
    End With
    MsgBox CodePostal & " " & Ville
    End Sub

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    bonjour,

    merci pour votre reponse. ça fonctionne bien pour la fonction index.
    le probleme maintenant est au niveau de la boucle.
    Mes valeurs villes varient, et je voudrai avoir une boucle qui parcourt cette liste de ville et alimente la colonne du code postal:

    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
    Sub associer()
    Dim S As Worksheet
    Dim ville As Variant
    Dim Code As Variant
    '---
    'je pense qu'à ce niveau, faudra que j'intègre ma boucle
    ville = Sheets("test2").Range("AA2").Value 'Recherche la ville qui varie
     
    Set S = Sheets("fichier_global")
    'La cellule "A" correspond à mon code postal et cellule "B" à ma ville
    With Application.WorksheetFunction
      Code = .Index(S.[A:A], (.Match(ville , S.[B:B], 0)))
    End With
    Sheets("test2").Range("AB2") = Code 'note le code postal ailleurs
    End Sub
    Merci pour votre aide

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bonjour,

    Le mieux est de faire une fonction personnalisée.
    Copiez le code suivant dans un module standard
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Function CodePostal(Cellule_Ville As Range) As Variant
    Dim S As Worksheet  'La feuille contenant la liste des villes et la liste des codes
    '---
    Set S = Sheets("fichier_global")
    'La cellule "A" correspond à mon code postal et cellule "B" à ma ville
    On Error GoTo Erreur    'si aucune correspondance, on sort et la fonction renvoie une chaîne vide
    With Application.WorksheetFunction
      CodePostal = .Index(S.[A:A], (.Match(Cellule_Ville, S.[B:B], 0)))
    End With
    Exit Function
    '---
    Erreur:
    CodePostal = ""
    End Function
    1) Dans une colonne d'une feuille (AA par exemple), tapez plusieurs noms de villes (par exemple : 12 villes de AA2 à AA13)
    2) Dans une cellule de votre choix (par exemple AB2) tapez la formule =codepostal(AA2)
    3) Tirez cette cellule jusqu'à AB13 de manière à ce que la formule qu'elle contient soit recopiée dans toutes les cellules suivantes

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2013
    Messages : 21
    Points : 18
    Points
    18
    Par défaut
    Merci pour votre retour, mais je ne pouvai pas utiliser votre solution parceque je ne peux pas taper de formule dans l'onglet test. tout doit etre fait dans le code.
    Du coup j'ai trouvé la boucle qui parcourt ma liste:

    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
    17
    18
    19
    20
    21
    Sub associer()
    Dim S As Worksheet
    Dim ville As Variant
    Dim Code As Variant
    '---
    'ville = Sheets("test2").Range("AA2").Value 'ma valeur stockee qu on cherche a coder
        Dim ville (1 To 65000) As Variant
         lastRow = Sheets("test2").Range("AA65536").End(xlUp).Row
            j = 1
            For i = 2 To lastRow
                ville (j) = Sheets("test2").Cells(i, 27).Value
     
                    Set S = Sheets("fichier_global")
                    'La cellule "A" correspond à mon code postal et cellule "B" à ma ville
                    With Application.WorksheetFunction
                    Code = .Index(S.[A:A], (.Match(ville (j), S.[B:B], 0)))
                    End With
                    Sheets("test2").Cells(i, 28) = Code
            j = j + 1
            Next i
    End Sub

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2009
    Messages : 652
    Points : 1 219
    Points
    1 219
    Par défaut
    Bravo pour avoir su adapter à votre usage.

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

Discussions similaires

  1. Reprendre une valeur de cellule en fonction d'une autre
    Par mauriceguillier dans le forum Excel
    Réponses: 14
    Dernier message: 25/01/2014, 18h54
  2. Réponses: 2
    Dernier message: 18/11/2012, 11h25
  3. [XL-2003] Mettre une couleur de cellule en fonction d'une valeur.
    Par kev159 dans le forum Excel
    Réponses: 2
    Dernier message: 31/08/2010, 15h26
  4. Réponses: 11
    Dernier message: 29/05/2007, 08h05
  5. Réponses: 1
    Dernier message: 03/05/2007, 08h10

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