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 :

Dans un tableau, copier la cellule sur une cellule à côté


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
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut Dans un tableau, copier la cellule sur une cellule à côté
    Bonjour,

    Je cherche à modifier un programme pour intégrer un tableau.
    Dans ce programme, je compare la cellule avec celle située juste au-dessus dans la colonne et quand la condition est valide, j'inscris un "r" dans la cellule à côté.
    Mon bricolage donnait ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
            If Cells(Lig, Col) = "r1" And Cells(Lig - 1, Col) <> "r1" Then
            ActiveCell.Offset (0, 1) .value = "r"
    La boucle marche mais c'est très lent.
    J'aimerai l'améliorer avec un tableau (que j'appelle Cloture) mais je manque de connaissances.
    Voici où j'en suis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Cloture = Application.Transpose(.Range("B5", .Cells(.Rows.Count, 2).End(xlUp)))     
    For I = 1 To UBound(Cloture)
    Ctr = 0
    X = I
        If Cloture(X) = "r1" And Cells(0, -1) <> "r1" Then
            Cells.Select
            ActiveCell.Offset(0, 1).Value = "r"
    Cela bloque au niveau du If car je n'arrive pas à désigner les cellules qui doivent être comparées.
    Si l'un de vous peut me donner un coup de main...

  2. #2
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    à voir et vérifier ce qui existe en Col C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub toto()
    Dim Cloture, i As Long, Dcel As Range
    Set Dcel = Range("B" & Rows.Count).End(xlUp)(1, 2)
    Cloture = Range("B5", Dcel)
    For i = 2 To UBound(Cloture, 1)
     If Cloture(i, 1) = "r1" And Cloture(i - 1, 1) <> "r1" Then Cloture(i, 2) = "r"
    Next i
    Range("B5").Resize(UBound(Cloture, 1), UBound(Cloture, 2)) = Cloture
    End Sub
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  3. #3
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Citation Envoyé par casefayere Voir le message
    Bonjour,
    à voir et vérifier ce qui existe en Col C
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub toto()
    Dim Cloture, i As Long, Dcel As Range
    Set Dcel = Range("B" & Rows.Count).End(xlUp)(1, 2)
    Cloture = Range("B5", Dcel)
    For i = 2 To UBound(Cloture, 1)
     If Cloture(i, 1) = "r1" And Cloture(i - 1, 1) <> "r1" Then Cloture(i, 2) = "r"
    Next i
    Range("B5").Resize(UBound(Cloture, 1), UBound(Cloture, 2)) = Cloture
    End Sub

    J'ai finalement utiliser la solution de casefayere.
    Par contre je ne comprends pas pourquoi il y a (1, 2) à la fin de la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dcel = Range("B" & Rows.Count).End(xlUp)(1, 2)
    Merci à tous

  4. #4
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Par défaut
    Bonjour,

    Ton idée de mettre tes valeurs dans une variable tableau est une bonne idée. ça fait utiliser ta RAM et tu évites tout plein d'accession aux cellules.
    Mais tu peux encore faire mieux:

    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
    sub merciSlooby()
     
    Dim vecteur_valeur() as Variant 'correspond à ta colonne B
    Dim vecteur_resultat() as String 'résultat en colonne C 
    Dim i as Integer 'compteur
     
    vecteur_valeur = Application.Transpose(Range("B5", Cells(Rows.Count,2).End(xlUp)))
    ReDim vecteur_resultat(LBound(vecteur_valeur) to UBound(vecteur_valeur))
     
    'la boucle comment au deuxieme element car tu ne compares pas le premier !
    For i= LBound(vecteur_valeur) + 1 to UBound(vecteur_valeur)
     
    'test de condition
    if vecteur_valeur(i) = "r1" And vecteur_valeur(i-1) <> "r1" Then
       vecteur_resultat(i) = "r" 'on remplit le vecteur de resultat
    end if
     
     
    'on a fini, on écrit nos résultats
    Range("C5", Cells(Rows.Count,3).End(xlUp)) =  Application.Transpose(vecteur_resultat)
     
    'voilà !
    MsgBox "Merci Slooby ! "
     
    End Sub

    Et voici

    Slooby

  5. #5
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Merci Slooby,

    Pour ta réponse rapide... qui va m'obliger à boulotter !
    Je te tiens au courant de mes progrès !

    Erki

  6. #6
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 84
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour

    Juste un réflexe d'avare (ce que je suis)
    On y gagne rarement vraiment beaucoup, mais (exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     If toto = 1 Then
        If titi = 2 Then a = True
      End If
    ira toujours plus vite que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If toto = 1 And titi = 2 Then a = True
    Choisir de préférence (adroitement) comme 1ère condition celle dont l'occurrence prévisible est la moindre. Sur un très grand nombre de vérifications, ce principe peut avoir un effet sur l'accroissement de la vitesse.
    (je suis avare, je sais ...)

  7. #7
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Avare. C'est une qualité indispensable pour un programmeur.
    Je vais suivre ton conseil.
    Merci
    PS. Je n'aurais même pas dû répondre à ton message. Tu aurais apprécier mon avarice de mots.

  8. #8
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    J'ai préféré utilisé la solution de Slooby plutôt que celle de Casefayere.
    Casefayere marque vecteur_valeur(i, 1) alors que toi, Slooby, tu marques vecteur_valeur(i). Serait-ce parce que mon tableau n'a qu'une colonne ?

    Malgré vos remarques, mes cogitations pédalent dans la choucroute.
    mon programme tourne dans le vide et je n'arrive pas à voir l'erreur.

    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
    Sub Cloture()
    Dim vecteur_valeur() as Variant 
    Dim vecteur_resultat() as String 
    Dim i as Integer    
     
    With ActiveSheet
    vecteur_valeur = Application.Transpose(Range("B5", Cells(Rows.Count,2).End(xlUp)))
    ReDim vecteur_resultat(LBound(vecteur_valeur) to UBound(vecteur_valeur))
     
    For i = LBound(vecteur_valeur) + 2 To UBound(vecteur_valeur)
        If vecteur_valeur(i) = "r1" And vecteur_valeur(i - 1) <> "r1" Then
            vecteur_resultat(i) = "r"
            Range("D5", Cells(Rows.Count, 3).End(xlUp)) = Application.Transpose(vecteur_resultat)
        ElseIf vecteur_valeur(i) = "e1" And vecteur_valeur(i - 1) <> "e1" Then
            vecteur_resultat(i) = "e"
            Range("D5", Cells(Rows.Count, 3).End(xlUp)) = Application.Transpose(vecteur_resultat)
        ElseIf vecteur_valeur(i - 2) = "r1" Then
            If (vecteur_valeur(i - 1) = "r-" Or vecteur_valeur(i - 1) = "e-") And vecteur_valeur(i) = "e1" Then
                vecteur_resultat(i) = "e"
                Range("D5", Cells(Rows.Count, 3).End(xlUp)) = Application.Transpose(vecteur_resultat)
            ElseIf vecteur_valeur(i - 1) = "r-" And vecteur_valeur(i) = "e+" Then
            ElseIf vecteur_valeur(i - 1) = "r-" And vecteur_valeur(i) = "r+" Then
                vecteur_resultat(i) = "r"
                Range("D5", Cells(Rows.Count, 3).End(xlUp)) = Application.Transpose(vecteur_resultat)
            End If
        End If
    Next i
    End With
    End Sub

  9. #9
    Membre expérimenté
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    128
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Janvier 2015
    Messages : 128
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour

    Juste un réflexe d'avare (ce que je suis)
    On y gagne rarement vraiment beaucoup, mais (exemple) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     If toto = 1 Then
        If titi = 2 Then a = True
      End If
    ira toujours plus vite que :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If toto = 1 And titi = 2 Then a = True
    Choisir de préférence (adroitement) comme 1ère condition celle dont l'occurrence prévisible est la moindre. Sur un très grand nombre de vérifications, ce principe peut avoir un effet sur l'accroissement de la vitesse.
    (je suis avare, je sais ...)

    Hey ! Bien vu !
    Je n'ai jamais fais attention à ça, mais maintenant que tu le pointes du doigts, je l'utiliserai !
    Surtout si la première condition est bien choisie !!

    merci

    Slooby

  10. #10
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonjour,
    Par contre je ne comprends pas pourquoi il y a (1, 2) à la fin de la ligne suivante :

    Set Dcel = Range("B" & Rows.Count).End(xlUp)(1, 2)
    une variable "Range" ou object qui donne la dernière cellule renseignée en B, avec (1,2) on décale d'une colonne donc ligne de dernière cellule en B mais en C, j'aurais pu écrire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Dcel = Range("B" & Rows.Count).End(xlUp).offset(0,1)
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  11. #11
    Membre averti
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2015
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2015
    Messages : 25
    Par défaut
    Je ne m'étais pas aperçu de ta réponse
    Meric

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 21/03/2016, 18h48
  2. [XL-2007] copier coller une cellule sur une ligne en fonction d'une valeur
    Par armina1978 dans le forum Excel
    Réponses: 3
    Dernier message: 17/11/2014, 09h43
  3. Réponses: 6
    Dernier message: 24/05/2012, 11h53
  4. Réponses: 5
    Dernier message: 09/08/2011, 11h36
  5. Réponses: 2
    Dernier message: 30/10/2008, 13h28

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