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 :

Aller rechercher la valeur d'une cellule adjacente dans une boucle for [XL-2016]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Par défaut Aller rechercher la valeur d'une cellule adjacente dans une boucle for
    Bonjour,

    je suis débutant en VBA et je voudrais savoir comment faire pour récupérer la valeur d'une cellule adjacente lors du parcours d'une boucle for.
    je m'explique: j'ai un tableau dans lequel lorsque je clique sur un bouton, je fais une boucle qui va vérifier des dates, si la date est inférieur à aujourd'hui, cela doit envoyer un mail. Le problème c'est que pour aller rechercher les infos pour la création du mail, il faut aller dans des colonnes adjacentes à la colonne ou la boucle est effectuée. Je sais faire cette procédure avec des ActiveCell.Offset mais cela ne fonctionne pas parce que je suppose que dans la boucle la cellule choisie n'est pas considérée comme ActiveCell.

    Donc comment dois-je nommer ces cellules adjacentes pour qu'elles puissent être automatiquement choisie fonction de où s'arrête le programme dans le parcours de ma boucle

    D'avance merci

  2. #2
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Offset est une propriété de l'objet Range donc elle peut être utilisée avec les objets Range tels que ActiveCell, Range("ColonneLigne"), Cells(Ligne, Colonne), etc.
    Comme tu n'affiches pas le code que tu utilises dans ta boucle la réponse ne peut être plus précise
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  3. #3
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Bonjour à vous,

    Hé salut Philippe!

    Je me permets modestement de préciser à notre ami.
    L'Objet range peut affecter plusieurs cellules.
    Dans la fenêtre Exécution,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ?Sheets("lawks").RANGE("A2:A5").offset(0,1).address
    retourne
    $B$2:$B$5
    En ce qui concerne l'objet Range, tu peux consulter cette documentation Microsoft

  4. #4
    Inactif  

    Homme Profil pro
    cuisiniste
    Inscrit en
    Avril 2009
    Messages
    15 374
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : cuisiniste
    Secteur : Bâtiment

    Informations forums :
    Inscription : Avril 2009
    Messages : 15 374
    Billets dans le blog
    8
    Par défaut re
    re
    Bonjour a tous

    et si il a du mal avec offset on se sert du ".row de la cellule de ref et la colonne en dur en lettre ou numerique
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    with Sheets("lawks").RANGE("A2"):.msgbox(.parent.cells(.row,"F").address):end with
    autrement dit dans une boucle avec offset ou index+ colonne
    on recupere la colonne "F" a partir de "A"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    with Sheets("lawks")
    for i= 1 to 20
    msgbox .RANGE("A"& i).offset(0,5).value'possibilité ecriture 1
    msgbox .cells(.RANGE("A"& i).row,"F").value'possibilité  ecriture 2
    next
    end with
    mes fichiers dans les contributions:
    mail avec CDO en vba et mail avec CDO en vbs dans un HTA
    survol des bouton dans userform
    prendre un cliché d'un range

    si ton problème est résolu n'oublie pas de pointer : : ça peut servir aux autres
    et n'oublie pas de voter

  5. #5
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Par défaut
    Citation Envoyé par Philippe Tulliez Voir le message
    Bonjour,
    Offset est une propriété de l'objet Range donc elle peut être utilisée avec les objets Range tels que ActiveCell, Range("ColonneLigne"), Cells(Ligne, Colonne), etc.
    Comme tu n'affiches pas le code que tu utilises dans ta boucle la réponse ne peut être plus précise
    J'ai essayé en changeant comme ci-dessous vu que tu me dis que .Offset est une propriété de Range mais il me renvoie un message d'erreur (erreur d'exécution 1004). Je dois certainement avoir mal compris .

    Je mets le 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
    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
    Sub Envoi_Mail3()
     
    'Déclaration des variables
     
        Dim Debut As String
        Dim Destinataire As Variant
        Dim Objet As String
        Dim Source As String
        Dim Contenu As String
        Dim Contenu1 As String
        Dim Contenu2 As String
        Dim Porteur As String
        Dim Email As String
        Dim Action As String
        Dim Quand As String
        Dim Final As String
        Dim Demandeur As String
        Dim Previ As String
        Dim Raison As String
        Dim Previs As Range
     
        Dim ObjOutlook As New Outlook.Application
        Dim ObjOutlookmail As MailItem
     
    'Initialisation des variables
     
        Destinataire2 = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, -2).Value
        Source = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, -6).Value
        Objet = "Rappel de demande d'action via" & " " & Source
        Porteur = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, 4).Value
        Action = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, -5).Value
        Quand = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, -10).Value
        Final = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, 10).Value
        Demandeur = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, -8).Value
        Raison = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, 11).Value
     
        Set Previs = Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12))
     
            For Each Cell In Previs
     
                If Cell.Value < Now And Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, 1).Value <> "OK" Then
     
                      Email = Destinataire
                      Debut = "Bonjour," & " " & Destinataire2 & vbNewLine & " " & vbNewLine
                      Contenu = Demandeur & " " & "a fait une demande via" & " " & Source & ", " & " en date du " & "  " & Quand & "." & vbNewLine & "(" & Action & ")" & vbNewLine & vbNewLine
                      Contenu1 = "Merci de ne pas oublier la prise en charge de cette demande et me revenir lorsqu'elle sera traitée" & "." & vbNewLine
                      Contenu2 = "Bien à vous" & vbNewLine & vbNewLine & 
     
                 End If
            Next
     
     
     
     
     
        Set ObjOutlook = New Outlook.Application
        Set ObjOutlookmail = ObjOutlook.CreateItem(olMailItem)
     
     
     'Envoi du mail
     
        With ObjOutlookmail
            .To = Email
            .CC = 
            .Subject = Objet
            .Body = Debut & Contenu & Contenu1 & Contenu2
            .Send
        End With
     
     
     
    End Sub

  6. #6
    Expert confirmé
    Avatar de MarcelG
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2009
    Messages
    3 449
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2009
    Messages : 3 449
    Billets dans le blog
    7
    Par défaut
    Salut,

    Si je peux me permettre.
    Personnellement, je te conseillerais de
    - Baliser ton code avec les bornes #
    - Bien attacher les objets Range (.)
    - Pour ce faire, utiliser le bloc With
    - Utiliser une variable pour les données répétées (fin de la feuille 8)
    - Indenter le code selon les blocs If, With, Next...

    Quant à ton erreur, il me semble que l'objet Range de ta condition est mal argumentée.

    Regarde la cible du lien que je t'ai reporté. Il t'apportera la réponse.

  7. #7
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 173
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    En premier lieu il faudrait placer ton code entre les balises prévues à cet effet (Le bouton # dans l'éditeur de message)
    Enfin, penses-tu que signaler le numéro de l'erreur dans un code de plusieurs dizaines de lignes va nous aider ?
    Soit tu donnes le numéro de la ligne où a lieu cette erreur (numéro que tu obtiendras lorsque tu auras balisé ton code, soit tu le mets en couleur

    Tu utilises certainement mal la propriété Offset
    Exemple : Si dans une boucle je parcoure les lignes 2 à 10 de la feuille nommée Feuil1, je souhaite aller lire la cellule qui se trouve 2 colonnes à droite de la colonne B si la valeur de celle-ci est à True, voir en ligne 5, comment j'utilise la propriété Offset
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     Dim Row As Long
     With ThisWorkbook.Worksheets("Feuil1")
      For Row = 2 To 10
       If .Cells(Row, 2).Value = True Then
        MsgBox .Cells(Row, 2).Offset(0, 2).Value
       End If
      Next
     End With
    Evidemment, ce n'est qu'un exemple car il aurait été plus intelligent de ma part d'écrire simplement
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox .Cells(Row, 4).Value
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  8. #8
    Membre averti
    Homme Profil pro
    Responsable sécurité
    Inscrit en
    Décembre 2018
    Messages
    17
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable sécurité

    Informations forums :
    Inscription : Décembre 2018
    Messages : 17
    Par défaut
    En fait c'est au niveau de cette ligne que vient le message d'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Cell.Value < Now And Worksheets("Feuil8").Range(Cells(6, 12), Cells(Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row, 12)).Offset(0, 1).Value <> "OK" Then
    j'essaye de comprendre le raisonnement qu'il faut avoir mais vous faites allusion à des MsgBox je sais que c'est pour faire réfléchir de ne pas donner la solution mais j'ai du mal à voir ce que je dois mettre à la place de msgBox dans mon code pour faire l'offset . Dans l'exemple on parcours un nombre de ligne défini de 2 à 10 mais mon tableau évolue au fur et à mesure qu'il sera rempli et c'est pour ça que je pensais mettre un range qui va de la première ligne jusqu'à la dernière ligne non vide et donc faire un offset sur une autre colonne mais sur le range équivalent

    Désolé je suis assez lent à comprendre mais une fois que ça fait tilt après c'est bon

  9. #9
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Il manque des Worksheets("Feuil8") devant tes Cells.
    En gros, tu essayes de faire une plage de Worksheets("Feuil8") avec des cellules de la feuille active : VBA ne comprend plus donc il bug.
    Il faut lui dire que les Cells sont de la même source que le Range.
    Erreur classique de débutant : on l'a tous faite.

    Mais ton code serait plus propre en écrivant ton Range ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("Feuil8").Range("L6:L" & Worksheets("Feuil8").Range("L" & Rows.Count).End(xlUp).Row)
    Perso, j'aurais plutôt mis le numéro de la dernière ligne sans une variable pour rendre cette ligne de code plus lisible.
    Ou alors un With Worksheets("Feuil8") histoire d'alléger un peu la formule.

  10. #10
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par d.bargibant Voir le message
    j'ai un tableau dans lequel lorsque je clique sur un bouton, je fais une boucle qui va vérifier des dates
    Pour comprendre d'où tu parts (boucle "For To" ou "For Each" ?) et ce que tu comptes faire, le plus simple aurait été de faire une copie de ce code.
    Parce que j'ai l'impression que ton problème est de comprendre comment désigner une référence de cellule.

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

Discussions similaires

  1. [XL-2016] Rendre obligatoire la saisie d'une valeur dans une cellule Excel dans une macro
    Par retraite83 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 03/08/2018, 20h56
  2. Réponses: 6
    Dernier message: 25/07/2018, 20h04
  3. Réponses: 13
    Dernier message: 03/05/2017, 08h36
  4. [XL-2010] Copier coller la valeur d'une cellule active dans une cellule bien définie
    Par franckb74 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/10/2015, 09h16
  5. Réponses: 7
    Dernier message: 13/12/2008, 09h31

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