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 :

retourner le numero d'une colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 53
    Par défaut retourner le numero d'une colonne
    Bonjour,

    Je n'arrive pas a retourner le numéro de la colonne "Niveau" de mon code:
    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
     
    Dim CellsInColumnNiveau As Range
    Dim SheetNameNiveau As Worksheet
    Dim Entete As Range
        With Worksheets(1)
            For Each Entete In .Range("1:1")
                If Entete = ("NIVEAU") Then
                    For Each CellsInColumnNiveau In .Range(.Cells(Rows.Count, Entete.Column).End(xlUp), .Range(.Cells(Entete.Row, Entete.Column)))
                        If CellsInColumnNiveau.Value <> "" Then
                            For Each SheetNameNiveau In Worksheets
                                If SheetNameNiveau.Name = CellsInColumnNiveau.Value Then
                                .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
            GoTo apres
                                End If
                            Next
                            Sheets.Add after:=Sheets(Sheets.Count)
                            Sheets(Sheets.Count).Name = CellsInColumnNiveau.Value
                            .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
    apres:
                        End If
                    Next
                End If
            Next
        End With
    Pouvez-vous m'expliquer comment faire?

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut bibvba

    Je n'arrive pas a retourner le numéro de la colonne "Niveau" de mon code:
    Je ne comprend pas ton problème : tu utilises Entete.Column qui est le numéro de la colonne
    Sauf peut-être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
    La méthode Copy n'admet pas les Offset, donc, pour être simple, calcule le avant (dans une variable pr exemple) et ça devrait rebtrer dans l'ordre.

    Sinon explique où tu coince
    A+

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 53
    Par défaut
    Merci de te pencher sur mon cas

    En faite si j'écris mon code en déterminant la colonne avec pour entete "NIVEAU" à la colonne "F" comme ceci:
    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
     
    Dim CellsInColumnNiveau As Range
        Dim SheetNameNiveau As Worksheet
        With Worksheets(1)
                    For Each CellsInColumnNiveau In .Range(.Cells(Rows.Count, "F").End(xlUp), .Range("F2"))
                        If CellsInColumnNiveau.Value <> "" Then
                            For Each SheetNameNiveau In Worksheets
                                If SheetNameNiveau.Name = CellsInColumnNiveau.Value Then
                                .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, "F").End(xlUp).Offset(1, -5)
            GoTo apres
                                End If
                            Next
                            Sheets.Add after:=Sheets(Sheets.Count)
                            Sheets(Sheets.Count).Name = CellsInColumnNiveau.Value
                            .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, "F").End(xlUp).Offset(1, -5)
    apres:
                        End If
                    Next
        End With
    ce code marche très bien

    dès l'instant ou je veux dire dans mon code: cherche la colonne avec pour entete "NIVEAU", je ne sais déterminer la variable qui me permettra de retourner le numéro de la colonne
    j'ai penser récrire mon code comme ceci mais ca ne lui plait pas
    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
     
    Dim CellsInColumnNiveau As Range
        Dim SheetNameNiveau As Worksheet
        Dim Entete As Range
        With Worksheets(1)
            For Each Entete In .Range("1:1")
                If Entete = "NIVEAU" Then
                    For Each CellsInColumnNiveau In .Range(.Cells(Rows.Count, Entete.Columns).End(xlUp), .Range(.Cells(2, Entete.Columns)))
                        If CellsInColumnNiveau.Value <> "" Then
                            For Each SheetNameNiveau In Worksheets
                                If SheetNameNiveau.Name = CellsInColumnNiveau.Value Then
                                .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
            GoTo apres
                                End If
                            Next
                            Sheets.Add after:=Sheets(Sheets.Count)
                            Sheets(Sheets.Count).Name = CellsInColumnNiveau.Value
                            .Rows(CellsInColumnNiveau.Row).Copy Sheets(CellsInColumnNiveau.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
    apres:
                        End If
                    Next
                End If
            Next
        End With

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut bibvba

    Avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each CellsInColumnNiveau In .Range(.Cells(Rows.Count, Entete.Columns).End(xlUp), .Range(.Cells(2, Entete.Columns)))
    ça plante, avec celle-ci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ForEach CellsInColumnNiveau In .Range(.Cells(Rows.Count, "F").End(xlUp), .Range("F2"))

    Une intense réflexion me dit que l'erreur provient de la différence (qu'est-ce que je suis fort !)


    La différence :
    Cells(Rows.Count, Entete.Columns)

    Cells(Rows.Count, "F")

    Entete.Columns n'est pas un nombre, ce sont les colonnes de Entete
    Entete.Column = numéro de la colonne de Entete

    Normalement, avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each CellsInColumnNiveau In .Range(.Cells(Rows.Count, Entete.Column).End(xlUp), .Range(.Cells(2, Entete.Column)))
    cette ligne devrait fonctionner correctement. Mais l'erreur est répétée ailleurs

    Juste une remarque en passant : je sais qu'on recommande de prendre des noms de variables explicites, mais il faut savoir s'économiser
    avec des noms comme ça, CellsInColumnNiveau ton code devient illisible, surtout que ce n'est qu'un compteur.
    Comme tu respectes le non emploie de "_", l'équivalent de "*" chez windows, pour les gros systèmes, je te conseillerais d'opter pour des abréviations : CelColNiv par exemple
    Moi, dans une boucle for each, j'emploie Cell, mais chacun sa méthode, le but, c'est que ton code soit le plus lisible possible, et qu'il reste en entier à l'écran, ça évite les erreurs.
    A+

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 53
    Par défaut
    Bonjour,

    Comme tu peux le voir ci-dessous j'ai simplifié les variables comme tu me l'a dit,
    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
     
    Dim CelColNiv As Range
        Dim ShtNameNiv As Worksheet
        Dim Entete As Range
        With Worksheets(1)
            For Each Entete In .Range("1:1")
                If Entete = ("NIVEAU") Then
                    For Each CelColNiv In .Range(.Cells(Rows.Count, Entete.Column).End(xlUp), .Range(.Cells(2, Entete.Column)))
                        If CelColNiv.Value <> "" Then
                            For Each ShtNameNiv In Worksheets
                                If ShtNameNiv.Name = CelColNiv.Value Then
                                .Rows(CelColNiv.Row).Copy Sheets(CelColNiv.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
            GoTo apres
                                End If
                            Next
                            Sheets.Add after:=Sheets(Sheets.Count)
                            Sheets(Sheets.Count).Name = CelColNiv.Value
                            .Rows(CelColNiv.Row).Copy Sheets(CelColNiv.Value).Cells(Rows.Count, Entete.Column).End(xlUp).Offset(1, -Entete.Column)
    apres:
                        End If
                    Next
                End If
            Next
        End With

    par contre ta modif me creer un autre message erreur:

    "Erreur définie par l'application ou par l'objet"

    au niveau de cette ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each CelColNiv In .Range(.Cells(Rows.Count, Entete.Column).End(xlUp), .Range(.Cells(2, Entete.Column)))
    Je me dis que l'erreur viens peut etre du premier "Entete.column" alors j'ai essayé ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each CelColNiv In .Range(.Cells(Rows.Count, Entete.EntireColumn).End(xlUp), .Range(.Cells(2, Entete.Column)))
    et là j'ai comme erreur:
    "Imcompatibilité de type" ????

    Qu'est ce que ca veut dire?

  6. #6
    Inactif  
    Avatar de ouskel'n'or
    Profil pro
    Inscrit en
    Février 2005
    Messages
    12 464
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 12 464
    Par défaut
    Et plutôt que faire une boucle tu utilisais Find ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        NoCol = Rows(1).Find(What:="NIVEAU", After:=ActiveCell, LookIn:=xlFormulas, _
            LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
    Malheureusement, c'est plus court, mais tu peux toujours tester

  7. #7
    Membre chevronné
    Inscrit en
    Janvier 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 483
    Par défaut
    Citation Envoyé par bibvba Voir le message
    dès l'instant ou je veux dire dans mon code: cherche la colonne avec pour entete "NIVEAU", je ne sais déterminer la variable qui me permettra de retourner le numéro de la colonne
    Bonsoir à vous tous
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    NoCol = Application.Match("NIVEAU", Rows(1), 0)
    Bonne soirée

    Abed_H

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 53
    Par défaut
    Comment j'utilise ce code

    est-ce que NoCol est une variable?

    Est ceu je peux ecrire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    For Each CelColNiv In .Range(.Cells(Rows.Count, NoCol).End(xlUp), .Range(.Cells(2, NoCol)))
    C'est à dire untiliser la varibale NoCol comme Numéro de colonne

  9. #9
    Membre chevronné
    Inscrit en
    Janvier 2008
    Messages
    483
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 483
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For Each CelColNiv In .Range("A1:" & .Cells(Rows.Count, NoCol).End(xlUp).Address)

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Février 2008
    Messages
    53
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 53
    Par défaut
    j'ai essayé en faisant ca:
    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
     
    Dim CelColNiv As Range
        Dim ShtNameNiv As Worksheet
        Dim Entete As Range
        With Worksheets(1)
    '        For Each Entete In .Range("1:1")
    '            If Entete.Value = "NIVEAU" Then
        NoCol = .Rows(1).Find(What:="NIVEAU", After:=ActiveCell, LookIn:=xlFormulas, _
        LookAt:=xlWhole, SearchOrder:=xlByColumns, SearchDirection:=xlNext).Column
                    For Each CelColNiv In .Range(.Cells(Rows.Count, NoCol).End(xlUp), .Range(.Cells(2, NoCol)))
                        If CelColNiv.Value <> "" Then
                            For Each ShtNameNiv In Worksheets
                                If ShtNameNiv.Name = CelColNiv.Value Then
                                .Rows(CelColNiv.Row).Copy Sheets(CelColNiv.Value).Cells(Rows.Count, NoCol).End(xlUp).Offset(1, -NoCol)
            GoTo apres
                                End If
                            Next
                            Sheets.Add After:=Sheets(Sheets.Count)
                            Sheets(Sheets.Count).Name = CelColNiv.Value
                            .Rows(CelColNiv.Row).Copy Sheets(CelColNiv.Value).Cells(Rows.Count, NoCol).End(xlUp).Offset(1, -NoCol)
    apres:
                        End If
                    Next
    '            End If
    '        Next
        End With
    mais il me mais ca:
    "erreur définie par l'application ou par l'objet"

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

Discussions similaires

  1. Fonction qui retourne le numero de colonne?
    Par alex830001 dans le forum Excel
    Réponses: 4
    Dernier message: 13/11/2008, 15h12
  2. Réponses: 9
    Dernier message: 10/10/2008, 16h39
  3. Retourner une colonne même pour une table vide
    Par The eye dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 28/03/2008, 18h58
  4. afficher le numero de la ligne dans une colonne
    Par maysa dans le forum Requêtes
    Réponses: 14
    Dernier message: 24/12/2007, 09h02
  5. retourner la largeur d'une colonne
    Par k-eisti dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 27/04/2007, 16h44

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