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 :

Recopiage d'une feuille à une autre


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut Recopiage d'une feuille à une autre
    Bonjour,

    Je suis en train de faire un programme personnel VBA Excel. J’ai quelques soucis. Cela consiste à faire une copie (partielle) de la feuille ‘Parcours’ (contenant un tableau de 1800 lignes) à la feuille ‘M2’.
    Les colonnes discriminantes de la feuille ‘Parcours’ sont la colonne G (dans laquelle est marqué M2) et la colonne H (dans laquelle sont marqués par exemple 3A Ext ou 3A DD, 3A STD, etc., et correspondant à autant de ‘Checkbox’ situées sur la UserForm1). Les codes de chaque Checkbox (il y en a 8) se ressemblent et consistent en le même algorithme.
    Je concatène les colonnes K à O et U à Y de la feuille ‘Parcours’ pour les copier respectivement dans les colonnes F et L de la feuille ‘M2’.

    J’ai plusieurs soucis, les deux derniers étant les plus importants :
    -La concaténation a l’air de fonctionner, mais quand je change les bornes de Row (ici mises de 396 à 1461, ceci correspondant à la plage des lignes où est écrit ‘M2’ dans la colonne G de la feuille ‘Parcours’), la concaténation fonctionne mais concatène des valeurs qui deviennent fausses : à partir de la ligne 407 de la feuille ‘Parcours’, une valeur différente apparaît dans la colonne M, alors que la valeur pour la colonne K était un sigle de 4 lettres (pour les lignes 396 à 406). Je n’arrive pas à comprendre mon erreur.
    -Si je change les ‘bornes’ de la variable Row, par exemple de 407 à 582, le compilateur me dit que les lignes de code correspondant à la concaténation présentent une erreur (13, incompatibilité de type), alors que pour les anciennes ‘bornes’ cela semble fonctionner quand même.
    -Autre chose : je désire en fait qu’Excel trouve les ‘bornes’ tout seul, sans avoir à les noter moi-même. Je ne désire pas noter ‘407 à 582’ ou '396 à 1461' dans la boucle Do, mais qu’Excel renvoie des numéros de lignes pour la variable Row : ces numéros doivent correspondre aux lignes de la feuille ‘Parcours’ où certaines cellules seulement (comprises entre 396 et 1461) contiennent ‘3A Ext’. J’ai bien essayé de mettre Row = Worksheets("Parcours").Columns(8).Cells.Find("3A Ext").Row , mais ça ne marche pas.
    -Je voudrais aussi que dans la boucle For…Next (destinée à la copie) les bornes correspondent non pas à des chiffres arbitraires (ici de 10 à 1075), mais plutôt aux lignes restées vides et libres de la feuille ‘M2’ : ces lignes commencent à partir de 10 seulement. Les lignes à recopier de la feuille ‘Parcours’ sont en nombre variable pour chaque Checkbox (la première Checkbox se rapporte à 3A Ext, et la seconde à 3A DD) : je ne sais pas par avance quelles sont les bornes de For…Next. De plus, je ne suis pas tout à fait sûr de l’utilisation de cette boucle : ne faut-il pas plutôt faire comme avec la variable Row ? En tout cas (voir premier souci), cette boucle semble devoir être utilisée.

    NB : le fichier est initialement de l'Excel 2010, mais je l'ai converti en fichier 2003 (.xls).
    Cela fait plusieurs semaines que je suis sur ce fichier, et j'ai essayé bcp de choses, et travaillé beaucoup. Maintenant je sèche.

    Merci beaucoup pour votre aide.
    Cordialement, PixelX.

    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
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
     
    Private Sub TransferButton_Click()
     
    Dim ConcatenationPremAnnee As String
    Dim ConcatenationSecAnnee As String
    Dim Row As Long
    Dim RowM2 As Long
    'Dim compteur As Single
    'Dim progression As Integer
    Dim c As Range
    Dim cExt As Range
    Dim cDD As Range
    Dim Info As String
     
    Application.ScreenUpdating = True
    UserForm1.Height = 210
    Label1.Visible = False
    'compteur = 0
    'progression = 0
     
    'Gestion des cellules contenant "3A Ext" et se rapportant à "M2"
    If CheckBox1.Value = -1 Then
    For Each c In Worksheets("Parcours").Columns(7).Cells.Find("M2")
        For Each cExt In Worksheets("Parcours").Columns(8).Cells.Find("3A Ext")
        Do
                Row = 396
                'Chaînes des colonnes K-O et U-Y concaténées
                With ThisWorkbook.Worksheets("Parcours")
                ConcatenationPremAnnee = .Cells(Row, 11) + .Cells(Row, 12) + .Cells(Row, 13) + .Cells(Row, 14) + .Cells(Row, 15)
                ConcatenationSecAnnee = .Cells(Row, 21) + .Cells(Row, 22) + .Cells(Row, 23) + .Cells(Row, 24) + .Cells(Row, 25)
                End With
                For RowMI2 = 10 To 1075
                'Transfert des données de la feuille Parcours à la feuille MI2
                Worksheets("M2").Cells(RowM2, 1) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 1)
                Worksheets("M2").Cells(RowM2, 2) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 2)
                Worksheets("M2").Cells(RowM2, 3) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 3)
                Worksheets("M2").Cells(RowM2, 4) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 4)
                Worksheets("M2").Cells(RowM2, "E").Value = "S9"
                Worksheets("M2").Cells(RowM2, "F") = ConcatenationPremAnnee
                Worksheets("M2").Cells(RowM2, "K").Value = "S10"
                Worksheets("M2").Cells(RowM2, "L") = ConcatenationSecAnnee
     
                'Incrémentation du numéro de ligne de la feuille Parcours
                Row = Row + 1
     
                Next RowM2
            Loop Until Row = 1461
     
        NbExt = Worksheets("Parcours").Columns(8).Cells.Find("3A Ext").Count
     
        Next cExt
    Next c
    End If
     
    'Gestion des cellules contenant "3A DD" et se rapportant à "M2"
    If CheckBox2.Value = -1 Then
        For Each cDD In Worksheets("Parcours").Columns(8).Cells.Find("3A DD")
        Do
                Row = 396
                'Chaînes des colonnes K-O et U-Y concaténées
                With ThisWorkbook.Worksheets("Parcours")
                ConcatenationPremAnnee = .Cells(Row, 11) + .Cells(Row, 12) + .Cells(Row, 13) + .Cells(Row, 14) + .Cells(Row, 15)
                ConcatenationSecAnnee = .Cells(Row, 21) + .Cells(Row, 22) + .Cells(Row, 23) + .Cells(Row, 24) + .Cells(Row, 25)
                End With
                For RowM2 = 10 To 1075
                'Transfert des données de la feuille Parcours à la feuille MI2
                Worksheets("M2").Cells(RowM2, 1) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 1)
                Worksheets("M2").Cells(RowM2, 2) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 2)
                Worksheets("M2").Cells(RowM2, 3) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 3)
                Worksheets("M2").Cells(RowM2, 4) = ThisWorkbook.Worksheets("Parcours").Cells(Row, 4)
                Worksheets("M2").Cells(RowM2, "E").Value = "S9"
                Worksheets("M2").Cells(RowM2, "F") = ConcatenationPremAnnee
                Worksheets("M2").Cells(RowM2, "K").Value = "S10"
                Worksheets("M2").Cells(RowM2, "L") = ConcatenationSecAnnee
     
                'Incrémentation du numéro de ligne de la feuille Parcours
                Row = Row + 1
     
                Next RowM2
            Loop Until Row = 1461
     
        NbDD = Worksheets("Parcours").Columns(8).Cells.Find("3A DD").Rows.Count
     
        Next cDD
    End If
     
    'Obtention d'un message si aucune case n'est cochée
    If CheckBox1.Value = 0 And CheckBox2.Value = 0 And CheckBox3.Value = 0 And CheckBox4.Value = 0 And CheckBox5.Value = 0 And CheckBox6.Value = 0 And CheckBox7.Value = 0 And CheckBox8.Value = 0 Then
        Info = MsgBox("Veuillez cocher au moins une case", vbInformation + vbOKOnly, "Information")
    End If
     
    'Centieme = NbTotal / 100
    'Millieme = NbTotal / 1000
     
    'Code de la barre de progression
    'compteur = compteur + Millieme
     
    'If compteur Mod Centieme = 0 Then     'Condition exécutée 100 fois
        'progression = progression + 1
        'Image_barre.Width = progression * 1.5
        'Label_barre.Caption = progression & " %"
        'DoEvents
    'End If
     
    'Application.ScreenUpdating = True
    Label1.Visible = True
     
    End Sub

  2. #2
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 478
    Par défaut
    Bonjour,

    Row est un mot réservé du langage VBA, tu ne dois pas l'employer comme variable, cela risque de créer des ambiguïtés de commandes.

    Patrice

  3. #3
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour la réponse. J'ai changé Row en RowP, mais les problèmes sont encore présents.
    Je n'arrête pas de me creuser la tête, depuis plusieurs semaines, mais je sèche.
    Merci pour votre aide et vos propositions.

    Cordialement,

    PixelX

    La résolution d'un tel problème devrait intéresser les gens, alors pourquoi presque pas de réponse ?
    Help, please.

    Peut-être ai-je donné des explications pas claires.

    PixelX.

  4. #4
    Expert éminent


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Par défaut
    Bonsoir,

    je crois qu'avant d'essayer de debugger ton code tu devrais revoir ton algorithme.. ...

    est tu sur d'avoir besoin de toutes ces boucles imbriquées ...

    For Each / do ... loop / For ..Next... ???


    Cdt.

  5. #5
    Candidat au Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

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

    Informations forums :
    Inscription : Août 2012
    Messages : 3
    Par défaut
    Bonjour,

    Merci pour le message.

    J'ai mis des boucles For Each...Next afin de réaliser la sélection de numéros de lignes pour la variable RowP (notée Row au début). Il faut tenir compte de 2 colonnes, F et G, de la feuille 'Parcours' : je souhaite ainsi renvoyer, pour la variable RowP, les numéros de lignes correspondant aux cellules où est écrit 'M2' dans la colonne F (N°7) (de la ligne 396 à la ligne 1461, c'est-à-dire 1075 lignes), et parmi ces lignes ne retenir que celles correspondant aux cellules de la colonne G (N°8) où est écrit '3A Ext'. Cela évite de mettre des 'bornes' arbitraires à la boucle Do...Loop.
    Je désire, après une concaténation de cellules contigües (de K à O et de U à Y), où sur une seule cellule est marqué quelque chose (par exemple seulement dans K396 et pas dans L396, M396, N396 et O396), recopier le résultat dans les lignes laissées vides de la feuille 'M2' (à partir de la ligne 10 seulement) : je ne connais pas par avance le nombre de lignes à recopier (peut-être 100 pour la donnée '3A Ext'), qui de plus varie selon les Checkbox, chacune faisant référence à des données différentes (la 2e Checkbox se réfère à '3A DD' de la colonne G de la feuille 'Parcours').

    De plus, si je change les 'bornes' de la boucle Do...Loop, par ex. de 407 à 582, correspondant aux lignes pour lesquelles les cellules de la colonne G contiennent '3A Ext', la concaténation ne marche pas : je recopie la même donnée dans les colonnes F et L de la feuille 'M2', du début jusque la fin, alors que la donnée varie sur la feuille 'Parcours'.
    La boucle For...Next est utilisée pour le recopiage dans la feuille 'M2' : elle contient l'incrémentation de la variable RowP, et doit permettre de faire le recopiage, mais comme évoqué, je désire recopier dans des lignes vides, au fur et à mesure, sans connaître par avance le nb de lignes à recopier. Sinon, je n'ai pas d'autre idée. Mais j'ai testé, ça marche, il y a bien une recopie, sauf pour le problème relatif à la concaténation.

    Voilà comment je procède, mais si vous pensez que mon algorithme n'est pas bon, donnez-moi SVP des propositions.

    Merci pour votre aide.
    J'espère avoir été plus clair qu'au début, et si vous avez des question, n'hésitez pas.

    Cordialement,

    PixelX.

Discussions similaires

  1. [VBA-E]Trouver et recopier des cellules d'une feuille à une autre
    Par sk8bcn dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 24/08/2006, 17h01
  2. [VBA-E] Probleme COPY PASTE d'une feuille à une autre
    Par AliochaBada dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/07/2006, 18h56
  3. [VBA_E]:copier des lignes d'une feuille à une autre
    Par VBBBA dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 15/06/2006, 17h42
  4. [VBA-E]Copier un lien hypertexte d'une feuille à une autre
    Par DomBourti dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 28/04/2006, 18h01
  5. [VBA] Transmettre des données d'une feuille à l'autre
    Par Overflow64 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 20/12/2005, 10h58

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