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 :

Copie de cellules d'un onglet dans un autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Mai 2007
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 10
    Par défaut Copie de cellules d'un onglet dans un autre
    Bonjour,

    voici mon problème :
    j'ai deux onglets dans un fichier excel et je dois, pour chaque ligne du premier onglet, récupérer dans le deuxième onglet des cellules pour les copier dans le premier onglet.
    Schématiquement, en espérant que ce soit plus clair :
    1er onglet:
    ligne 1 : blabla1 | blabla2 | blabla3 | ... | blablan
    ligne 2 : blublu1 | blublu2 | blublu3 | ... | blublun
    ...

    2eme onglet:
    ligne 1 : blibli1 | blibli2 | blibli3 | ... | bliblin
    ligne 2 : blabla1 | blabla2 | blabla3 | ... | blablan
    ...

    Je parcours donc la première ligne du premier onglet, je vais chercher la ligne correspondante dans l'onglet 2 et je copie les celllules 10 à n pour les coller dans la ligne du premier onglet à l'endroit correspondant.
    J'espère que c'est plus clair.

    Voici 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
    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
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    Sub MAJ_CALCUL2()
        Dim num_ligne As Integer
        Dim val_A As String
        Dim val_B As String
        Dim val_C As String
        Dim val_D As String
        Dim val_E As String
        Dim val_F As String
        Dim val_G As String
        Dim val_H As String
        Dim val_I As String
        Dim groupe As String
        Dim donnees_a_copier As Range
        Worksheets(1).Activate
        Range("A2").Select 'selection pour mettre la cellule active au bon endroit
        num_ligne = ActiveCell.Row
        If Not ActiveCell.Value = "" And num_ligne = 2 Then 'si le fichier n'est pas vide
            Do Until ActiveCell.Value = "" 'Boucle tant qu'il y a des données
                'récupération des valeurs des colonnes utiles (A à I)
                val_A = ActiveCell.Value
                val_B = ActiveCell.Offset(0, 1).Value 'le offset décale d'un cran sur la droite
                val_C = ActiveCell.Offset(0, 2).Value
                val_D = ActiveCell.Offset(0, 3).Value
                val_E = ActiveCell.Offset(0, 4).Value
                val_F = ActiveCell.Offset(0, 5).Value
                val_G = ActiveCell.Offset(0, 6).Value
                val_H = ActiveCell.Offset(0, 7).Value
                val_I = ActiveCell.Offset(0, 8).Value
                groupe = val_A & val_B & val_C & val_D & val_E & val_F & val_G & val_H & val_I
                
                
                'appel à la fonction de récupération du calcul2
                donnees_a_copier = Recuperer_Valeur_Calcul2(groupe)
                
                'on réactive la feuille 1
                Worksheets(1).Activate
                
                'Copie_valeur_Calcul2()
                If donnees_a_copier <> Nothing Then
                    ActiveCell.Range("J1:AM1").Select = donnees_a_copier
                End If
                
                ActiveCell.Offset(1, 0).Select 'selection des données de la ligne suivante
            Loop
        End If
        
    End Sub
    
    Function Recuperer_Valeur_Calcul2(groupe)
        'on active la feuille 2
        Worksheets(2).Activate
        Range("A1").Select 'selection pour mettre la cellule active au bon endroit
        'Boucle pour connaitre le nombre de ligne du fichier
        Dim NbLigne As Integer
        Dim val_A2 As String
        Dim val_B2 As String
        Dim val_C2 As String
        Dim val_D2 As String
        Dim val_E2 As String
        Dim val_F2 As String
        Dim val_G2 As String
        Dim val_H2 As String
        Dim val_I2 As String
        Dim groupe2 As String
            Do While Not (IsEmpty(ActiveCell))
                NbLigne = NbLigne + 1
                ActiveCell.Offset(1, 0).Select
            Loop
    
    If NbLigne > 1 Then 'si le fichier comporte des données
        'On remet le curseur au bon endroit
        Range("A2").Select
            Do While (Not (IsEmpty(ActiveCell)) And groupe <> groupe2)
                val_A2 = ActiveCell.Value
                val_B2 = ActiveCell.Offset(0, 1).Value 'le offset décale d'un cran sur la droite
                val_C2 = ActiveCell.Offset(0, 2).Value
                val_D2 = ActiveCell.Offset(0, 3).Value
                val_E2 = ActiveCell.Offset(0, 4).Value
                val_F2 = ActiveCell.Offset(0, 5).Value
                val_G2 = ActiveCell.Offset(0, 6).Value
                val_H2 = ActiveCell.Offset(0, 7).Value
                val_I2 = ActiveCell.Offset(0, 8).Value
                groupe2 = val_A2 & val_B2 & val_C2 & val_D2 & val_E2 & val_F2 & val_G2 & val_H2 & val_I2
                
                If groupe = groupe2 Then
                    'copie des cellules du calcul2
                    ActiveCell.Range("J1:AM1").Select
                    Copie_Calcul2 = Selection.Copy
                End If
                
                ActiveCell.Offset(1, 0).Select
            Loop
    End If
        Recuperer_Valeur_Calcul2 = Copie_Calcul2
    End Function

    En fait ce qui me gène, c'est le format de la sélection de cellule "donnees_a_copier". C'est quoi comme format? J'ai essayé Range, Variant et autre mais ca ne convient pas.
    De même, je ne sais pas quoi mettre pour la condition au cas où la ligne correspondante n'ait pas été trouvée et donc qu'il n'y a rien dans la variable.

    Merci pour votre aide et j'espère que mon problème a été clairement exposé...
    Si vous voyez une méthode plus efficace, je suis aussi évidemment preneur!

    Cordialement,
    Sebicool

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2006
    Messages
    393
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2006
    Messages : 393
    Par défaut
    Il me semble :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Copie_Calcul2 = Selection.Copy
    ne retourne pas une plage ni une valeur contenue dans tes cellules.
    Il faut utiliser Selection.Paste pour récupérer ce qui a été copié, car cela revient à faire un "CTRL + C".
    Tu peux également faire : Selection.Copy Worksheets(1).ActiveCell.Offset(0,9)

    Sinon qq remarques :
    1/ tu n'avais pas besoin de 2 fonction pour faire la comparaison des 9ères cellules, mais juste de boucles imbriquées
    2/ les .Activate et .Select ralentissent l'éxécution, mais donne un effet visul à l'utilisateur
    3/ la 1ere ligne utilisée d'une feuille est :
    Worksheets(1).UsedRange.Row
    la dernière ligne utilisée est :
    Worksheets(1).UsedRange.Row + Worksheets(1).UsedRange.Rows.Count - 1
    Si la 1ere ligne est utilisée, les formules sont encore plus faciles puisqu'il suffit de remplacer Worksheets(1).UsedRange.Row par 1.
    Cela te fera gagner du temps sur tes boucles pour trouver la dernière ligne.
    4/ Ce que tu peux faire également pour gagner du temps, c'est qu'une fois que tu as trouvé la bonne ligne dans ton Do... Loop, c'est de faire un "Exit Do" juste avant le End If et le Loop

    Voila, mais je pense que ton code peut etre encore grandement simplifié...

    Bon courage

Discussions similaires

  1. [XL-2003] Macro VBA copie valeur cellule excel et colle dans doc word
    Par tony020422 dans le forum Macros et VBA Excel
    Réponses: 54
    Dernier message: 03/06/2009, 10h21
  2. Pb: copie du contenu d'un repertoire dans un autre
    Par kam81 dans le forum Langage
    Réponses: 2
    Dernier message: 09/06/2007, 13h10
  3. copier des cellules d'une feuille dans une autres sous condition
    Par olivertwist dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 16/05/2007, 11h42
  4. création dynamique d'onglets dans d'autres onglets
    Par chourmo dans le forum Delphi
    Réponses: 4
    Dernier message: 18/07/2006, 13h12
  5. Réponses: 3
    Dernier message: 13/06/2006, 17h36

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