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 :

Copier coller une colonne avant de la modifier [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Copier coller une colonne avant de la modifier
    Bonjour à tous,

    Je souhaites copier coller une colonne avant de la modifier. Je m'explique, si j'ai A1= 10, ce que j'aimerais, c'est que si je modifie A1=15, par exemple, la valeur 10 se copie dans une colonne. Puis si je modifie à nouveau A1=20, la valeur 15 se copiera dans une colonne et la valeur 10 se supprimera.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("A1:A30")) Is Nothing Then
    Range("A1:A30").Select
    Selection.Copy
    Range("D1").Select
    ActiveSheet.Paste
     
    End If
     
    End Sub
    J'ai fait la macro suivante. Le problème, c'est que lorsque je rentre une valeur dans A, il la recopie dans D. Hors j'aimerais que la colonne D soit l'ancienne valeur de la colonne A.

    Merci d'avance

    Cordialement,

    Alexandre

  2. #2
    Expert éminent
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    3 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Août 2010
    Messages : 3 453
    Points : 6 871
    Points
    6 871
    Par défaut
    Bonjour,

    Regarde si ça convient :
    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
     
    Public Valeur
     
    Private Sub Worksheet_Change(ByVal Target As Range)
     
        If Not Application.Intersect(Target, Range("A1:A30")) Is Nothing Then
     
            'à la 1ère entrée en colonne A rien ne sera inscrit en colonne D
            'à voir sur l'évènement "Workbook_Open" pour récupérer les valeurs
            'et les stocker dans la variable (probablement qu'un tableau sera nécessaire) ???
            Target.Offset(0, 3) = Valeur
            Valeur = Target
     
        End If
     
    End Sub
    Hervé.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Presque ça
    Bonjour,

    Tout d'abord merci. C'est presque ça. Quand j'applique la macro, le résultat est le suivant:

    Colonne A Colonne D

    1 5
    2 1
    3 2
    4 3
    5 4

    Ce que je souhaiterais, c'est que premiere phase:

    Colonne A Colonne D

    1 0
    2 0
    3 0
    4 0
    5 0

    Puis, je décide de modifier certaines valeurs (ou toutes)

    Colonne A Colonne D

    12 1
    14 2
    3 0
    21 4
    5 0

    Il faut que quand je modifie une valeur, la nouvelle valeur v s'inscrive dans la colonne A (normal), et que la valeur V n-1 (valeur précedente) s'incrive dans D.

    C'est pas évident à expliquer, je sais

  4. #4
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Bonjour,

    Essaie ceci :
    Code à insérer dans le module de la feuille : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim vVal As Variant
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("A1:A30")) Is Nothing Then
            Target.Offset(0, 3) = vVal
        End If
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("A1:A30")) Is Nothing Then
            vVal = Target.Value
        End If
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Merci
    Merci beaucoup, c'est excatement ce que je voulais

    Bon week end,

    Cordialement,

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut Léger Problème
    Bonjour Fring, le forum,

    Une fois de plus, merci pour la solution que tu m'as apporté vendredi. Elle marche très bien. Je me demandais simplement. La macro ne marche que si je modifie directement la celulle. Hors ma celulle A1 est une somme de 2 celulles. Si je modifie B1, C1, la macro ne fonctionne pas.

    J'ai essayé de bidouiller le code avec Private Sub Worksheet_Calculate(), mais je n'ai pas du bien m'y prendre.

    Merci d'avance,

    Cordialement,

    Alexandre

  7. #7
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Si je comprend bien, la colonne A est le résultat des colonnes B et C. Dans ce cas, plutôt que de vérifier un changement sur la plage A1 à A30, vérifie si il y a un changement sur la plage B1 à C30
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Dim vVal As Variant
     
    Private Sub Worksheet_Change(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("B1:C30")) Is Nothing Then
            Cells(Target.Row, 4) = vVal
        End If
    End Sub
     
    Private Sub Worksheet_SelectionChange(ByVal Target As Range)
        If Not Application.Intersect(Target, Range("B1:C30")) Is Nothing Then
            vVal = Cells(Target.Row, 1)
        End If
    End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  8. #8
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Merci,

    C'est beaucoup plus simple que ma solution qui était plus compliquée, et très énervante. Une fois de plus merci pour ton aide.

    Cordialement,

    Alexandre

    Re Bonjour,

    La macro marche parfaitement, j'essaye de l'adapter par rapport à mon fichier original, et je suis face à un problème. J'ai d'abord pensé que j'avais mal adapter la macro, mais elle marche dans mon fichier test. Le problème, c'est que c'est que les celulles contiennent une formule. Pour éclaircir:

    Y1=Somme(Z1;AB1): dans mon fichier test, ça marche en réadaptant le code.
    Z1= un nombre + une celulle dans une autre feuille
    AA1 et AB1 = formule décaler par rapport à une autre feuille.

    Je pensais que la macro allait marcher sans problème, mais apparement non.

    Merci d'avance pour l'aide apportée

    Cordialement,

    Alexandre

  9. #9
    Expert éminent
    Avatar de fring
    Homme Profil pro
    Engineering
    Inscrit en
    Février 2008
    Messages
    3 900
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : Belgique

    Informations professionnelles :
    Activité : Engineering

    Informations forums :
    Inscription : Février 2008
    Messages : 3 900
    Points : 7 964
    Points
    7 964
    Par défaut
    Effectivement avec des cellules contenant des formules faisant référence à d'autres feuilles cela devient compliqué à utiliser l’évènement Worksheet_Change.

    Teste ceci en adaptant le nombre de ligne et le nom de la feuille. L'idée est de mémoriser les valeurs de la colonne A dans une "Collection" et de comparer ces valeurs suivant l'évènement Worksheet_Calculate.
    (après avoir insérer les codes, il faut fermer et ré-ouvrir le classeur pour initialiser la Collection)
    • Code à insérer dans un module standard
      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
      Dim Col As Collection, i As Integer
       
      Sub Col_Init()
          Set Col = New Collection
          For i = 1 To 5 '<-- adapter le nombre de lignes
              Col.Add Sheets("Feuil1").Cells(i, 1).Value '<-- adapter le nom de la feuille
          Next
      End Sub
       
      Sub Col_Verif()
          For i = 1 To 5 '<-- adapter le nombre de lignes
              With Sheets("Feuil1") '<-- adapter le nom de la feuille
                  If .Cells(i, 1) <> Col(i) Then .Cells(i, 4) = Col(i)
              End With
          Next
          Col_Init
      End Sub
    • Code à insérer dans le module de la feuille en question
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      Private Sub Worksheet_Calculate()
          Col_Verif
      End Sub
    • Code à insérer dans le module ThisWorkbook
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      Private Sub Workbook_Open()
          Col_Init
      End Sub
    LES FAQ OFFICE - LES COURS OFFICE - LES COURS EXCEL - LES LIVRES OFFICE - SOURCES VBA - ATELIER BRICOLAGE VBA

    Lorsque votre problème est solutionné, pensez à le signaler en cliquant sur le bouton au bas de la discussion.

  10. #10
    Futur Membre du Club
    Profil pro
    Inscrit en
    Février 2012
    Messages
    24
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2012
    Messages : 24
    Points : 7
    Points
    7
    Par défaut
    Merci énormément. La macro met un certain temps à se charger, puisque j'ai deux autres macros qui se chargent avant mais je vais maintenant pouvoir nettoyer, et arranger mon fichier.

    En tout cas, une fois de plus merci.

    Cordialement,

    Alexandre

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

Discussions similaires

  1. [XL-2010] Copier et coller une colonne Word pécise dans Excel
    Par jérémyp8 dans le forum Excel
    Réponses: 1
    Dernier message: 21/04/2013, 08h14
  2. Copier/coller des colonnes dans une entité d’un MCD.
    Par matching_ds dans le forum PowerAMC
    Réponses: 1
    Dernier message: 23/11/2011, 09h28
  3. copier /coller une colonne dans un fichier excel
    Par fboss dans le forum VB.NET
    Réponses: 0
    Dernier message: 13/11/2009, 12h33
  4. Copier/coller une colonne dans une table.
    Par moonwar dans le forum Débuter
    Réponses: 2
    Dernier message: 25/10/2009, 17h23
  5. copier / coller une colonne
    Par jmlb35 dans le forum VBA Access
    Réponses: 2
    Dernier message: 29/06/2008, 21h10

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