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

Excel Discussion :

sélection des cellules non vides et copier/collage spécial dans une plage de données multiples


Sujet :

Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut sélection des cellules non vides et copier/collage spécial dans une plage de données multiples
    Bonjour,

    N'étant pas un expert d'Excel, encore moins des macros, je suis devant une problématique...

    J'ai un classeur excel (A) où chaque colonne représente une date, et deux plages de cellules (C7:EB12,C37:EB42) où les données sont importées d'un autre classeur excel (B).
    Le classeur excel B est mis à jour quotidiennement, et les données de la veille sont écrasées par celles du jour.
    J'ai créé une macro très simple consistant à ouvrir ces deux classeurs afin que les données soit mises à jour dans le classeur A. Cependant les données de la veille sont écrasées et remplacées par les données du jour.
    J'aimerai donc créer une macro consistant à me sélectionner toutes les cellules non vides dans la plage de donnée C7:EB12,C37:EB42 du classeur A et de copier/collage spécial valeur ces cellules, afin qu'elles soient figées dans le temps, mais de pas modifier les cellules vides (contenant des formules qui doivent être préservées).

    Quelqu'un pourrait-il me dire comment faire cette macro?

    Merci pour votre aide!

  2. #2
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Bonjour,

    Essaie (non testé) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub Copie()
        Dim C As Range, Plage As Range
        With Workbooks("ClasseurA").Sheets(1)
            Set Plage = Union(.[C7:EB:12], .[C37:EB42])
        End With
        With Workbooks("ClasseurB").Sheets(1)
            For Each C In Plage
                If C.Value <> "" And .Range(C.Row, C.Column).HasFormula = False Then
                    .Range(C.Row, C.Column).Value = C.Value
                End If
            Next C
        End With
    End Sub

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci beaucoup pour ta réponse. C'est super! J'ai pu entrer le code que tu m'as donné, j'ai dû modifier quelques éléments pour que le code puisse s'appliquer à mes fichiers, mais je suis bloqué à un moment donné. J'ai cette erreur que je n'arrive pas à résoudre:

    Erreur d'éxécution '1004' : erreur définie par l'application ou par l'objet

    Cette erreur se situe au niveau de la ligne du code en gras et rouge


    Sub Copie()

    ChDir "Z:\"

    Workbooks.Open Filename:= _

    "Z:\LDP\Suivi qualité LDP\Impromptu\repporting_tbo_do_sud.xls"

    ChDir "Z:\"

    Workbooks.Open Filename:= _

    "Z:\LDP\Suivi qualité LDP\TRADIQUAL.xls"

    Windows("TRADIQUAL.xls").Activate

    Dim C As Range, Plage As Range

    With Workbooks("TRADIQUAL.xls").Sheets("Journalier")

    Set Plage = [C7:EB12]

    For Each C In Plage

    If C.Value <> "" And .Range(C.Row, C.Column).HasFormula = False Then

    .Range(C.Row, C.Column).Value = C.Value

    End If

    Next C

    End With

    End Sub

  4. #4
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Le problème vient de :

    Tel quel, C7:EB12 se réfère à la feuille active. Si le classeur soource est "repporting_tbo_do_sud.xls", il faut mettre :

    préciser le nom du classseur et celui de la feuille; par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set Plage = Workbooks("ClasseurA").Sheets("Feuil1").[C7:EB12]

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Non, le fichier en question est le fichier "TRADIQUAL.xls" et la feuille et "Journalier".


    Concrètement, ce code doit me permettre de copier/coller (valeur) toutes les cellules non vides sur les plages de données C7:EB12 et C37:EB42 dans la feuille "Journalier" du fichier "TRADIQUAL.xls"

    Le fichier "repporting_tbo_do_sud.xls" est en fait un fichier issu d'un logiciel à partir duquel les données sont importées, je ne pense pas que la macro en question soit liée à ce fichier…


    Sub Copie()

    ChDir "Z:\"

    Workbooks.Open Filename:= _

    "Z:\LDP\Suivi qualité LDP\Impromptu\repporting_tbo_do_sud.xls"

    ChDir "Z:\"

    Workbooks.Open Filename:= _

    "Z:\LDP\Suivi qualité LDP\TRADIQUAL.xls"

    Windows("TRADIQUAL.xls").Activate

    Dim C As Range, Plage As Range

    With Workbooks("TRADIQUAL.xls").Sheets("Journalier")

    Set Plage = [C7:EB12]

    For Each C In Plage

    If C.Value <> "" And .Range(C).HasFormula = False Then

    .Range(C.Row, C.Column).Value = C.Value

    End If

    Next C

    End With

    End Sub

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Merci pour ton aide !!!

  7. #7
    Expert éminent sénior
    Homme Profil pro
    aucune
    Inscrit en
    Septembre 2011
    Messages
    8 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Septembre 2011
    Messages : 8 208
    Points : 14 363
    Points
    14 363
    Par défaut
    Mets (note le "." avant "[") :


  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Hélas ça n'arrange pas les choses... Ce qui est embêtant c'est que je n'arrive pas à interpréter les erreurs que me remonte la macro!

    Avec ce code :

    Sub Copie()
    ChDir "Z:\"
    Workbooks.Open Filename:= _
    "Z:\LDP\Suivi qualité LDP\Impromptu\repporting_tbo_do_sud.xls"
    ChDir "Z:\"
    Workbooks.Open Filename:= _
    "Z:\LDP\Suivi qualité LDP\TRADIQUAL.xls"
    Windows("TRADIQUAL.xls").Activate
    Dim C As Range, Plage As Range
    With Workbooks("TRADIQUAL.xls").Sheets("Journalier")
    Set Plage = .[C7:EB12]
    For Each C In Plage
    If C.Value <> "" And .Range(C.Row, C.Column).HasFormula = False Then
    .Range(C.Row, C.Column).Value = C.Value

    End If
    Next C
    End With
    End Sub

    La macro me remonte l'erreur sur la ligne en gras: Erreur d'éxécution '1004' : erreur définie par l'application ou par l'objet

    En modifiant cette ligne "à ma sauce":

    If C.Value Is Empty And C.HasFormula = False Then
    .Range(C.Row, C.Column).Value = C.Value


    Erreur d'éxécution '424': objet requis

    Je ne sais pas si cela peut faire avancer le raisonnement...
    En tout cas la macro ne me remonte pas d'erreurs en amont de cette ligne...

  9. #9
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 990
    Points : 29 035
    Points
    29 035
    Billets dans le blog
    53
    Par défaut
    Bonjour;
    L'erreur que tu as provient de l'objet Range qui n'est pas une bonne syntaxe. Il faut le remplacer par Cells
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
        For Each C In Plage
          If C.Value <> "" And .Cells(C.Row, C.Column).HasFormula = False Then
          .Cells(C.Row, C.Column).Value = C.Value
          End If
        Next C
    Je n'ai pas vérifié si le reste fonctionne

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    C'est exactement ça!
    Tout marche parfaitement bien!

    Merci beaucoup de votre aide à tous les deux, vous êtes des champions!

    Sujet résolu

  11. #11
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 990
    Points : 29 035
    Points
    29 035
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Je n'ai pas regardé toute la discussion mais il me semble que l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If C.Value <> "" And C.HasFormula = False Then
    est plus courte et apporte le même résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If C.Value <> "" And .Cells(C.row, C.Column).HasFormula = False Then

  12. #12
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    Tout à fait, cela fonctionne également et épure un peu plus le code!

    Merci encore

  13. #13
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 990
    Points : 29 035
    Points
    29 035
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Et après réflexion, je ne comprends pas bien cette instruction qui si je la traduis.
    Si la cellule n'est pas vide (C.Value <> "" ) et (And) que ce n'est pas une formule (C.HasFormula = False) alors (Then) la cellule est une valeur (.Cells(C.row, C.Column).Value = C.Value) que tu peux aussi réduire par C.Value = C.Value
    et donc, je ne comprends pas parce-que si c'est une valeur, il n'y a pas de raison d'avoir cette instruction.
    N'est-ce pas plutôt Si c'est une formule alors converti la par sa valeur ?
    Soit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If C.HasFormula Then C.Value = C.Value

  14. #14
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    En réalité, j'ai modifié le "False" en "True".
    En effet, le cheminement est:

    "si la cellule n'est pas vide, et que c'est une formule, alors la cellule est une valeur"

    Toutes mes cellules comportant des formules, le but est de fixer les cellules avec des valeurs afin de ne pas compromettre mes données à chaque actualisation

  15. #15
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 990
    Points : 29 035
    Points
    29 035
    Billets dans le blog
    53
    Par défaut
    Bonsoir,
    Donc cette ligne est suffisante
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If C.HasFormula Then C.Value = C.Value
    Inutile de tester si la cellule n'est pas vide, parce-que si elle contient une formule elle est forcément remplie et le TRUE est implicite dans If C.HasFormula Then

    C'est la même chose avec les formules Excel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(C2;"différent de 0";"valeur nulle")
    donne le même résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(C2<>0;"différent de 0";"valeur null")
    De même si on teste l'existence caractères
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NBCAR(C2)<>0;"au moins un caractère";"cellule vide")
    Donnera le même résultat que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SI(NBCAR(C2);"au moins un caractère";"cellule vide")

  16. #16
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    J'ai tester ma macro avec la ligne:

    If C.HasFormula Then C.Value = C.Value

    Cependant, toutes mes cellules, mêmes "vides" (c'est à dire celles qui n'ont pas été mises à jour car la donnée recherchée est inexistante) ont été écrasées: les formules ont disparus et rien à la place...

  17. #17
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 990
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 12 990
    Points : 29 035
    Points
    29 035
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Voici un test rapide que j'ai effectué sur la plage A2:C4 de la feuille nommée Feuil1
    Dans la colonne C, les lignes 2 et 4 avec comme formule =A2*B2 et la cellule C3 était vide
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub test()
      Dim C As Range, Plage As Range
      With ThisWorkbook.Sheets("Feuil1")
        Set Plage = .[A2:C4]
        For Each C In Plage
          If C.HasFormula Then C.Value = C.Value
        Next C
      End With
    End Sub
    Après avoir fait tourner la procédure ci-dessus les cellules C2 et C4 avaient bien la valeur du résultat de la formule en lieu et place de celle-ci. La cellule C3 était toujours vide et la plage A2:B4 contenait bien les valeurs initiales.

  18. #18
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2014
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vaucluse (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Transports

    Informations forums :
    Inscription : Février 2014
    Messages : 10
    Points : 3
    Points
    3
    Par défaut
    J'ai essayé votre code dans un nouveau classeur. Mais dans ce cas là, la formule (A3*B3) dans la cellule C3 a disparu.

    J'ai peut être oublié de spécifier mes formules de bases dans mes cellules:

    =SI(C5=[repporting_tbo_do_sud.xls]Liste_1!$A$2;RECHERCHEV("JLRG";[repporting_tbo_do_sud.xls]Liste_1!$C$1:$BW$60;7;FAUX);"")

    Ce qui signifie que je demande à ce qu'il n'y ai rien dans la case (au lieu de 0 ou #VAL) si la donnée est introuvable (exclusivement esthétique vis à vis du tableau).

    De toutes façons, il me faut préserver les formules des cellules où les valeurs n'ont pas été trouvées afin qu'elles soient mises à jour ultérieurement.

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

Discussions similaires

  1. [XL-2013] Copier uniquement des cellules non vides sur un autre classeur
    Par tonyfrost dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 20/06/2014, 23h54
  2. [OpenOffice][Tableur] Comment compter des cellules non vides
    Par BizutAccess dans le forum OpenOffice & LibreOffice
    Réponses: 2
    Dernier message: 14/02/2012, 10h18
  3. [XL-2002] Concatener des cellules non vides pour faire liste d'envoi mail
    Par tchoutchou69 dans le forum Macros et VBA Excel
    Réponses: 10
    Dernier message: 25/11/2011, 11h38
  4. [XL-2003] action sur des cellules non vides
    Par bosk1000 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 25/05/2009, 16h33
  5. Somme des cellules non vides en VBA
    Par baldg dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 26/03/2008, 01h44

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