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 :

se positionner sur une cellule


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut se positionner sur une cellule
    Bonjour,

    Je suis un nouvelle utilisateur en VBA (niveau moyen)
    Je galère sur ce problème certainement très simple !!!

    Je cherche une solution de code pour un cas de figure (volontairement simplifié) dans mon exemple. En deux mots, je parcours la colonne âge et si j'ai une valeur = 15, je vais chercher le nom correspondant que je stocke dans une variable.

    Mon problème, comme se positionner au bon endroit en sachant que la position des colonnes n'est pas toujours identique???

    Exemple:
    Ville | Nom | Pays |âge
    NY |toto | US | 12
    PA |mimi | F |15

    Avec le code abstrait suivant:
    Parcourir la colonne âge
    Si âge = 15
    Alors copier le nom correspondant dans une variable

    Avec offset, mais comment faire?

    J'ai déjà mis en place une fonction de recherche sur Nom qui me retourne l'adresse de la colonne dans une variable, (varCol), dans mon cas elle me retourne "B". J'aimerais l'utiliser pour faire quelque chose, par exemple:
    range(varCol, 2), qui correspondrait à: range("B2").Select

    Je pourrais aussi faire une fonction qui au début du programme me calcule cette valeur d'offset par addition ou soustraction:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    i = Convertir en nombre l'adresse de la colonne Nom "B" +/- l'adresse de la colonne âge "D"
    activeCell.offset(0, i).select
    Bon c'est un peu lourd, mais une fois que c'est programmé, ça va tout seul ;-)

    J'ai aussi trouvé ça, mais je ne comprends totalement ce code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Function CorrespondanceR(ByVal Col As String) As Integer
        Col = UCase(Col)
         CorrespondanceR = Asc(Col) - 64
    If Len(Col) = 2 Then
    CorrespondanceR = 26 * CorrespondanceR + Asc(Mid(Col, 2, 1)) - 64
    End If
    End Function
    A votre avis…

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Voici deux solutions

    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
    34
    35
    36
    37
    38
    39
    Sub TestProcedure()
        Dim WS As Worksheet
        Dim i As Long
        Dim mt() As String
        Dim a As Long
     
        Set WS = ThisWorkbook.Worksheets("Feuil1")
        With WS
     
            For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
                If .Cells(i, 4) = 15 Then
                    a = a + 1
    'Toutes les réponses sont stockées dans une variable
                    ReDim Preserve mt(1 To a)
                    mt(a) = .Cells(i, 2)
                End If
            Next i
        End With
    End Sub
     
    Sub Test2()
        Dim WS As Worksheet
        Dim c As Range
        Dim Rng As Range
        Dim a As Long
        Dim mt() As String
     
        Set WS = ThisWorkbook.Worksheets("Feuil1")
        With WS
            Set Rng = .Range(.Cells(2, 4), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, 4))
            For Each c In Rng
                If c.Value = 15 Then
                    a = a + 1
                    ReDim Preserve mt(1 To a)
                    mt(a) = c.Offset(, -2)
                End If
            Next c
        End With
    End Sub
    Pour info, tu n'as pas besoin de convertir les lettres de colonne en nombre, tu peux directement appeler la colonne B par le nombre 2.

    Par exemple B4 est la meme chose que cells(4,2)

    Donc si tu as une cellule dans une variable par exemple B4 l'instruction

    te donneras dirrectement le chiffre correspondant à la colonne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut
    Hello AlphaScorpi,

    merci pour ta réponse rapide, je vais regarder ça ces prochains jours et je te tiens au courant. Et oui, j'ai n'est malheureusement que quelques jours dédié à la programmation dans mes semaines surchargées

    Bonne fin de semaine et salutations à tous les dév.

    Ps. faut aussi que j'apprenne à faire de la mise en page sur le forum, tu as présenté les codes un frame

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    J'ai ajouté au début du code un moyen de déterminer les colonnes des en-têtes et de traiter le tableau en conséquence.

    En partant du principe que les en-têtes sont en ligne 1.
    (Si c'est différent tu peux toujours adapter)


    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    Sub TestProcedure()
        Dim WS As Worksheet
        Dim i As Long
        Dim mt() As String
        Dim a As Long
        Dim X1 As Long, X2 As Long
        Dim rng As Range
        Dim Valch As Range
     
     
        Set WS = ThisWorkbook.Worksheets("Feuil2")
        With WS
            'Definir la zone de recherche (1ere ligne de la feuille ici)
            Set rng = .Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))
            'Recherche de la colonne âge
            Set Valch = rng.Find(What:="âge", lookat:=xlWhole, searchorder:=xlByColumns)
            If Valch Is Nothing Then
                MsgBox "Pas de correspondance"
                Exit Sub
            Else
                X1 = Valch.Column
            End If
            Set Valch = Nothing
            'Recherche de la colonne nom
            Set Valch = rng.Find(What:="nom", lookat:=xlWhole, searchorder:=xlByColumns)
            If Valch Is Nothing Then
                MsgBox "Pas de correspondance"
                Exit Sub
            Else
                X2 = Valch.Column
            End If
     
            For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
                If .Cells(i, X1) = 15 Then
                    a = a + 1
                    'Toutes les réponses sont stockées dans une variable
                    ReDim Preserve mt(1 To a)
                    mt(a) = .Cells(i, X2)
                End If
            Next i
        End With
    End Sub
     
    Sub Test2()
        Dim WS As Worksheet
        Dim c As Range
        Dim rng As Range
        Dim a As Long
        Dim mt() As String
        Dim Valch As Range
     
        Set WS = ThisWorkbook.Worksheets("Feuil2")
     
        With WS
            'Definir la zone de recherche (1ere ligne de la feuille ici)
            Set rng = .Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))
            'Recherche de la colonne âge
            Set Valch = rng.Find(What:="âge", lookat:=xlWhole, searchorder:=xlByColumns)
            If Valch Is Nothing Then
                MsgBox "Pas de correspondance"
                Exit Sub
            Else
                X1 = Valch.Column
            End If
            Set Valch = Nothing
            'Recherche de la colonne nom
            Set Valch = rng.Find(What:="nom", lookat:=xlWhole, searchorder:=xlByColumns)
            If Valch Is Nothing Then
                MsgBox "Pas de correspondance"
                Exit Sub
            Else
                X2 = Valch.Column
            End If
     
            Set rng = .Range(.Cells(2, X1), .Cells(.Cells(.Rows.Count, 1).End(xlUp).Row, X1))
            For Each c In rng
                If c.Value = 15 Then
                    a = a + 1
                    ReDim Preserve mt(1 To a)
                    mt(a) = c.Offset(, X2 - X1)
                End If
            Next c
        End With
    End Sub

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mars 2007
    Messages : 74
    Par défaut
    Bonjour AlphaScorpi,

    J'ai regardé le code ce matin, un grand merci d'abord

    J'ai bien compris dans les grandes lignes le code. j'ai vu tes 2 alternatives et je garderais la "testProcedure", je ne sais pas si c'est la plus performante, mais c'est la plus claire pour moi

    Au fait, j'ai quelques questions précises:
    il s'agit de la partie "testProcedure", j'ai un peu de la peine à lire les imbrications des cells
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set rng = .Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))

    Pour cette boucle, c'est le "2 To ... il correspond à la 2ème ligne ou rangée, c'est juste???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row

    et en dernier point, redim? preserve? quelques mots sur qui fait quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Toutes les réponses sont stockées dans une variable
    ReDim Preserve mt(1 To a)

  6. #6
    Membre expérimenté
    Profil pro
    Inscrit en
    Avril 2012
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 107
    Par défaut
    Citation Envoyé par letal Voir le message
    Au fait, j'ai quelques questions précises:
    il s'agit de la partie "testProcedure", j'ai un peu de la peine à lire les imbrications des cells
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Set rng = .Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))
    Pour cette premier question, je vais reprendre ce que j'ai posté sur un precedent sujet =)

    Citation Envoyé par AlphaScorpi Voir le message

    Pour ce qui est de cette instruction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     For i = .Cells(.Rows.Count, 1).End(xlUp).Row To LigneEnTete + 1 Step -1


    - On compte le nombre de ligne de la feuille



    - On se place sur la derniere ligne de la feuille, colonne 1



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count, 1).End(xlUp)
    - Puis on remonte jusque la première cellule non vide colonne 1



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Cells(.Rows.Count, 1).End(xlUp).Row
    - Et enfin on identifie la ligne de cette cellule
    Donc dans ton cas, si la derniere ligne est 45

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    .Range(.Cells(1, 1), .Cells(1, .Cells(1, .Columns.Count).End(xlToLeft).Column))
    Correspondrait à la plage de cellule "A1:A45"






    Citation Envoyé par letal Voir le message
    Pour cette boucle, c'est le "2 To ... il correspond à la 2ème ligne ou rangée, c'est juste???
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For i = 2 To .Cells(.Rows.Count, 1).End(xlUp).Row
    Oui, 2 correspond bien à la deuxieme ligne

    Citation Envoyé par letal Voir le message
    et en dernier point, redim? preserve? quelques mots sur qui fait quoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Toutes les réponses sont stockées dans une variable
    ReDim Preserve mt(1 To a)
    Pour cette question, tu trouveras la réponse ici : Utiliser les variables tableaux en VBA Excel

Discussions similaires

  1. [XL-2010] Se positionner sur une cellule spécifique à la sortie d'une autre cellule
    Par ToFind dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 14/09/2011, 14h24
  2. se positionner sur une cellule definie a l avance
    Par jgidet dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/10/2009, 07h16
  3. Se positionner sur une cellule
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 04/06/2009, 17h54
  4. Positionnement sur une Cellule DGV et effet ombre de Form
    Par bellak dans le forum Windows Forms
    Réponses: 7
    Dernier message: 15/12/2008, 12h46
  5. se positionner sur une cellule
    Par titemireille dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 28/01/2008, 20h07

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