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 :

Syntaxe pour la recopie de plages de cellules [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut Syntaxe pour la recopie de plages de cellules
    Bonjour,

    J'ai un petit problème d'autoentrepreneur à vous soumettre :
    - je ne gère pas la tva.
    - mes fournisseur me donnent leur tarifs en ht via des classeurs excel.
    - mon logiciel de gestion commerciale ne sait pas intégrer prix_client_sans_tva = prix_fournisseur*tva*coef : il gère tout (achat/vente) avec ou sans tva mais ne sais pas appliquer la tva sur les achats mais pas sur les ventes...

    Évidement les classeurs excel des prix fournisseurs comportent plusieurs feuilles avec des noms variants de l'un à l'autre.
    Évidement dans une feuille il y a des lignes blanches entre type de produits
    Évidement dans une colonne il y a parfois des données parasites ("PROMO", "FIN_DE_VIE", "ND" ) au lieu du prix ht par exemple.
    Mais heureusement, seul les trois premières colonnes des feuilles m'intéressent (référence, désignation, prix ht).

    Il me faut donc consolider les différentes feuilles d'un classeur donné pour :
    - obtenir une seule feuille avec tous les produits en liste.
    - manipuler les données, rajouter des colonnes.
    - exporter la feuille au format csv, séparateur point-virgule, sans guillemet délimitant les champs texte pour l'importer dans mon logiciel de gestion commerciale.

    Newbie après une journée à bucher j'obtiens ca, mais ca coince à la copie des cellules, comment je fait ?

    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
     
    Sub ouvrir()
     
    Dim Message, Title, Default, Fournisseur, FichierAOuvrir, FichierAEcrire, FichierCsv 'Strings
    Dim ligne_en_cours, Coef, feuille_en_cours, nbre_ligne, Nbr_Feuille, feuille_export 'Ints
     
     
    ' Demander nom du fournisseur en cours de traitement
    ' Définit le message.
    Message = "Nom du fournisseur à traiter"
    Title = "Fournisseur à traiter"    ' Définit le titre.
    Default = "FOUR1"    ' Définition la valeur par défaut.
    ' Affiche le message, le titre et la valeur par défaut.
    Fournisseur = InputBox(Message, Title, Default)
     
    ' Demander coef a appliquer
    ' Définit le message.
    Message = "Coefficent à appliquer"
    Title = "Coef"    ' Définit le titre.
    Default = "1.1"    ' Définition la valeur par défaut.
    ' Affiche le message, le titre et la valeur par défaut.
    Coef = InputBox(Message, Title, Default)
     
    ' Ouverture du fichier à traiter
    FichierAOuvrir = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    If FichierAOuvrir <> False Then
        Set mon_classeur1 = Workbooks.Open(FichierAOuvrir)
     
        ' Traitement feuille en cours
        Nbr_Feuille = Worksheets.Count
     
        ' Ajout d'une feuille qui sera exportée
        Sheets.Add After:=Sheets(Sheets.Count)
        feuille_export = Worksheets.Count
        'MsgBox Nbr_Feuille & " " & feuille_export
        Set FichierCsv = Worksheets(feuille_export)
     
     
        ' A partir de quelle feuille ?
        Message = "Traiter à partir de la feuille N° ?"
        Title = "Feuille"    ' Définit le titre.
        Default = "3"    ' Définition la valeur par défaut.
     
        ' Boucle de traitement des feuilles du classeur
        For feuille_en_cours = InputBox(Message, Title, Default) To Nbr_Feuille
     
            ' Traitement ligne par ligne
            For ligne_en_cours = 1 To Rows.Count
     
                ' Traitement ligne_en_cours, colonne 3
     
                ' Si ce n'est pas une ligne blanche intercalaire
                If Not IsNull(ActiveSheet.Cells(ligne_en_cours, 3)) Then
                    ' Si la colonne C est numérique
                    If IsNumeric(ActiveSheet.Cells(ligne_en_cours, 3)) Then
                        MsgBox "feuille_en_cours : " & feuille_en_cours
                        MsgBox "ligne_en_cours : " & ligne_en_cours
                        ' Copie des colonnes 1 à 3 dans la nouvelle feuille
     
                        Worksheets(feuille_en_cours).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3)).Copy _
                        Destination:=Worksheets(feuille_export).Range(Cells(ligne_en_cours, 1))
     
                    End If
                End If
     
            Next
        Next
     
    End If
    End Sub
    Ca coince à : ' Copie des colonnes 1 à 3 dans la nouvelle feuille : Erreur 1004 Erreur définie par l'application ou par l'objet.

    Merki !

  2. #2
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Attention, la fonction Cells fait référence à la feuille active si elle est employée directement comme dans l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets(feuille_en_cours).Range(Cells(ligne_en_cours, 1), Cells(ligne_en_cours, 3)).Copy _
                        Destination:=Worksheets(feuille_export).Range(Cells(ligne_en_cours, 1))
    La syntaxe suivante est plus claire et plus sure :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Worksheets(feuille_en_cours).Range("A" & ligne_en_cours & ":C" & ligne_en_cours).Copy _
                        Destination:=Worksheets(feuille_export).Range("A" & ligne_en_cours)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut Arf !
    Bon,

    Merci tedo01,

    J'ai corrigé la boucle de copie des cellules par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Worksheets(feuille_en_cours).Range("A" & ligne_en_cours & ":C" & ligne_en_cours).Copy _
                        Destination:=Worksheets(feuille_export).Range("A" & ligne_en_cours)
    Et ca fonctionne nettement mieux.

    Par contre j'ai TOUTES la feuille qui se recopie, les lignes blanches y comprises, les lignes avec des valeurs non numériques aussi ....

    Mes deux If imbriqués ne fonctionnent pas. ?:

    Question :
    Comment faire pour que les lignes blanches ne soient pas recopiées ?
    Comment faire pour que les lignes contenant des valeurs non numériques en C3 ne soient pas recopiées ?

    De plus la boucle
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            For ligne_en_cours = 1 To Rows.Count
    Ne se termine jamais ... Je la change pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
            For ligne_en_cours = 1 To 400
    Merci

  4. #4
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour (ou plutôt bonne nuit ),

    En n'ayant qu'un compteur de ligne à la fois source et destination, les lignes vides ne peuvent pas être éliminées (chaque ligne de la source est copiée à la même position dans la destination). Il faut donc créer une variable ligne_dest, qui ne s'incrémente que lorsque la condition est remplie.

    Dans les version récentes d'Excel, Rows.Count vaut toujours 1048576, qui est le nombre maximum de lignes d'une feuille Excel. Le nombre de lignes dans la feuille est plutôt donnée par la méthode UsedRange de l'objet Worksheet. La bonne syntaxe serait plutôt (si les données commencent en ligne 1) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For ligne_en_cours = 1 To Worksheets(feuille_en_cours).UsedRange.Rows
    Enfin, les deux If ont l'air correct, mais ils testent l'objet ActiveSheet qui n'est pas forcément la bonne feuille. Il faudrait plutôt référencer explicitement la feuille traitée :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ...
                If Not IsNull(Worksheets(feuille_en_cours).Cells(ligne_en_cours, 3)) Then
                    ' Si la colonne C est numérique
                    If IsNumeric(Worksheets(feuille_en_cours).Cells(ligne_en_cours, 3)) Then
    ...
    A+...

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mars 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Âge : 59
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2011
    Messages : 7
    Par défaut Bon, ...
    Ah oui je comprend qu'il me faut une boucle dans une boucle sinon en reprenant à 1 en changeant de feuille on écrase les données que l'on vient de copier.

    Sinon je ne comprend pas pourquoi j'ai une erreur de type avec le FOR
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For ligne_en_cours = 1 To Worksheets(feuille_en_cours).UsedRange.Rows
    Et les IF semblent ne pas fonctionner car je recopie tjrs ligne blanche et non numériques ???

    Moi qui croyait terminer ce petit prog rapidement ...

  6. #6
    Membre Expert
    Femme Profil pro
    Data engineer
    Inscrit en
    Juin 2007
    Messages
    673
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Data engineer
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2007
    Messages : 673
    Par défaut
    Bonjour,
    Toutes mes excuses, la ligne était incomplète pour le For, il fallait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    For ligne_en_cours = 1 To Worksheets(feuille_en_cours).UsedRange.Rows.Count
    Pour l'élimination des lignes vides, il faut un mécanisme avec 2 compteurs différents, un pour les lignes de départ et un pour les lignes d'arrivée. Exemple :
    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
    Dim ligne_en_cours_src As Long
    Dim ligne_en_cours_dest As Long
    (...)
     ' Traitement ligne par ligne de la source
            ligne_en_cours_dest = 0
            For ligne_en_cours_src = 1 To Worksheets(feuille_en_cours).UsedRange.Rows.Count
     
                ' Traitement ligne_en_cours_src, colonne 3
     
                ' Si ce n'est pas une ligne blanche intercalaire
                If Not IsNull(ActiveSheet.Cells(ligne_en_cours_src, 3)) Then
                    ' Si la colonne C est numérique
                    If IsNumeric(ActiveSheet.Cells(ligne_en_cours_src, 3)) Then
                        'On avance d'une ligne dans la destination
                        ligne_en_cours_dest = ligne_en_cours_dest +1
                        MsgBox "feuille_en_cours : " & feuille_en_cours
                        MsgBox "ligne_en_cours_src : " & ligne_en_cours_src
                        MsgBox "ligne_en_cours_dest : " & ligne_en_cours_dest
                        ' Copie des colonnes 1 à 3 dans la nouvelle feuille
     
                        Worksheets(feuille_en_cours).Range(Cells(ligne_en_cours_src, 1), Cells(ligne_en_cours_src, 3)).Copy _
                        Destination:=Worksheets(feuille_export).Range(Cells(ligne_en_cours_dest, 1))
     
                    End If
                End If
     
            Next

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

Discussions similaires

  1. Macro pour recherche valeur dans plage de cellules sur 2 colonnes.
    Par bipol51430 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/05/2014, 10h43
  2. [XL-2010] Pb pour copier coller une plage de cellule variable
    Par eglantine217 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 08/05/2012, 12h10
  3. Syntaxe pour changer la police de la cellule
    Par Benjycool dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 21/01/2009, 09h20
  4. Userform pour sélection d'une plage de cellule
    Par humbp dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 07/01/2008, 12h41
  5. Modification d'une fonction pour selectionner une plage de cellule
    Par jackbauer972 dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/08/2007, 15h07

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