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 :

Nom de plage de colonnes [XL-2000]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Par défaut Nom de plage de colonnes
    Bonjour le forum,

    Je souhaite que les fêtes de Noel se soient bien déroulées pour vous, et que les préparatifs de fins d'années se passeront tout aussi bien.

    J'ai un petit soucis vba que je n'arrive pas à résoudre malgré les différentes FAQ consultées.

    j'aimerais créer une macro qui me permette d'attribuer un nom de plage à certaines colonnes lors de l'activation de ma feuille "base".
    sur cette feuille, il arrive parfois que l'on rajoute/supprime des colonnes, les formules utilisant les noms sont parfois décalées (comme sommeprod).

    j'ai vu plusieurs codes utilisant "find", mais je n'ai pas pu les adapter à mon problème, alors j'ai pensé au code ci-dessous :

    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
    Dim NbLig As Long
    Dim NbCol As Long
     
    NbLig = Sheets("base").Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
    NbCol = Sheets("base").Cells(1, Rows(1).Cells.Count).End(xlToLeft).Column
     
    For j = 1 To NbCol
     
        If Sheets("base").Cells(1, j) = "PAYS" Then
            Sheets("base").Range(Cells(2, j), Cells(NbLig, j)).Select
            Sheets("base").Names.Add Name:="pl_pays", RefersToR1C1:="=base! & Range(Cells(2, j), Cells(NbLig, j)).adresse"
        End If
     
         If Sheets("base").Cells(1, j) = "VILLE" Then
            Sheets("base").Range(Cells(2, j), Cells(NbLig, j)).Select
            Sheets("base").Names.Add Name:="pl_ville", RefersToR1C1:="=base! & Range(Cells(2, j), Cells(NbLig, j)).adresse"
        End If
     
    Next j
     
    End Sub
    Jusqu'à la sélection, ça se passe bien mais ma ligne d'affectation de nom génère une erreur.
    Quelqu'un peut-il m'expliquer pourquoi ?

    PS :
    1 - Dans le post de jojo86 (Excel en Base de données, devenir fou?), on parle de requete sous excel, connaissez-vous un tutoriel qui en parle ?

    2 - J'aimerais apprendre à manipuler les plages de cellules avec les boucles. Pour l'utilisation de cells.(i,j) ça va mais ma grande difficulté c'est de rendre dynamique les indices dans range("A1:C32") par exemple.

    Dans la fac excel :
    http://excel.developpez.com/faq/inde...ge=Plage#Range
    on en parle brièvement.

    Merci pour votre aide.

  2. #2
    Membre Expert Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Par défaut
    Bonjour et bonne fête à toi ainsi qu'a tous les membres du forum.

    Si tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Msgbox "=base! & Range(Cells(2, j), Cells(NbLig, j)).adresse"

    est-tu satisfait du résultat ?

  3. #3
    Membre Expert Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Par défaut
    Salut Doncamelo et merci pour tes voeux...

    Dans la procédure pour nommer la plage tu utilise "ReferstoR1C1" ce qui implique qu'il faut écrire R2C5:R10C5 pour la plage E2:E10, c'est un peu le même principe que Cells, à savoir la ligne, la colonne.
    D'ailleurs pour répondre à ton problème de fin de Post, voici comme écrire Range("A1:C32") avec cells
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    range(cells(1,1),cells(32,3))
    Mon astuce du jour est d'utiliser r et c au lieu de i et j (d'abord car i peut prêter à confusion avec 1 quand on est mal réveillé) ensuite par ce que r représente Rows et c Columns (comme dans RefersToR1C1), plus facile ensuite de s'y retrouver...

    Pour le .Find, le principe est de définir une plage sur laquelle faire la recherche et de retourner le résultat dans une variable de type Range.
    Donc voici ma proposition pour ton cas...
    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
    Sub RenameRanges()
    'Dimensionnement des variables
    Dim MaPlage As Range, MaRech As Range
    Dim WsB As Worksheet
    Dim NbCol As Long, NbLig As Long, LaCol As Long
     
    'Adapte le nom des plages selon le titre de la colonne
    Set WsB = Sheets("base")
    NbLig = WsB.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
    NbCol = WsB.Cells(1, Rows(1).Cells.Count).End(xlToLeft).Column
    Set MaPlage = WsB.Range(WsB.Cells(1, 1), WsB.Cells(1, NbCol)) 'Défini la plage sur laquelle on fera la recherche
    With MaPlage
         'Ici on peut imaginer une boucle pour passer sur chaque plage à renomer en utilisant par exemple un Tablo
         Set MaRech = .Find("PAYS", LookIn:=xlValues) 'Récupère l'adresse de la cellule qui contient l'élément recherché
         LaCol = MaRech.Column 'récupère le numéro de colonne
         ActiveWorkbook.Names.Add Name:="pl_pays", RefersToR1C1:="=base!R2C" & LaCol & ":R" & NbLig & "C" & LaCol 'Renomme la plage concernée
    End With
     
    End Sub
    A+

    Edit: Salut Aalex_38, désolé pas vu ta réponse j'ai été un peu long à écrire

  4. #4
    Membre confirmé Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Par défaut
    Bonsoir Fvandermeulen,

    Merci pour l'astuce qui fonctionne très bien.
    J'ai créé un tableau qui contient le nom des colonnes à chercher et affecte ce nom à la plage.

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    Option Base 1
     
    Sub RenameRanges()
     
    'Dimensionnement des variables
    Dim MaPlage As Range, MaRech As Range
    Dim WsB As Worksheet
    Dim NbCol As Long, NbLig As Long, LaCol As Long, cpt As Long
    Dim ListeNomCol(3) As String, NomColonne As String
     
    ListeNomCol(1) = "CIVILITE"
    ListeNomCol(2) = "PAYS"
    ListeNomCol(3) = "AGE"
     
     
    'Adapte le nom des plages selon le titre de la colonne
    Set WsB = Sheets("base")
    NbLig = WsB.Cells(Columns(1).Cells.Count, 1).End(xlUp).Row
    NbCol = WsB.Cells(1, Rows(1).Cells.Count).End(xlToLeft).Column
     
    Set MaPlage = WsB.Range(WsB.Cells(1, 1), WsB.Cells(1, NbCol)) 'Défini la plage sur laquelle on fera la recherche
     
    With MaPlage
        For cpt = 1 To UBound(ListeNomCol)
            NomColonne = ListeNomCol(cpt)
            'Ici on peut imaginer une boucle pour passer sur chaque plage à renomer en utilisant par exemple un Tablo
            Set MaRech = .Find(NomColonne, LookIn:=xlValues) 'Récupère l'adresse de la cellule qui contient l'élément recherché
            LaCol = MaRech.Column 'récupère le numéro de colonne
            ActiveWorkbook.Names.Add Name:=NomColonne, RefersToR1C1:="=base!R2C" & LaCol & ":R" & NbLig & "C" & LaCol 'Renomme la plage concernée
        Next cpt
    End With
     
    End Sub
    Encore merci !

  5. #5
    Membre confirmé Avatar de doncamelo
    Homme Profil pro
    Chargé d'études
    Inscrit en
    Décembre 2007
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'études
    Secteur : Bâtiment

    Informations forums :
    Inscription : Décembre 2007
    Messages : 129
    Par défaut
    Bonjour,

    Je viens de tester le cas où le nom de colonne n'est pas trouvé, et là j'ai un message d'erreur.
    J'avais vu un post qui traitait ce cas, j'y jetterai un coup d'œil ce soir !!

    Bonne journée.

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

Discussions similaires

  1. Réponses: 13
    Dernier message: 15/07/2010, 09h51
  2. [VBA-E]Modifier un graphique selon un nom de plage
    Par osito57 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 17/03/2006, 16h14
  3. [VBA Excel] Trier une plage à plusieurs colonnes
    Par loacast dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 22/12/2005, 17h04
  4. Réponses: 3
    Dernier message: 29/06/2005, 15h39
  5. DBGrid - changer le noms des entête de colonnes ?
    Par safab dans le forum Bases de données
    Réponses: 2
    Dernier message: 12/11/2004, 16h49

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